电脑象棋基本编码实现和性能测试

论文帮手 2本页 1691字

6 基本编码实现

  6.1 棋谱表示

  实现技术:

  通过定义以下宏与10*9单位的整型数组,表示棋谱:

  #define B_KING   1 //黑帅
  #define B_CAR       2 //黑车
  #define B_HORSE   3 //黑马
  #define B_CANON   4 //黑炮
  #define B_BISHOP    5 //黑士
  #define B_ELEPHANT 6 //黑象
  #define B_PAWN     7 //黑卒
  #define R_KING   8 //红将
  #define R_CAR       9 //红车
  #define R_HORSE     10//红马
  #define R_CANON    11//红炮
  #define R_BISHOP    12//红士
  #define R_ELEPHANT 13//红相
  #define R_PAWN     14//红兵

  以下为默认棋局的棋谱表示:

  const BYTE InitChessBoard[10][9]=
  {
  {B_CAR,B_HORSE,B_ELEPHANT,B_BISHOP,B_KING,B_BISHOP,B_ELEPHANT,B_HORSE,B_CAR},
  {NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},
  {NOCHESS,B_CANON,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,B_CANON,NOCHESS},
  {B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN},
  {NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},
  //*****************楚河********************汉界*************//
  {NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},
  {R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN},
  {NOCHESS,R_CANON,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,R_CANON,NOCHESS},
  {NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},
  {R_CAR,R_HORSE,R_ELEPHANT,R_BISHOP,R_KING,R_BISHOP,R_ELEPHANT,R_HORSE,R_CAR}
  };

象棋博弈

  6.2 比较具有代表性的函数及其主要功能

  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

  作用:该函数将主框架拆分,包含了三个视图对象,分别为:棋局界面(左),步时记录(右上,该视图类继承于CListView),操作控制(右下,该视图类继承于CFormView)。

  void CMainFrame::OnChessBgein()

  作用:棋局的开始菜单,内含有一系列初始化判断操作

  void CMainFrame::OnChessDemon()

  作用:演示棋局菜单,内含有一系列初始化判断操作

  void CMainFrame::OnChessMake()

  作用:制作棋谱菜单,内含有一系列初始化判断操作,并伴随有对另一自定义菜单的操作。

  void CchessView::OnLButtonDown(UINT nFlags, CPoint point)

  作用:初始化判断,如果为对弈状态,则记录棋子初始位置参数“point”

  void CchessView::OnMouseMove(UINT nFlags, CPoint point)

  作用:根据所移动的位置参数“point”,不断刷新视图

  void CchessView::OnLButtonUp(UINT nFlags, CPoint point)

  作用:在对棋子进行合法步骤判断以后,若为合法,则记录该棋步并落子,否则,将棋子退回到OnLButtonDown中的参数“point”的位置

  void CchessView::OnDraw( CDC* pDC )

  作用:改变内存设备描述表参数“pDC”,此函数非常重要,在每一个视图刷新中都将会被调用,维持棋局的界面显示。

  void CchessView::OnRButtonDown(UINT nFlags, CPoint point)

  作用:在制作棋谱过程中,该事件可以直接在参数“point”处显示自定义菜单(为每个棋子的选项),可方便棋谱的制作。该函数配之以一系列的菜单事件,并含有对菜单项的禁用判断,以响应并方便棋谱的制作。

  void CchessView::OnChessSave()

  作用:保存棋谱菜单,内含有对数据库的写入操作

  自定义函数:

  void CchessView::DisplayRecordView(BYTE position[10][9], int nFromX, int nFromY, int nToX, int nToY,int m_nUserChessColor)

  作用:在每步棋子下落以后,该函数被调用,根据起点参数(int nFromX, int nFromY)与落点参数(int nToX, int nToY)记录人机对弈的每一步。

  BOOL CMoveGenerator::IsValidMove(BYTE position[10][9], int nFromX, int nFromY, int nToX, int nToY,int nUserChessColor)

  作用:该函数通过对起点参数(int nFromX, int nFromY)与落点参数(int nToX, int nToY)的值,判断该走法是否合理

  int CMoveGenerator::CreatePossibleMove(BYTE position[][9],int nPly,int nSide,int nUserChessColor)

  作用:计算当前所有可能的走法,nPly指明当前搜索的层数,每层将走法存在不同的位置,以免覆盖nSide指明产生哪一方的走法,TRUE为红方,FALSE是黑方,其中配合以一系列棋子对合法走法的判断。

  int CMoveGenerator::AddMove(int nFromX,int nFromY,int nToX,int nToY,int nPly,int nChessID)

  作用:在计算合理走法的时候,该函数对每一合理的走法进行压栈操作。

  控制窗口主要函数:

  void CControlRecordView::OnNextButtonClicked()

  作用:“下一步”按纽,通过读取数据库数据,手动演示存盘的棋局

  void CControlRecordView::OnAutodemonButtonClicked()

  作用:“自动演示”按纽,该函数通过一系列初始化,然后设置时钟,以一定时间间隔调用“OnTimer”函数,以达到自动演示

  void CControlRecordView::OnTimer(UINT nIDEvent)

  作用:该函数为时钟响应函数,定时读取数据库内容,更新棋盘数组,并刷新棋盘,以达到自动演示的目的。

  void CControlRecordView::OnTimeButtonClicked()

  作用:设置自动演示时间参数。

  void CControlRecordView::OnPredemonButtonClicked()

  作用:“重新演示”按纽,通过判断,重新初始化。

  void CControlRecordView::OnRegretButtonClicked()

  作用:“悔棋”按纽,通过读取已下棋局保存于栈中数据,改变棋盘数组,并刷新棋盘,以达到悔棋的目的。

  6.5 数据库操作,封装ADO

  文件名:DBADO.h

  描述:封装ADO

  函数列表:

  BOOL ADOConnectDB(CString UID="sa", CString PWD="", CString SERVER=".", CString DB="chess");连接数据库
  void ExecuteSQL(CString sqlStr);执行SQL语句
  void BrowseRec(CString sqlStr, _RecordsetPtr &rs);执行SQL语句并返回记录集
  CString GetValue(_RecordsetPtr &rs, CString Column);获得记录集中某列的值
  int  GetRecCount(CString Column, CString TbName, CString sqlWhere);根据条件计数

7 性能测试

  7.1 初始界面

  当点开可执行文件时,如图所示,出现此界面,但在点开各项菜单之前,该界面处于不可操作状态:

程序初始界面

图 7.1 程序初始界面

  7.2 人机对弈界面

  经过连接数据库,选定对弈级别和棋局等一系列操作以后,便进入人机对弈界面,如图所示:

人机对弈界面

图 7.2 人机对弈界面

  7.3 制作棋谱界面

  当通过菜单进入制作棋谱菜单时,出现空的棋盘,通过右键菜单可以往棋盘上定点放上棋子,右键菜单可以识别在棋盘当前位置上是否可以放上棋子,判断当前棋盘上棋子是否已经足够,从而可以十分方便棋谱的制作。下图为制作棋谱过程之中时的界面。

制作棋谱界面

图 7.3 制作棋谱界面

  7.4 演示棋谱界面

  当进入演示棋谱菜单,通过选项读取数据库中保存的人机对弈过程的菜单,进入演示棋谱界面,右下角为演示过程的操作按纽,可以对演示进行一系列控制操作:

演示棋谱界面

图7.4 演示棋谱界面

(未完,请点击下面的其他章节)

相关文章

上一篇:象棋棋子的价值,灵活性及其关系评估

下一篇:象棋类人机对战系统毕业设计的结论,谢辞及参考资料

点击按钮复制手机号

18930620780

将微信二维码保存到相册

打开微信扫一扫从相册识别

1.点击按钮复制QQ号

3008635932

2.打开QQ→添加好友/群

粘贴QQ号,加我为好友