版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精品文档中国象棋游戏开发设计报告班级:_小组编号: _小组成员:_精品文档指导老师:_精品文档一、开发的目的和意义面向对象程序设计作为一门软件设计的课程,具有极强的实践性,要求学 生具备灵活应用理论知识的能力及面向对象程序设计技能的基础。通过游戏开 发,学生能了解C+面向对象的设计方法与技巧,有效地、深刻地理解课程内 容,体会理论、方法和设计原则,培养分析实际问题和解决问题的能力,具备 使用面向对象程序设计开发工具设计实际系统的能力。还能够了解并通过使用MFC,掌握一种可视化编程的方法,并通过游戏的开发加深对可视化编程的理 解。同时,可以提高运用C+编程语言解决实际问题的能力。棋牌游戏属于休闲
2、类游戏,具有上手快、游戏时间短的特点,更利于用户 进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在 休闲娱乐中占主要位置。中国象棋作为中国自古以来的经典棋牌游戏之一,一 直都是人之间的较量,将中国象棋制作成游戏,可以实现人与计算机之间的对 弈。而且人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使 计算机去做那些过去只能靠人的智力才能做的工作。开发出了计算机象棋游戏, 以后不仅仅可以进行休闲游戏,还能锻炼自己的智力和象棋技术,更加方便了 人们的日常生活。二、功能描述和分析(用户需求分析)2.1开发背景我们周围有许多同学喜欢下象棋,尤其是男同学,希望能有人可以和自己
3、下 象棋,但这种意愿常因为受到条件的限制而难以如愿,比如说需要身边刚好有 现成的棋盘棋子,比如说需要是同样懂得中国象棋的对手,但是大家都知道我 们这所大学男性同学占少数,即便是条件都满足了,还要考虑这位对手是否有何 自己下棋的心情。 这时,如果有一台计算机,一个能够支持人机对弈的程序, 上面的问题迎刃而解。而我们小组的这个想起游戏设计,正是希望能够做出一款拥有良好性能, 良好的智能,能够满足大多数爱好象棋的同学的需求中国象棋人机对弈程序。2.2用户需求分析一款能够与用户对弈,满足用户需求的中国象棋程序,需要有棋盘棋子的 局面、鼠标响应控制棋子移动、棋子的走法规则、人机对弈的搜索算法、避免 异常
4、引入的多线程、胜负判断,具体分析如下:2.2.1棋盘棋子的局面作为中国象棋的这项游戏,其必不可少的是就是棋子和棋盘,没有这两个 部分,想起功能无法实现,不仅仅如此,如果,仅仅有棋子和棋盘,而没有将 两者结合起来,那么,也将无法实现中国象棋的游戏功能,所以,棋子和棋盘的设计在这个游戏设计中至关重要。精品文档2.2.2鼠标响应在对弈中,棋子是必须可以移动的,不然游戏无法进行。因此,鼠标左键 点击是必不可少的一部分。223棋子的功能分析:中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋 的棋子的类型大致分为:帅(将)、士、象、马、车、炮、兵(卒)等几个类型。帅(将):红方中的帅和黑方
5、中的将的功能相同,都是只能在九宫格中进行 横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见 面。士:士在整片棋盘中,和帅的移动范围类似,也是只能在九宫格中移动, 不过士的移动方向是对角线,并且每次只能在一个格子中移动。象:象的走法遵循“象走田”的原则,不能绊象腿。马:马的走法遵循“马走日”的原则,不能绊马腿。车:在整块棋盘中,车可以横向或纵向3移动任意格。炮:每次移动和车的类似,但是在吃对方棋子的时候必须中间有且只能有 一个棋子的间隔。兵(卒):红方的兵和黑方的卒的功能相同,特点是只能向对方前进,而不 能后退,过河之前不能横向移动,过河之后可以横向移动,不管是前进还是横 向
6、移动,每次都只能移动一格。2.2.4良好的人机对弈要实现人机的对弈,搜索算法是很重要的一部分。关于棋类对弈程序中的 搜索算法,已有成熟的Alpha-Beta搜索算法。我们在程序中直接借鉴了Alpha-Beta搜索算法并辅以历史启发。Alpha-Beta搜索算法:在中国象棋里,双方棋手获得相同的棋盘信息。他 们轮流走棋,目的就是吃掉对方的将或帅,或者避免自己的将或帅被吃。搜索 算法的搜索过程很漫长,因此对搜索算法进行简化是有必要的。2.2.5多线程的必要性由于程序在进行搜索时会占用大量的CPU时间,因而阻塞了位于同一线程 内的其他指令,使之无法正常工作,因而引入了多线程的思想另外开一个线程, 让
7、各程序分开于多个线程。就可以解决程序异常的问题了,因此,多线程思想 的引入是有必要的。2.2.6判断胜负游戏需要判断最后由谁胜出三、 米用的开发工具和技术,开发环境,适用环境精品文档开发工具开发环境适用环境Visual C+ MFC工程;win7;windows系统;四、小组成员分工初始化、局面设计部分(贺景); 判断胜负、棋子走法部分(邹京甫); 鼠标响应、绘图部分(吴鑫); 搜索引擎部分等由组员共同完成。五、具体开发方法和过程5.1初始化部分OnlnitDialog()负责的是对话框的初始化。可以把有关中国象棋的棋局初始 化情况也放在了这里面。初始化的内容包括:对引擎部分所用到的变量的初始
8、化。包括对棋盘上的棋子位置进行初始化(棋盘数组的初始化),对搜索深度、当前走棋方标志、棋局是否结束标志等的 初始化;对棋盘、棋子的贴图位置(即棋盘、棋子在程序中实际显示位置)的初始 化;对程序辅助部分所用到的一些变量的初始化。棋盘、棋子样式的默认形式,以及着法名称列表的初始化等。1.对棋盘的初始化memcpy(m_byChessBoard,lnitChessBoard,90);2.对棋盘、棋子的贴图位置(即即棋盘、棋子在程序中实际显示位置)的初 始化;MemDC.SelectObject(&pOldBmp); 恢复内存Dc的原位图3.对程序辅助部分所用到的一些变量的初始化棋盘、棋子样式
9、的默认形式,下棋模式的默认选择,以及着法名称列表的 初始化等。初始化部分的代码如下:BOOL CChessDlg:O nln itDialog()CDialog:O nlni tDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system comma nd range.ASSERT(IDM_ABOUTBOX & OxFFFO) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX Appe ndMe nu(MF_SEPARATOR);pSysMe nu-Appe
10、ndMe nu(MF_STRING,IDM_ABOUTBOX,strAboutMe nu);SetIco n(m_hlco n, TRUE);/ Set big iconSetIco n(m_hlco n, FALSE);/ Set small icon/彩色进度条设置m_progressThi nk.SetStartColor(RGB(0 xFF,0 xFF,0 x00);/黄色m_progressThink.SetEndColor(RGB(0 x00,0 x93,0 x00);绿色m_progressThi nk.SetBkColor(RGB(0 xE6,0 xE6,0 xFA);淡紫色m
11、_progressThi nk.SetTextColor(RGB(0,0,255);m_progressThi nk.ShowPerce nt(1);m_tooltip.Create(this); m_tooltip.Activate(1);m_Chessman.Create(IDB_CHESSMAN,36,14,RGB(0,255,0); 创建含有 棋子图形的ImgList,用于绘制棋子/下面这段代码取棋盘图形的宽,高BITMAP BitM ap;m_BoardBmp .L oadBitmap(IDB_CHESSBOARD);m_BoardBmp.GetBitmap(&BitMap)
12、; /取BitMap对象m_nBoardWidth=BitMap.bmWidth; /棋盘宽度m_nBoardHeight=BitMap.bmHeight;/棋盘高度m_BoardBmp.DeleteObject();memcpy(m_byChessBoard,l nitChessBoard,90);初始化棋盘memcpy(m_byShowChessBoard,l nitChessBoard,90);memcpy(m_byBackupChessBoard,l nitChessBoard,90);m_pSE-SetSearchDepth(3);设定搜索层数为3m_pSE-SetMoveGe ne
13、rator(m_pMG);/给搜索引擎设定走法产生器m_pSE-SetEveluator(m_pEvel); /给搜索引擎设定估值核心m_pSE-SetUserChessColor(m_nUserChessColor);/设定用户为黑方或红方m_pSE-SetTh in kProgress(&m _progressThi nk);/设定进度条m_MoveChess. nChesslD=NOCHESS;/将移动的棋子清空return TRUE; / return TRUE uni ess you set the focus to a control 5.2局面设计精品文档游戏设计中,我们
14、的象棋棋盘采用的是直接加载位图生成棋盘,图片的大 小是宽度377*高度417,棋盘上每个格子的大小:39*39,图片格式为:BMP。 棋子部分是通过加载位图实现的,图片的大小是:宽度32*高度32,图片的格式也是BMP。我们用一个10*9的数组来存储棋盘上的信息,数组的每个元素存储棋盘上 是否有棋子。棋盘的初始情形如下所示(图1是整个棋盘与棋子的局面图):const BYTE In itChessBoard109=B_CAR,B_HORSE,B_ELEPHANT,B_BISHOP,B_KING ,B_BISHOP,B_ELEPHANT,B_HORSE,B_CAR,NOCHESS,NOCHESS
15、,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,NOCH
16、ESS,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_B
17、ISHOP,R_ELEPHANT,R_HORSE,R_CAR;(i)精品文档图 i i 局面设计图棋子的定义:#defi ne NOCHESS0 /没有棋子#defi ne B_KING1 /黑帅#defi ne B_CAR2黑车#defi ne B_HORSE3 /黑马#defi ne B_CANON4 /黑炮#defi ne B_BISHOP5 /黑士#defi ne B_ELEPHANT 6 /黑象#defi ne B_PAWN7黑卒#defi ne B_BEGINB_KING#defi ne B_ENDB_PAWN#defi ne R_KING8 /红将#defi ne R_CAR9红
18、车#defi ne R_HORSE 10 红马#defi ne R_CANON11红炮#defi ne R_BISHOP 12 红士#defi ne R_ELEPHANT 13 红相#defi ne R_PAWN14 红兵#defi ne R_BEGIN R_KING #defi ne R_ENDR_PAWN#defi ne IsBlack(x) (x=B_BEGIN & x=R_BEGIN & x=R_END)判断某个棋子是不是 红色。判断两个棋子是不是同色#define lsSameSide(x,y) (IsBlack(x) & IsBlack(y) | (IsRe
19、d(x) & IsRed(y)/棋子位置typedef structBYTE x;BYTE y;CHESSMANPOS;5.3绘图部分对于绘图部分,主要实现的是程序界面的绘图因此我们在这里将要完成棋 盘、棋子的显示走棋起始位置和目标位置的提示框的显示。而要实现这些我们 必须通过voidCChessDlg:OnPaint()这个函数实现void CChessDlg:O nPai nt()精品文档CPa in tDC dc(this);CDC MemDC;int i,j;POINT pt;CBitmap* pOldBmp;MemDC.CreateCompatibleDC(&dc);
20、m_BoardBmp .L oadBitmap(IDB_CHESSBOARD);pOldBmp=MemDC.SelectObject(&m _BoardBmp);绘制棋盘上的棋子for(i=0;i10;i+)for(j=0;j9;j+) if(m_byShowChessBoardij=NOCHESS) con ti nue;pt.x=j*GRILLEHEIGHT+14;pt.y=i*GRILLEWIDTH+15;m_Chessma n.Draw(&MemDC,m_byShowChessBoardij-1,pt,ILD_TRANSPARENT);绘制用户正在拖动的棋子if(m_M
21、oveChess. nChesslD!=NOCHESS)m_Chessma n.Draw(&MemDC,m_MoveChess.nChesslD-1,m_MoveChess.ptM ovePoi nt,ILD_TRANSPARENT);dc.BitBlt(0,0,m_nBoardWidth,m_nBoardHeight,&MemDC,O,O,SRCCOPY)J将绘制的内容刷新到屏幕MemDC.SelectObject(&pOldBmp); 恢复内存Dc的原位图MemDC.DeleteDC();释放内存m_BoardBmp.DeleteObject();删除棋盘位图对象
22、_5.4鼠标响应部分鼠标响应部分包括LButtonDown和LButtonUp两个功能,LButt on Dow n实现的主要功能是拖动棋子在棋盘上的移动,他的重要性是,如果没有这个功能,将无法走棋,其函数实现通过:void CChessDlg:O nLButto nDow n(UINT nFlags, CPoi nt poi nt)精品文档LButt on Up这个函数主要实现的功能是:拖动棋子完毕后放置到拖动后的 位置,在进行放置的过程中,需要使用一个Drop的释放函数。函数实现通过:void CChessDlg:O nLButto nUp(UINT nFlags, CPoi nt poi
23、 nt)5.5棋子走法typedef structshort nChessID;表明是什么棋子CHESSMANPOS From;/起始位置CHESSMANPOS To;走至M十么位置int Score;走法的分数CHESSMOVE;在着法生成器中,采用的基本思想就是遍历整个棋盘(一个接一个地查看 棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋 子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列。这里谈到的“合法着法”包括以下几点:1、各棋子按其行子规则行子。诸如马跳“日”字、象走“田”字、士在九宫内斜行等等(这里需要特别注意的是卒(兵)的行子规则会随其所在位
24、置的 不同而发生变化-过河后可以左右平移)。2、 行子不能越出棋盘的界限。当然所有棋子都不能走到棋盘的外面,同时 某些特定的棋子还有自己的行棋界限,如将、士不能出九宫,象不能过河。3、 行子的半路上不能有其它子阻拦(除了炮需要隔一个子才能打子之外) 以及行子的目的点不能有本方的棋子。4、 将帅不能碰面(本程序中只在生成计算机的着法时认为将帅碰面是非法 的,而对用户所走的导致将帅碰面的着法并不认为其非法,而只是产生败局罢 了)。产生了着法后要将其存入着法队列以供搜索之用,由于搜索会搜索多层, 所以在把着法存入着法队列的时候还要同时存储该着法所属的搜索层数。因此 可以将着法队列定义为二维数组,其中
25、第一个数组下标为层数,第二个数组下 标为每一层的全部着法数。着法生成中的各个棋子走法以及其他规则代码见MoveGe nerator.cpp。棋子的移动由以下的函数分别执行:帅(将):Void CMoveGe nerator:Gen_Ki ngMove() _士:红士void CMoveGenerator:Gen_RBishopMove()黑士void CMoveGenerator:Gen_BBishopMove()精品文档象:void CMoveGe nerator:Gen_Elepha ntMove() _马:void CMoveGe nerator:Gen_HorseMove() _车:v
26、oid CMoveGe nerator:Gen_CarMove()炮:void CMoveGe nerator:Gen_Ca nonM ove() _兵(卒): 红兵void CMoveGenerator:Gen_RPawnMove() 黑卒void CMoveGenerator:Gen_BPawnMove() 5.6搜索算法我们用一棵象棋树来表示下棋的过程:树中每一个结点代表棋盘上的一个 局面,对每一个局面根据不同的走法又产生不同的局面。精品文档 该象棋树包含三种类型的结点:奇数层的中间结点以及根结点,表示轮到 红方走棋;偶数层的中间结点,表示轮到黑方走棋;叶子结点,表示棋局结束。结合上面所
27、讲的树,若给每个结点都打一个分值来评价其对应的局面,我 们通过估值引擎SetEveluatorQ来实现,过比较该分值的大小来判断局面的优劣。void SetEveluator(CEveluati on* pEval)m_pEval=pEval;;一假定甲乙两方下棋,甲胜的局面是一个极大值(一个很大的正数),那么乙 胜的局面就是一个极小值(极大值的负值),和棋的局面则是零值(或是接近零 的值)。如此,当轮到甲走棋时他会尽可能地让局面上的分值大,相反轮到乙走 棋时他会选尽可能地让局面上的分值小。反映到博弈树上,即如果假设奇数层 表示轮到甲方走棋,偶数层表示轮到乙方走棋。那么由于甲方希望棋盘上的分
28、值尽可能大,则在偶数层上会挑选分值最大的结点一一偶数层的结点是甲走完一步棋之后的棋盘局面,反映了甲方对棋局形势的要求。同样道理,由于乙方 希望棋盘上的分值尽可能小, 那么在奇数层上会选择分值最小的结点。 这是“最 小-最大” (Minimax)的基本思想。这样搜索函数在估值函数的协助下可以通过 在奇数层选择分值最大(最小)的结点,在偶数层选择分值最小(最大)的结 点的方式来搜索以当前局面为根结点、限定搜索层数以内的整棵树来获得一个 最佳的着法。下面是“最大-最小”的主要代码int CNegaMaxE ngin e:NegaMax(i nt nDepth)int curre nt=-20000;
29、int score;int Coun t,i;BYTE type;i=lsGameOver(CurPositio n,n Depth);/检查棋局是否结束if(i!=0)return i;棋局结束,返回极大/极小值精品文档if(n DepthEveluate(CurPosition,(m_nMaxDepth-nDepth)%2,m_nUserChessColor);/列举当前棋局下一步所有可能的走法Cou nt=m_pMG-CreatePossibleMove(CurPositio n,nDepth,(m_nMaxDepth -n Depth)%2,m_nUserChessColor);if(
30、n Depth=m_ nM axDepth) _/在根节点设定进度条m_pTh in kProgress-SetRa nge(0,Co un t);m_pTh in kProgress-SetStep(1); _for(i=0;iSteplt();走进度条type=MakeMove(&m _pMG-m_MoveList nDepthi);/根据走法产生新局面score=-NegaMax( nDepth-1);/递归调用负极大值搜索下一层节点UnM akeMove(&m _pMG-m_MoveList nDepthi,type);/恢复当前局面if(scorecurre nt)/
31、如果score大于已知的最大值curre nt=score;/修改当前最大值为scoreif(n Depth=m_ nMaxDepth)m_cmBestMove=m_pMG-m_MoveListnDepthi; 靠近根部时保存最佳走法return curren t;返回极大值“最小-最大”思想再加上“树的裁剪”就是Alpha-Beta搜索算法的核心。最基本的Alpha-Beta算法的代码如下:int CAIphaBetaE ngin e:AlphaBeta(i nt n Depth,i nt alpha,i nt beta)int score;精品文档int Coun t,i;BYTE typ
32、e;i=lsGameOver(CurPositio n,n Depth);/检查是否游戏结束if(i!=0)return i;结束,返回估值叶子节点取估值if(n DepthEveluate(CurPosition,(m_nMaxDepth-nDepth)%2,m_nUserChessColor);/此函数找出当前局面所有可能的走法,然后放进m_pMG -m_MoveList当中Cou nt=m_pMG-CreatePossibleMove(CurPositio n,nDepth,(m_nMaxDepth -n Depth)%2,m_nUserChessColor);if(n Depth=m_
33、 nM axDepth) _/在根节点设定进度条m_pTh in kProgress-SetRa nge(0,Co un t);m_pTh in kProgress-SetStep(1); _/对所有可能的走法for(i=0;iSteplt();走进度条type=MakeMove(&m _pMG-m_MoveList nDepthi);/将当前局面应用此走法,变为子节点的局面score=-AlphaBeta( nDepth-1,-beta,-alpha);/递归搜索子节点UnMakeMove(&m_pMG-m_MoveListnDepthi,type); 将此节点的局面恢复为当
34、前节点if(scorealpha) alpha=score;/保 留极大值/靠近根节点时保留最佳走法if(n Depth=m_ nMaxDepth)m_cmBestMove=m_pMG-m_MoveList nDepthi; if(alpha=beta)break;/剪枝,放弃搜索剩下的节点 return alpha;/返 回极大值精品文档Alpha-Beta搜索算法是在“最小-最大”的基础上引入“树的裁剪”的思想 以期提高效率,它的效率将在很大程度上取决于树的结构一一如果搜索了没多久就发现可以进行“裁剪”了,那么需要分析的工作量将大大减少,效率自然 也就大大提高;而如果直至分析了所有的可能性
35、之后才能做出“裁剪”操作, 那此时“裁剪”也已经失去了它原有的价值(因为你已经分析了所有情况,这 时的Alpha-Beta搜索已和“最小-最大”搜索别无二致了)。因而,要想保证Alpha-Beta搜索算法的效率就需要调整树的结构,即调整待搜索的结点的顺序,使得“裁剪”可以尽可能早地发生。可以根据部分已经搜索过的结果来调整将要搜索的结点的顺序。因为,通 常当一个局面经过搜索被认为较好时,其子结点中往往有一些与它相似的局面 (如个别无关紧要的棋子位置有所不同)也是较好的。由J.Schaeffer所提出的“历史启发”(History Heuristic)就是建立在这样一种观点之上的。在搜索的过 程中
36、,每当发现一个好的走法,就给该走法累加一个增量以记录其“历史得分”, 一个多次被搜索并认为是好的走法的“历史得分”就会较高。对于即将搜索的 结点,按照“历史得分”的高低对它们进行排序,保证较好的走法(“历史得分” 高的走法)排在前面,这样Alpha-Beta搜索就可以尽可能早地进行“裁剪”,从 而保证了搜索的效率。对于着法的排序可以使用各种排序算法,在程序中采用了归并排序。归并 排序的空间复杂度为0(n),时间复杂度为0(nlog2n),具有较高的效率。历史启发部分的主要代码如下:void CHistoryHeuristic:ResetHistoryTable()memset(m_Histor
37、yTable,10,8100*4); _int CHistoryHeuristic:GetHistoryScore(CHESSMOVE *move) int nFrom,nTo;nFrom=move-From.y*9+move-From.x; 原始位置n To=move-To.y*9+move-To.x; /目标位置return m_HistoryTable nF rom nTo; 返回历史得分5.7多线程由于程序出现了异常:有时对用户方的功能完全正确,而对电脑方的有些 功能却不起作用,这是由于程序在进行搜索时会占用大量的CPU时间,因而阻 塞了位于同一线程内的其他指令,使之无法正常工作,因而
38、我们引入了多线程 的思想另外开一个线程,让各程序分开于多个线程。函数原型:CWin Thread* AfxBegi nThread(AFX_THREADPROC Thi nkProc,LPVOID pParam,int n Priority = THREAD_PRIORITY_NORMAL,UINT n StackSize = 0,DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES精品文档lpSecurityAttrs = NULL );该函数启动一个新的线程并返个指向该新线程对象的指针,然后新的 线程与启动该新线程的线程同时运行。该函数的第一个参数A
39、FX_THREADPROC ThinkProc指定了线程函数。线程函数的内容即为新线程 所要执行的内容,线程函数执行完毕,新线程结束(自动销毁)。线程函数必须被定义为全局函数,其返回值类型必须是UINT,必须有一个LPVOID类型的参数。可以把调用引擎部分的搜索函数的代码以及完成走棋 动作的代码放入所定义的思考线程内,如下:DWORD WINAPI Thi nkProc(LPVOID pParam)CChessDlg* pDlg=(CChessDlg*)pParam;pDlg-Thi nk();return 0;然后,只要将原先调搜索函数并完成走棋的代码代之以调用AfxBeginThread来
40、启动新线程即可,实现了程序的多线程,不能正常工作的问 题也就随之解决了。5.8判断胜负红方的帅被吃,或者黑方的将被吃,游戏结束,判断被吃的一方输。具体 代码如下:int CChessDlg:lsGameOver(BYTE positio n 9)int i,j;BOOL RedLive=FALSE,BlackLive=FALSE;/检查红方九宫是否有帅for(i=7;i10;i+)for(j=3;j6;j+)if(positio n ij=B_KING)BlackLive=TRUE;if(positio n ij=R_KING)RedLive=TRUE;/检查黑方九宫是否有将for(i=0;i3;i+)for(j=3;j6;j+)if(positio n ij=B_KING)BlackLive=TRUE;if(positio n ij=R_KING)RedLive=TRUE;精品文档if(m_nUserChessColor=REDCHESS) _if(!RedLive)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 露营装备推广方案
- 辽宁省本溪市二十二中学2024-2025学年八年级上学期期中物理模拟题
- 基于《幼儿园教师信息技术应用能力测评指南》的课程资源库建设
- 关于成立人工智能公司可行性研究报告
- 内蒙古申论模拟50
- 2006年广东省公务员录用考试《申论》试题
- 湖北省申论真题2017年
- 地方公务员西藏申论70
- 吉林公务员面试模拟28
- 24.3 第3课时 用计算器求锐角三角函数值 华师大版数学九年级上册课件
- 第5.3课《联系生活实际弘扬工匠精神》(课件)-【中职专用】高二语文同步课件(高教版2023·职业模块)
- 小学生语文读书专题讲座课件-阅读讲座
- 《能臣袁崇焕》课件
- 大流量深井潜水泵技术研发
- 来那度胺联合利妥昔单抗治疗老年初诊弥漫大B细胞淋巴瘤的临床疗效研究演示稿件
- 注塑机电脑密码汇总全套
- 2024版国开电大专科《课堂提问与引导》在线形考(阶段性学习测验一至六)+终考考核试题及答案
- 护理品管圈QCC之提高手术物品清点规范执行率课件
- 浙江省“衢温51”联盟2023-2024学年高一上学期期中联考历史试题
- 学校拔尖人才培养方案(高中)
- 设计交底记录表
评论
0/150
提交评论