diff --git a/Design - Backend.md b/Design - Backend.md index 9d195def9a4e3b16661f778c08d2b0e23e2954ee..05aa26c26961cd288694121b65a68d118133dd3c 100644 --- a/Design - Backend.md +++ b/Design - Backend.md @@ -64,9 +64,12 @@ 循环执行,被直接吃掉的棋子的死亡广播会播放到死亡监视器并调用所有棋子注册的死亡监视 HOOK,以便执行联动操作,原则上,棋子的死亡回调中只应该监视自己的死亡消息并触发被动,但是不排除会有监视其他棋子的。当消息队列为空时转到下一个阶段。 +注意处理 trap + ##### 3.3.4 技能执行阶段 调用所有棋子注册的被动执行器,例如雇佣兵的,工厂的 +注意,兵的升变也在这里进行 ##### 3.3.5 状态更新阶段 diff --git a/classDiagram.md b/classDiagram.md new file mode 100644 index 0000000000000000000000000000000000000000..6a56b542c6bde06010af8694a43587a33eceab89 --- /dev/null +++ b/classDiagram.md @@ -0,0 +1,89 @@ +# Class Diagram +## Basic +```mermaid +classDiagram +class NARPos{ + x int + y int + z int + nextInX() NARPos + nextInY() NARPos + nextInZ() NARPos +} +class Hook{ + owner Any + handler(args dict) Any +} +class Msg{ + type string + sender Any + args dict +} +class MsgQueue{ + msgs list[Msg] + push(msg Msg) + peek(msg Msg) + get(msg Msg) + remove(msg Msg) + clear(msg Msg) +} +class HookCenter{ + hooks list[Hook] + msgs MsgQueue + register(target Hook) + unregister(target Hook) + filter(owner Any) +} +note for Cell "onMove将在落子时调用\n用于向死亡消息队列\n发送死亡消息" +note for Cell "onConfirm是在移动质询时会调用的" +class Cell{ + pos NARPos + chess AbstractChess + onMove Hook + onConfirm Hook + register() void +} +note for AbstractChess "onDeath 是死亡通知\n不只是该棋子的\n onMove if needed" +note for AbstractChess "onCanExecute 被动执行器" +class AbstractChess{ + name string + pos Cell + onDeath Hook + onConfirm Hook + onCanExecute Hook + register() void + moveRange() list[Cell] + canMoveTo(c Cell) bool +} +``` +## Board +```mermaid +classDiagram +class Board{ + board dict + +} +``` +哎呀不画了,反着就是拆成两个棋盘 + +前端对接的时候写个转接口就行了 +## Chess +```mermaid +classDiagram +class AbstractChess{ + name string + pos Cell + onDeath Hook + onConfirm Hook + onCanExecute Hook + owner Player + register() void + moveRange() list[Cell] + canMoveTo(c:Cell) bool +} +class Pond{ + +} +AbstractChess<|--Pond +``` +棋子移动范围由每个棋子计算,@staticmethod \ No newline at end of file diff --git a/core/Board.py b/core/Board.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..41e547db84c3e5708c711e3b79d064fd51116f90 100644 --- a/core/Board.py +++ b/core/Board.py @@ -0,0 +1,37 @@ +class Pos: + def __init__(self,bw:bool,x:int,y:int) -> None: + self.bw=bw + self.x=x + self.y=y + def left(self,det=1): + return Pos(self.x-det) + def right(self,det=1): + return Pos(self.x+det) + def up(self,det=1): + return Pos(self.x-det,self.y+det*2) + def down(self,det=1): + return Pos(self.x+det,self.y-det*2) + def from_nar(): + pass + def from_xy(): + pass + def to_nar(): + pass + def from_xy(): + pass + def real_left(): + pass + def real_right(): + pass + def real_up(): + pass + def real_down(): + pass + +class Cell: + def __init__(self) -> None: + pass + +class Board: + def __init__(self) -> None: + pass diff --git a/core/Chess/AbstractChess.py b/core/Chess/AbstractChess.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/core/Chess/Bishop.py b/core/Chess/Bishop.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/core/Chess/Pond.py b/core/Chess/Pond.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/core/GameState.py b/core/GameState.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/core/Hook.py b/core/Hook.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c3777cd53a73e2517d4a7bfbeb724287d7799544 100644 --- a/core/Hook.py +++ b/core/Hook.py @@ -0,0 +1,50 @@ +from typing import Any +import queue + +class Hook: + def __init__(self,owner:Any,handler:function) -> None: + self.owner=owner + self.handler=handler + def call(self,args:dict): + self.handler(args) + +class Msg: + def __init__(self,sender:Any,txt:str,arg:dict) -> None: + self.sender=sender + self.type=txt + self.arg=arg + +class HookMan: + def __init__(self) -> None: + self.hooks:list[Hook]=[] + self.msgq=queue.Queue() + def register(self,target:Hook): + self.hooks.append(target) + def unregister(self,target:Hook): + if self.hooks.count(target)>0: + self.hooks.remove(target) + def remove(self,muli:list[Hook]): + for i in muli: + self.unregister(i) + def postmsg(self,msg:Msg): + self.msgq.put_nowait(msg) + def peekmsg(self): + return self.msgq.get_nowait() + def filter(self,owner:Any): + res:list[Hook]=[] + for i in self.hooks: + if i.owner==owner: + res.append(i) + return res + def call(self,arg:dict): + for i in self.hooks: + i.call(args=arg) + def boardcast(self,msg:Msg): + for i in self.hooks: + i.call({'msg':msg}) + def deal_msg(self): + if self.msgq.empty(): + return False + while self.msgq.empty()==False: + self.boardcast(self.peekmsg()) + return True \ No newline at end of file diff --git a/core/HookMan.py b/core/HookMan.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/core/MsgQueue.py b/core/MsgQueue.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000