《中国象棋课程设计23846.pdf》由会员分享,可在线阅读,更多相关《中国象棋课程设计23846.pdf(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、word 专业资料-可复制编辑-欢迎下载 青岛理工大学 C+面向对象课程设计报告 院(系):计算机工程学院 专业:软件 学生姓名:xxx 班级:XXX学号:XXX 题目:中国象棋程序设计 起迄日期:2011.06.30 设计地点:现代教育中心机房 指 导 教 师:XXXX 完成日期:2010 年 7 月 13 日word 专业资料-可复制编辑-欢迎下载 一、课程设计目的 面向对象程序设计作为一门软件设计的课程,具有极强的实践性,要求学生具备灵活应用理论知识的能力及面向对象程序设计技能的基础。所以在C+面向对象程序设计课程学习完成后,安排课程设计教学环节。通过课程设计,学生能了解 C+面向对象的
2、设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。通过这次课程设计,能了解并通过自学 MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与 C+面向对象程序设计语言特点的认识与理解。同时,可以提高运用 C+编程语言解决实际问题的能力;提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。二、课程设计内容与实现的功能 课程设计的题目是中国象棋,所实现的功能是能画出象棋棋盘,在此基础上实现人机对弈。对弈中符合现实中下棋的规则情况。三、系统分析与设计 1、系统分析 中国象棋具有悠
3、久的历史,几千年以来,一直被认为是人们所热爱的休闲活动之一。象棋具有独特的规则,主要为车行直路,马走狭日,相行田,士相不离老王边,炮翻山,兵、卒只进不退,过河后方能左右行。程序设计就是把现实中的人与人之间的对弈,改成电脑与人的对弈。电脑的形为仿照人的形为,正确的走棋,“思考”,下棋。任务要求,画出棋盘,实现简单的人机对弈。2、系统设计:概要设计 1、数据表示:主要包括棋盘的表示和棋子的表示。2、走法的产生:包括车马相士炮等的基本走法和检测是否将军,或被将死,还包括检 查一种棋子是否还有剩余,判断走法是否和法以及枚举可能有的合法的走法。3、搜索引擎:搜索棋子可能有的走法,并且产生最佳的走法。搜索
4、引擎包括许多算法,如极大极小值、负极大值、深度优先搜索、置换表、历史启发等等搜索算法。4、估值方法:即对棋子的价值进行评估,如兵为 300,车为 1000,将帅位无限大等;对棋子的位置进行评估,如过河后越逼近九宫的卒/兵价值越大;对棋子的灵活性进行评估,灵活性越大,价值越大,如一般车的灵活性大于卒等;对棋子间关系进行评估,即棋子受到的威胁越大,价值越低,受到的保护越多,价值越高;还要与搜索算法相结合。5、界面设计:主要有棋盘、棋子、拖动实现走棋、悔棋、还原、搜素引擎(包括算法和搜索深度)设置等。一些美化可以直接使用网络上的美化资源,消息响应函数与处理函数等的实现。详细设计 1 棋盘 BITMA
5、P BitMap;m_BoardBmp.LoadBitmap(IDB_CHESSBOARD);word 专业资料-可复制编辑-欢迎下载 m_BoardBmp.GetBitmap(&BitMap);/取 BitMap 对象 m_nBoardWidth=BitMap.bmWidth;/棋盘宽度 m_nBoardHeight=BitMap.bmHeight;/棋盘高度 m_BoardBmp.DeleteObject();memcpy(m_byChessBoard,InitChessBoard,90);/初始化棋盘 memcpy(m_byShowChessBoard,InitChessBoard,90
6、);memcpy(m_byBackupChessBoard,InitChessBoard,90);m_pSE-SetSearchDepth(3);/设定搜索层数为 3 m_pSE-SetMoveGenerator(m_pMG);/给搜索引擎设定走法产生器 m_pSE-SetEveluator(m_pEvel);/给搜索引擎设定估值核心 m_pSE-SetUserChessColor(m_nUserChessColor);/设定用户为黑方或红方 m_pSE-SetThinkProgress(&m_progressThink);/设定进度条 m_MoveChess.nChessID=NOCHESS
7、;/将移动的棋子清空 return TRUE;/return TRUE unless you set the focus to a control 2 颜色 public:void SetTextColor(COLORREF color)m_clrText=color;void SetBkColor(COLORREF color)m_clrBkGround=color;void SetStartColor(COLORREF color)m_clrStart=color;void SetEndColor(COLORREF color)m_clrEnd=color;void ShowPercent
8、(BOOL bShowPercent=TRUE)m_bShowPercent=bShowPercent;void ShowText(CString str,bool bIsShowText)m_strShow=str,m_bIsShowText=bIsShowText;COLORREF GetTextColor(void)return m_clrText;COLORREF GetBkColor(void)return m_clrBkGround;COLORREF GetStartColor(void)return m_clrStart;COLORREF GetEndColor(void)ret
9、urn m_clrEnd;int SetPos(int nPos);int SetStep(int nStep);int StepIt();void SetRange(int nLower,int nUpper);3 棋子走法 CString CChessDlg:GetMoveStr(int nFromX,int nFromY,int nToX,int nToY,int nSourceID)word 专业资料-可复制编辑-欢迎下载 CString str;bool bIsAgain;int i;int nCount;int nPos5;int j=0;switch(nSourceID)if(n
10、FromY=nToY)str.Format(黑:将%d 平%d,nFromX,nToX);break;if(nFromYnToY)str.Format(黑:将%d 退%d,nFromX,nFromY-nToY);else str.Format(黑:将%d 进%d,nFromX,nToY-nFromY);break;bIsAgain=false;for(i=0;inToY)if(bIsAgain)if(inFromY-1)str.Format(黑:后车进%d,nFromY-nToY);else str.Format(黑:前车进%d,nFromY-nToY);else str.Format(黑:车
11、%d 退%d,nFromX,nFromY-nToY);word 专业资料-可复制编辑-欢迎下载 else if(nFromYnFromY-1)str.Format(黑:后车进%d,nToY-nFromY);else str.Format(黑:前车进%d,nToY-nFromY);else str.Format(黑:车%d 进%d,nFromX,nToY-nFromY);else if(bIsAgain)if(inFromY-1)str.Format(黑:后车平%d,nToX);else str.Format(黑:前车平%d,nToX);else str.Format(黑:车%d 平%d,nFr
12、omX,nToX);break;break;bIsAgain=false;for(i=0;inFromY-1)word 专业资料-可复制编辑-欢迎下载 if(nFromYnToY)str.Format(黑:后马退%d,nToX);else str.Format(黑:后马进%d,nToX);else if(nFromYnToY)str.Format(黑:前马退%d,nToX);else str.Format(黑:前马进%d,nToX);else if(nFromYnToY)str.Format(黑:马%d 退%d,nFromX,nToX);else str.Format(黑:马%d 进%d,nF
13、romX,nToX);break;case B_CANON:/黑炮 bIsAgain=false;for(i=0;inToY)if(bIsAgain)if(inFromY-1)str.Format(黑:后炮进%d,nFromY-nToY);else str.Format(黑:前炮进%d,nFromY-nToY);else word 专业资料-可复制编辑-欢迎下载 str.Format(黑:炮%d 退%d,nFromX,nFromY-nToY);else if(nFromYnToY)bIsAgain=false;for(i=0;inFromY-1)str.Format(黑:后炮进%d,nToY-
14、nFromY);else str.Format(黑:前炮进%d,nToY-nFromY);else str.Format(黑:炮%d 进%d,nFromX,nToY-nFromY);else if(bIsAgain)if(inFromY-1)str.Format(黑:后炮平%d,nToX);else str.Format(黑:前炮平%d,nToX);else str.Format(黑:炮%d 平%d,nFromX,nToX);break;break;if(nFromYnToY)str.Format(黑:士%d 退%d,nFromX,nToX);else word 专业资料-可复制编辑-欢迎下载
15、 str.Format(黑:士%d 进%d,nFromX,nToX);break;bIsAgain=false;for(i=0;inFromY-1)if(nFromYnToY)str.Format(黑:后象退%d,nToX);else str.Format(黑:后象进%d,nToX);else if(nFromYnToY)str.Format(黑:前象退%d,nToX);else str.Format(黑:前象进%d,nToX);else if(nFromYnToY)str.Format(黑:象%d 退%d,nFromX,nToX);else str.Format(黑:象%d 进%d,nFro
16、mX,nToX);break;nCount=0;j=0;word 专业资料-可复制编辑-欢迎下载 for(i=0;i5;i+)nPosi=-1;for(i=0;inPos0)if(nFromY=nToY)str.Format(黑:前卒平%d,nToX);else str.Format(黑:前卒进%d,1);else if(nFromY=nToY)str.Format(黑:后卒平%d,nToX);else str.Format(黑:后卒进%d,1);break;j=0;if(nCount1)for(i=0;inFromY)break;else j+;if(nFromY=nToY)str.Form
17、at(黑:%d 卒平%d,j+1,1);else str.Format(黑:%d 卒进%d,j+1,1);break;if(nFromX=nToX)if(nFromYnToY)str=红:帅+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(nFromY-nToY);else str=红:帅+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(nToY-nFromY);else str=红:帅+ConvertDigit2Chinese(10-nFromX)+平+ConvertD
18、igit2Chinese(10-nToX);break;bIsAgain=false;for(i=0;inToY)if(bIsAgain)word 专业资料-可复制编辑-欢迎下载 if(inFromY-1)str=红:前车进+ConvertDigit2Chinese(nFromY-nToY);else str=红:后车进+ConvertDigit2Chinese(nFromY-nToY);else str=红:车+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(nFromY-nToY);else if(nFromYnFromY-1)
19、str=红:后车退+ConvertDigit2Chinese(nToY-nFromY);else str=红:前车退+ConvertDigit2Chinese(nToY-nFromY);else str=红:车+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(nToY-nFromY);else if(bIsAgain)if(inFromY-1)str=红:后车平+ConvertDigit2Chinese(nToX);else str=红:前车平+ConvertDigit2Chinese(nToX);else str=红:车+Conv
20、ertDigit2Chinese(10-nFromX)+平+ConvertDigit2Chinese(10-nToX);break;break;bIsAgain=false;word 专业资料-可复制编辑-欢迎下载 for(i=0;inFromY-1)if(nFromYnToY)str=红:前马进+ConvertDigit2Chinese(10-nToX);else str=红:前马退+ConvertDigit2Chinese(10-nToX);else if(nFromYnToY)str=红:前马进+ConvertDigit2Chinese(10-nToX);else str=红:前马退+C
21、onvertDigit2Chinese(10-nToX);else if(nFromYnToY)str=红:马+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(10-nToX);else str=红:马+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(10-nToX);break;bIsAgain=false;for(i=0;inToY)if(bIsAgain)if(inFromY-1)str=红:前炮进+ConvertDigit2Chinese(nFromY-nToY)
22、;else str=红:后炮进+ConvertDigit2Chinese(nFromY-nToY);else str=红:炮+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(nFromY-nToY);else if(nFromYnFromY-1)str=红:前炮退+ConvertDigit2Chinese(nToY-nFromY);else str=红:后炮退+ConvertDigit2Chinese(nToY-nFromY);else str=红:炮+ConvertDigit2Chinese(nFromX)+退+ConvertDi
23、git2Chinese(nToY-nFromY);else if(bIsAgain)if(inFromY-1)str=红:前炮平+ConvertDigit2Chinese(10-nToX);else str=红:后炮平+ConvertDigit2Chinese(10-nToX);else str=红:炮+ConvertDigit2Chinese(10-nFromX)+平+ConvertDigit2Chinese(10-nToX);word 专业资料-可复制编辑-欢迎下载 break;if(nFromYnToY)str=红:士+ConvertDigit2Chinese(10-nFromX)+进+
24、ConvertDigit2Chinese(10-nToX);else str=红:士+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(10-nToX);break;bIsAgain=false;for(i=0;inFromY-1)if(nFromYnToY)str=红:前相退+ConvertDigit2Chinese(10-nToX);else str=红:前相进+ConvertDigit2Chinese(10-nToX);else if(nFromYnToY)str=红:后相退+ConvertDigit2Chinese(10-nT
25、oX);else str=红:后相进+ConvertDigit2Chinese(10-nToX);else if(nFromYnToY)str=红:相+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(10-nToX);word 专业资料-可复制编辑-欢迎下载 else str=红:相+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(10-nToX);break;nCount=0;j=0;for(i=0;i5;i+)nPosi=-1;for(i=0;inPos0)if(nF
26、romY=nToY)str=红:前兵平+ConvertDigit2Chinese(10-nToX);else str=红:前兵进+ConvertDigit2Chinese(1);else if(nFromY=nToY)word 专业资料-可复制编辑-欢迎下载 str=红:后兵平+ConvertDigit2Chinese(10-nToX);else str=红:后兵进+ConvertDigit2Chinese(1);break;j=0;if(nCount1)for(i=0;inFromY-1)break;else j+;if(nFromY=nToY)str=红:+ConvertDigit2Chi
27、nese(j+1)+兵平+ConvertDigit2Chinese(nToX);else str=红:+ConvertDigit2Chinese(j+1)+兵进+ConvertDigit2Chinese(1);break;default:break;return str;2.1、模块设计:开发 Windows 下的应用程序,首先的路是:Windows 应用程序运行的消息循环的机制。当一个应用程序建立的时候,操作系统会为这个应用程序分配一个消息队列,凡是跟这个应用程序相关的消息,操作系统都会把这些消息放到消息队列中。然后应用程序得用 GetMessage()从消息队列中取出一条具体的消息。再利用
28、 TranslateMessage(),将用户产生的信息转换成类似 WM_KEYDOWRR 的消息,再放到消息队列中。然后再利用 DispatchMessage()将消息投递出去。投递给操作系统。操作系统再根据设计窗口类时的那个窗口处理函数 WndProc(),对不同的消息产生不同的响应。这样就完成了整个消息的循环。word 专业资料-可复制编辑-欢迎下载 主程序模块窗口模块摆棋子 绘制棋盘规则定义模块电脑智能模块 2.2、数据结构说明:人机对弈程序采用了多种搜索算法.以下是本程序主要的类说明:1.CEveluation 类:估值类,对给定的棋盘进行估值.2.CMoveGenerator 类:
29、走法产生器,对给定的棋盘局面搜索出所有可能的走法.3.CSearchEngine 类:搜索引擎基类.4.CNegaMaxEngine 类:负极大值法搜索引擎.5.CAlphaBetaEngine 类:采用了 Alpha-Beta 剪枝技术的搜索引擎.6.CFAlphaBetaEngine 类:fail-softalpha-beta 搜索引擎.7.CHistoryHeuristic 类:历史启发类.8.CAlphabeta_HHEngine 类:带历史启发的 Alpha-Beta 搜索引擎.9.CAspirationSearch 类:渴望搜索引擎.10.CIDAlphabetaEngine 类:
30、迭代深化搜索引擎.11.CMTD_fEngine 类:MTD(f)搜索引擎.12.CTranspositionTable 类:置换表.13.CAlphaBeta_TTEngine 类:加置换表的 Alpha-Beta 搜索引擎.14.CPVS_Engine 类:极小窗口搜索引擎.15.CNegaScout_TT_HH 类:使用了置换表和历史启发的 NegaScout 搜索引擎.2.3、算法流程图:word 专业资料-可复制编辑-欢迎下载 开始搜索算法定义搜索深度 depth,本方最优值 best对depth,best,worst进行search 搜索判断深度depth 是否小于 0调用局面评估
31、函数分析局面红方走棋判断value 是否大于 bestBest=value判断 depth是否等于MaxdepthBestmove=当前走法 四、系统测试与调试分析 1、系统测试 测试方法:黑盒 测试技术:、功能测试 word 专业资料-可复制编辑-欢迎下载 测试数据:测试报告:测试说明 测试名称 中国象棋 测试目的 验证用户下棋的整个过程 测试技术 功能测试 测试方法 黑盒测试法 测试测试内容 象棋运行 测试步骤 打开象棋 运行 实现与电脑对弈 word 专业资料-可复制编辑-欢迎下载 用例 测试数据 正常 正常 正常 预期结果 正常进入系统 正常运行 正常 测试结果 与预期相符 与预期相符
32、 与预期相符 2、调试分析:由于能力和时间以及所学的知识很有限,在设计的过程中一边对照资料,一边用查询。更重要的是请教同学和老师,对于有些我无法改正的错误,我采取了有点消极的做法,注释掉程序之后再进行改正。五、用户手册 1、使用的平台是 Windows 操作系统。2、不需要安装,直接打开 Source Code 文件夹,双击 Release 文件夹,再双击其中的象棋图标,就可以运行程序。3、详细使用说明:第一步:打开运行文件 第二步:双击选择 chess.exe word 专业资料-可复制编辑-欢迎下载 第三步:开始运行 第四步:运行完毕,直接退出。六、程序清单 1/鼠标左键响应消息 void
33、 CChessDlg:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call default if(m_iChessSort=CS_CCCHESS)word 专业资料-可复制编辑-欢迎下载 m_staticTip.SetWindowText(m_strWelcome);return;if(m_Status=Previewing)m_staticTip.SetWindowText(现在处于预览状态,如要下棋,请弹出右键菜单点 预览完毕);return;if(m_bIsG
34、ameOver)m_staticTip.SetWindowText(老兄,这盘棋下完了);return;if(m_bIsThinking)/电脑正在想 return;int x,y;/将坐标换算成棋盘上的格子 y=(point.y-14)/GRILLEHEIGHT;x=(point.x-15)/GRILLEWIDTH;/判断鼠标是否在棋盘内,并且点中了用户棋子 if(y=0&y=0&x=0&y=0&xIsValidMove(m_byBackupChessBoard,m_ptMoveChess.x,m_ptMoveChess.y,x,y,m_nUserChessColor)/-将用户走法压栈-m
35、_cmBestMove.From.x=m_ptMoveChess.x;m_cmBestMove.From.y=m_ptMoveChess.y;m_cmBestMove.To.x=x;m_cmBestMove.To.y=y;m_cmBestMove.nChessID=m_MoveChess.nChessID;m_umUndoMove.cmChessMove=m_cmBestMove;m_umUndoMove.nChessID=m_byChessBoardyx;m_stackUndoMove.push(m_umUndoMove);/-m_btnUndo.EnableWindow(1);/激活悔棋按
36、钮 if(m_nUserChessColor=REDCHESS)m_iBout+;this-AddChessRecord(m_ptMoveChess.x+1,m_ptMoveChess.y+1,x+1,y+1,m_nUserChessColor,m_MoveChess.nChessID);m_byChessBoardyx=m_MoveChess.nChessID;m_byShowChessBoardyx=m_MoveChess.nChessID;bTurnSide=TRUE;else/否则恢复移动前的棋盘状态 memcpy(m_byShowChessBoard,m_byBackupChessB
37、oard,90);memcpy(m_byChessBoard,m_byBackupChessBoard,90);m_MoveChess.nChessID=NOCHESS;/将移动的棋子清空 /重绘屏幕 InvalidateRect(NULL,FALSE);UpdateWindow();ReleaseCapture();/释放鼠标焦点 if(m_iChessSort=CS_PPCHESS)m_iWhoChess=m_iWhoChess%2+1;return;word 专业资料-可复制编辑-欢迎下载 if(bTurnSide=TRUE)m_btnStop.EnableWindow(1);m_hHa
38、ndle=:CreateThread(0,0,ThinkProc,this,0,&m_dwThreadID);else m_staticTip.SetWindowText(m_strWelcome);CDialog:OnLButtonUp(nFlags,point);3/响应鼠标移动 函数 void CChessDlg:OnMouseMove(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call default if(m_bIsThinking)return;if(m_MoveChess.nC
39、hessID)if(m_Status=Chessing)/防止将棋子拖出棋盘 if(point.x15)/左边 point.x=15;if(point.ym_nBoardWidth-15)/右边 point.x=m_nBoardWidth-15;if(point.ym_nBoardHeight-15)/下边 point.y=m_nBoardHeight-15;/让棋子中心位于鼠标所在处 point.x-=18;point.y-=18;m_MoveChess.ptMovePoint=point;/保存移动棋子的坐标 else /让棋子中心位于鼠标所在处 point.x-=18;word 专业资料
40、-可复制编辑-欢迎下载 point.y-=18;m_MoveChess.ptMovePoint=point;/保存移动棋子的坐标 /棋子拖出棋盘时将该棋子删掉 if(point.x15|point.ym_nBoardWidth-15|point.ym_nBoardHeight-15)m_byChessBoardm_ptMoveChess.ym_ptMoveChess.x=NOCHESS;InvalidateRect(NULL,FALSE);/刷新窗口 UpdateWindow();/立即执行刷新 CDialog:OnMouseMove(nFlags,point);4/统计红黑两方总分 int
41、nRedValue=0;int nBlackValue=0;for(i=0;i10;i+)for(j=0;j9;j+)nChessType=positionij;if(nChessType!=NOCHESS)if(IsRed(nChessType)nRedValue+=m_chessValueij;/把红棋的值加总 else nBlackValue+=m_chessValueij;/把红棋的值加总 if(nUserChessColor=REDCHESS)if(bIsRedTurn)return nRedValue-nBlackValue;/如果轮到红棋走返回估值 return nBlackVa
42、lue-nRedValue;/如果轮到黑棋走返回负估值 if(bIsRedTurn)return nBlackValue-nRedValue;/如果轮到黑棋走返回负估值 return nRedValue-nBlackValue;/如果轮到红棋走返回估值 word 专业资料-可复制编辑-欢迎下载 int CEveluation:GetRelatePiece(BYTE position9,int j,int i)nPosCount=0;BYTE nChessID;BYTE flag;int x,y;nChessID=positionij;switch(nChessID)/循环检查九宫之内哪些位置可
43、到达/保护 /扫描两边就宫包含了照像的情况 for(y=0;y3;y+)for(x=3;x6;x+)if(CanTouch(position,j,i,x,y)/能否到达 AddPoint(x,y);/可达到/保护的位置加入数组 /循环检查九宫之内哪些位置可到达/保护 /扫描两边就宫包含了照像的情况 for(y=7;y10;y+)for(x=3;x6;x+)if(CanTouch(position,j,i,x,y)/能否到达 AddPoint(x,y);/可达到/保护的位置加入数组 break;/循环检查九宫之内哪些位置可到达/保护 for(y=7;y10;y+)for(x=3;x6;x+)if
44、(CanTouch(position,j,i,x,y)AddPoint(x,y);/可达到/保护的位置加入数组 break;/循环检查九宫之内哪些位置可到达/保护 for(y=0;y3;y+)for(x=3;x6;x+)word 专业资料-可复制编辑-欢迎下载 if(CanTouch(position,j,i,x,y)AddPoint(x,y);/可达到/保护的位置加入数组 break;/右下 x=j+2;y=i+2;if(x9&y10&CanTouch(position,j,i,x,y)AddPoint(x,y);/右上 x=j+2;y=i-2;if(x=0&CanTouch(positio
45、n,j,i,x,y)AddPoint(x,y);/左下 x=j-2;y=i+2;if(x=0&y=0&y=0&CanTouch(position,j,i,x,y)AddPoint(x,y);break;/检查右下方能否到达/保护 x=j+2;y=i+1;if(x9&y10)&CanTouch(position,j,i,x,y)AddPoint(x,y);/检查右上方能否到达/保护 x=j+2;y=i-1;word 专业资料-可复制编辑-欢迎下载 if(x=0)&CanTouch(position,j,i,x,y)AddPoint(x,y);/检查左下方能否到达/保护 x=j-2;y=i+1;i
46、f(x=0&y=0&y=0)&CanTouch(position,j,i,x,y)AddPoint(x,y);/检查右下方能否到达/保护 x=j+1;y=i+2;if(x9&y10)&CanTouch(position,j,i,x,y)AddPoint(x,y);/检查右上方能否到达/保护 x=j+1;y=i-2;if(x=0)&CanTouch(position,j,i,x,y)AddPoint(x,y);/检查左下方能否到达/保护 x=j-1;y=i+2;if(x=0&y=0&y=0)&CanTouch(position,j,i,x,y)AddPoint(x,y);break;/检查向右能
47、否到达/保护 word 专业资料-可复制编辑-欢迎下载 x=j+1;y=i;while(x=0)if(NOCHESS=positionyx)/空白 AddPoint(x,y);else /碰到第一个棋子 AddPoint(x,y);break;/后面的位置不能走了 x-;/检查向下能否到达/保护 x=j;y=i+1;while(y=0)if(NOCHESS=positionyx)/空白 AddPoint(x,y);else /碰到第一个棋子 AddPoint(x,y);break;/后面的位置不能走了 y-;break;/观看向前是否到底 y=i-1;x=j;if(y=0)AddPoint(x
48、,y);/没到底,可走 if(i5)/如已过河 y=i;x=j+1;/向右 if(x=0)AddPoint(x,y);/未到左边,可走 break;/观看向前是否到底 y=i+1;x=j;if(y4)word 专业资料-可复制编辑-欢迎下载 /如已过河 y=i;x=j+1;/向右 if(x=0)AddPoint(x,y);/未到左边,可走 break;/检查向右能否到达/保护的位置 x=j+1;y=i;flag=FALSE;while(x=0)if(NOCHESS=positionyx)/空白位置 if(!flag)AddPoint(x,y);else if(!flag)flag=TRUE;/
49、是第一个棋子 else /是第二个棋子 AddPoint(x,y);break;x-;/继续向左 /检查向下能否到达/保护的位置 x=j;y=i+1;flag=FALSE;while(y=0)if(NOCHESS=positionyx)/空白位置 if(!flag)AddPoint(x,y);else if(!flag)flag=TRUE;/是第一个棋子 else /是第二个棋子 AddPoint(x,y);break;y-;/继续向上 break;default:break;return nPosCount;5/下面的循环继续统计扫描到的数据 int nHalfvalue;for(i=0;i
50、10;i+)for(j=0;j=B_BEGIN&x=R_BEGIN&x=R_END)/判断某个棋子是不是红色 /判断两个棋子是不是同色#define IsSameSide(x,y)(IsBlack(x)&IsBlack(y)|(IsRed(x)&IsRed(y)/棋子位置 typedef struct BYTE x;BYTE y;CHESSMANPOS;/棋子走法 typedef struct short nChessID;/表明是什么棋子 CHESSMANPOS From;/起始位置 CHESSMANPOS To;/走到什么位置 int Score;/走法的分数 CHESSMOVE;/悔棋时