棋盘中鼠标点击生成着法的简单过程说明

5 views
Skip to first unread message

lerosua

unread,
May 5, 2009, 11:33:00 AM5/5/09
to gmchess-dev
棋盘中的一着法过程是指,选中一棋子,比如炮,把它调到中间位置,也就是通常的炮二平五的着法。
下面简述它在源码中历经的函数过程。

首先响应鼠标点击事件的是Board类的on_button_press_event
在没有棋子选中的状态下选中棋子,会将此棋子作为选择子selected_chessman保存下来。
在已有选择的状态下,即selected_chessman有效值的情况下,对鼠标所点的位置,将会形成一个起点,一个终点,而这两个位置就是生成着法
的基础。
但程序中用的是try_move, 它的两个参数分别是目标位置的x,y坐标.

在try_move中,可以由以类中已保存的变量seleced_chessman获取起点的坐标src,以及传入的参数获取目标位置坐标dst,由起
点及终点生成着法Engine::get_move(src,dst)

然后进入重载的try_move(int mv)函数,这个try_move的参数就是上面生成的着法。
在这个try_move里,会直接调用Engine::make_move(mv),这个函数会直接判断此着法是否可行,如不可行会返回false.即
非法的着法不会执行,界面恢复原状。如可行,则已经是执行过的了,则从引擎类Engine里获取此着法的中文表示方法(即炮二平五)添加到界面的
treeview列表中,如果是吃子则发出吃子的声音等。

在Engine::make_move中,首先是检测着法的基本逻辑,logic_move,这个函数只会判断棋子的基本走动,比如车只能横和竖走,帅
只能在九宫内,没考虑将军及问题。因此,需要往下执行着法do_move,然后判断是否仍然被将军checked_by,如果是则撤销着法。如果不是则
返回真,即执行着法成功。当然中间还有一个判断将帅是否碰头的函数king_meet()

涉及的函数do_move是机械地做走子动作,它会更新棋盘及棋子数组。而undo_move(mv)则撤销此着法。都不做过多的判断。

Reply all
Reply to author
Forward
0 new messages