版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、優(yōu)選文檔中國象棋游戲開發(fā)設計報告班級:小組編號:小組成員:指導老師:.優(yōu)選文檔一、開發(fā)的目的和意義面向對象程序設計作為一門軟件設計的課程,擁有極強的實踐性,要修業(yè)生具備靈便應用理論知識的能力及面向對象程序設計技術的基礎。經過游戲開發(fā),學生能認識C+面向對象的設計方法與技巧,有效地、深刻地理解課程內容,領悟理論、方法和設計原則,培養(yǎng)解析實責問題和解決問題的能力,具備使用面向對象程序設計開發(fā)工具設計實質系統(tǒng)的能力。還能夠夠認識并經過使用MFC,掌握一種可視化編程的方法,并經過游戲的開發(fā)加深對可視化編程的理解。同時,能夠提高運用C+編程語言解決實責問題的能力。棋牌游戲屬于休閑類游戲,擁有上手快、游戲
2、時間短的特點,更利于用戶進行放松休閑,為人們所喜歡,特別是棋類游戲,方便、快捷、操作簡單,在休閑娛樂中占主要地址。中國象棋作為中國自古以來的經典棋牌游戲之一,素來都是人之間的較量,將中國象棋制作成游戲,能夠實現人與計算機之間的棋戰(zhàn)。而且人工智能是綜合性很強的一門邊緣學科,它的中心任務是研究如何使計算機去做那些過去只能靠人的智力才能做的工作。開發(fā)出了計算機象棋游戲,今后不能是能夠進行休閑游戲,還能夠鍛煉自己的智力和象棋技術,更加方便了人們的平時生活。二、功能描述和解析(用戶需求解析)2.1開發(fā)背景我們周圍有好多同學喜歡下象棋,特別是男同學,希望能有人能夠和自己下象棋,但這種意愿常由于碰到條件的限
3、制而難以如愿,比方說需要身邊恰巧有現成的棋盤棋子,比方說需若是同樣懂得中國象棋的對手,但是大家都知道我們這所大學男性同學占少許,即即是條件都滿足了,還要考慮這位對手可否有何自己下棋的心情。這時,若是有一臺計算機,一個能夠支持人機棋戰(zhàn)的程序,上面的問題瓜熟蒂落。而我們小組的這個想起游戲設計,正是希望能夠做出一款擁有優(yōu)異性能,優(yōu)異的智能,能夠滿足大多數愛好象棋的同學的需求中國象棋人機棋戰(zhàn)程序。2.2用戶需求解析一款能夠與用戶棋戰(zhàn),滿足用戶需求的中國象棋程序,需要有棋盤棋子的場面、鼠標響應控制棋子搬動、棋子的走法規(guī)則、人機棋戰(zhàn)的找尋算法、防備異常引入的多線程、勝敗判斷,詳盡解析以下:棋盤棋子的場面作
4、為中國象棋的這項游戲,其必不能少的是就是棋子和棋盤,沒有這兩個部分,想起功能無法實現,不能是這樣,若是,可是有棋子和棋盤,而沒有將兩者結合起來,那么,也將無法實現中國象棋的游戲功能,所以,棋子和棋盤.優(yōu)選文檔的設計在這個游戲設計中至關重要。鼠標響應在棋戰(zhàn)中,棋子是必定能夠搬動的,不然游戲無法進行。所以,鼠標左鍵點擊是必不能少的一部分。棋子的功能解析:中國象棋中各色的象棋棋子的功能使象棋擁有了真切的興趣性,中國象棋的棋子的種類大體分為:帥(將)、士、象、馬、車、炮、兵(卒)等幾個種類。帥(將):紅方中的帥和黑方中的將的功能同樣,都是只幸虧九宮格中進行橫向和豎向的搬動,每次搬動一格,而且不能夠搬動
5、超出九宮格,帥和將不能夠見面。士:士在整片棋盤中,和帥的搬動范圍近似,也是只幸虧九宮格中搬動,但是士的搬動方向是對角線,而且每次只幸虧一個格子中搬動。象:象的走法依照“象走田”的原則,不能夠絆象腿。馬:馬的走法依照“馬走日”的原則,不能夠絆馬腿。車:在整塊棋盤中,車能夠橫向或縱向3搬動任意格。炮:每次搬動和車的近似,但是在吃對方棋子的時候必定中間有且只能有一個棋子的間隔。兵(卒):紅方的兵和黑方的卒的功能同樣,特點是只能向對方前進,而不能夠退后,過河從前不能夠橫向搬動,過河此后能夠橫向搬動,無論是前進還是橫向搬動,每次都只能搬動一格。優(yōu)異的人機棋戰(zhàn)要實現人機的棋戰(zhàn),找尋算法是很重要的一部分。關
6、于棋類棋戰(zhàn)程序中的找尋算法,已有成熟的Alpha-Beta找尋算法。我們在程序中直接借鑒了Alpha-Beta找尋算法并輔以歷史啟示。Alpha-Beta找尋算法:在中國象棋里,兩方棋手獲得同樣的棋盤信息。他們輪流走棋,目的就是吃掉對方的將或帥,也許防備自己的將或帥被吃。找尋算法的找尋過程很漫長,所以對找尋算法進行簡化是有必要的。多線程的必要性由于程序在進行找尋時會占用大量的CPU時間,所以擁塞了位于同一線程內的其他指令,使之無法正常工作,所以引入了多線程的思想別的開一個線程,讓各程序分開于多個線程。就可以解決程序異常的問題了,所以,多線程思想的引入是有必要的。判斷勝敗游戲需要判斷最后由誰勝出
7、.優(yōu)選文檔三、采用的開發(fā)工具和技術,開發(fā)環(huán)境,適用環(huán)境開發(fā)工具:VisualC+MFC工程;開發(fā)環(huán)境:win7;適用環(huán)境:windows系統(tǒng);四、小組成員分工初始化、場面設計部分(賀景);判斷勝敗、棋子走法部分(鄒京甫);鼠標響應、繪圖部分(吳鑫);找尋引擎部分等由組員共同達成。五、詳盡開發(fā)方法和過程5.1初始化部分OnInitDialog()負責的是對話框的初始化。能夠把有關中國象棋的棋局初始化狀況也放在了這里面。初始化的內容包括:對引擎部分所用到的變量的初始化。包括對棋盤上的棋子地址進行初始化(棋盤數組的初始化),對找尋深度、當前走棋方標志、棋局可否結束標志等的初始化;對棋盤、棋子的貼圖地
8、址(即棋盤、棋子在程序中實質顯示地址)的初始化;對程序協助部分所用到的一些變量的初始化。棋盤、棋子樣式的默認形式,以及著法名稱列表的初始化等。1.對棋盤的初始化memcpy(m_byChessBoard,InitChessBoard,90);2.對棋盤、棋子的貼圖地址(即棋盤、棋子在程序中實質顯示地址)的初始化;MemDC.SelectObject(&pOldBmp);/恢復內存Dc的原位圖3.對程序協助部分所用到的一些變量的初始化棋盤、棋子樣式的默認形式,下棋模式的默認選擇,以及著法名稱列表的初始化等。初始化部分的代碼以下:BOOLCChessDlg:OnInitDialog()CDialo
9、g:OnInitDialog();AddAbout.menuitemtosystemmenu.IDM_ABOUTBOXmustbeinthesystemcommandrange.優(yōu)選文檔ASSERT(IDM_ABOUTBOX&0 xFFF0)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOXAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);SetIcon(m_hIcon,TRUE);/SetbigiconSetIcon(m_hIcon,FALSE);/Setsma
10、llicon/彩色進度條設置m_progressThink.SetStartColor(RGB(0 xFF,0 xFF,0 x00);/黃色m_progressThink.SetEndColor(RGB(0 x00,0 x93,0 x00);/綠色m_progressThink.SetBkColor(RGB(0 xE6,0 xE6,0 xFA);/淡紫色m_progressThink.SetTextColor(RGB(0,0,255);m_progressThink.ShowPercent(1);m_tooltip.Create(this);m_tooltip.Activate(1);m_Ch
11、essman.Create(IDB_CHESSMAN,36,14,RGB(0,255,0);/創(chuàng)辦含有棋子圖形的ImgList,用于繪制棋子/下面這段代碼取棋盤圖形的寬,高BITMAPBitMap;m_BoardBmp.LoadBitmap(IDB_CHESSBOARD);m_BoardBmp.GetBitmap(&BitMap);/取BitMap對象m_nBoardWidth=BitMap.bmWidth;/棋盤寬度m_nBoardHeight=BitMap.bmHeight;/棋盤高度m_BoardBmp.DeleteObject();memcpy(m_byChessBoard,InitC
12、hessBoard,90);/初始化棋盤memcpy(m_byShowChessBoard,InitChessBoard,90);memcpy(m_byBackupChessBoard,InitChessBoard,90);m_pSE-SetSearchDepth(3);/設定找尋層數為3m_pSE-SetMoveGenerator(m_pMG);/給找尋引擎設定走法產生器m_pSE-SetEveluator(m_pEvel);/給找尋引擎設定估值核心m_pSE-SetUserChessColor(m_nUserChessColor);/設定用戶為黑方或紅方.優(yōu)選文檔m_pSE-SetThin
13、kProgress(&m_progressThink);/設定進度條m_MoveChess.nChessID=NOCHESS;/將搬動的棋子清空returnTRUE;/returnTRUEunlessyousetthefocustoacontrol5.2場面設計游戲設計中,我們的象棋棋盤采用的是直接加載位圖生成棋盤,圖片的大小是寬度377*高度417,棋盤上每個格子的大?。?9*39,圖片格式為:BMP。棋子部分是經過加載位圖實現的,圖片的大小是:寬度32*高度32,圖片的格式也是BMP。我們用一個10*9的數組來儲藏棋盤上的信息,數組的每個元素儲藏棋盤上可否有棋子。棋盤的初始狀況以下所示(圖
14、1是整個棋盤與棋子的場面圖):constBYTEInitChessBoard109=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,NO
15、CHESS,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
16、,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;.優(yōu)選文檔圖1場面設計圖棋子的定義:#defineNOCHESS0/沒有棋子#defineB_KING1/黑帥#defineB_CAR2/黑車#defineB_HORSE3/黑馬#defineB_CANON4/黑炮#defineB_BISHOP5/黑士#defineB_E
17、LEPHANT6/黑象#defineB_PAWN7/黑卒#defineB_BEGINB_KING#defineB_ENDB_PAWN#defineR_KING8/紅將#defineR_CAR9/紅車#defineR_HORSE10/紅馬#defineR_CANON11/紅炮#defineR_BISHOP12/紅士#defineR_ELEPHANT13/紅相#defineR_PAWN14/紅兵#defineR_BEGINR_KING#defineR_ENDR_PAWN#defineIsBlack(x)(x=B_BEGIN&x=R_BEGIN&x=R_END)/判斷某個棋子可否是紅色。/判斷兩個棋
18、子可否是同色#defineIsSameSide(x,y)(IsBlack(x)&IsBlack(y)|(IsRed(x)&IsRed(y)/棋子地址typedefstructBYTEx;BYTEy;CHESSMANPOS;5.3繪圖部分關于繪圖部分,主要實現的是程序界面的繪圖所以我們在這里將要達成棋盤、棋子的顯示走棋初步地址和目標地址的提示框的顯示。而要實現這些我們必定經過voidCChessDlg:OnPaint()這個函數實現voidCChessDlg:OnPaint()CPaintDCdc(this);CDCMemDC;inti,j;POINTpt;CBitmap*pOldBmp;Mem
19、DC.CreateCompatibleDC(&dc);m_BoardBmp.LoadBitmap(IDB_CHESSBOARD);pOldBmp=MemDC.SelectObject(&m_BoardBmp);/繪制棋盤上的棋子for(i=0;i10;i+)for(j=0;j9;j+)if(m_byShowChessBoardij=NOCHESS)continue;pt.x=j*GRILLEHEIGHT+14;pt.y=i*GRILLEWIDTH+15;m_Chessman.Draw(&MemDC,m_byShowChessBoardij-1,pt,ILD_TRANSPARENT);/繪制用戶
20、正在拖動的棋子.優(yōu)選文檔if(m_MoveChess.nChessID!=NOCHESS)m_Chessman.Draw(&MemDC,m_MoveChess.nChessID-1,m_MoveChess.ptMovePoint,ILD_TRANSPARENT);dc.BitBlt(0,0,m_nBoardWidth,m_nBoardHeight,&MemDC,0,0,SRCCOPY);/將制的內容刷新到屏幕MemDC.SelectObject(&pOldBmp);/恢復內存Dc的原位MemDC.DeleteDC();/放內存m_BoardBmp.DeleteObject();/除棋位象5.4
21、鼠響部分鼠響部分包括LButtonDown和LButtonUp兩個功能,LButtonDown的主要功能是拖棋子在棋上的移,他的重要性是,若是沒有個功能,將無法走棋,其函數通:voidCChessDlg:OnLButtonDown(UINTnFlags,CPointpoint)LButtonUp個函數主要的功能是:拖棋子完后放置到拖后的地址,行家放置的程中,需要使用一個Drop的放函數。函數通:voidCChessDlg:OnLButtonUp(UINTnFlags,CPointpoint)5.5棋子走法typedefstructshortnChessID;/表示是什么棋子CHESSMANPO
22、SFrom;/初步地址CHESSMANPOSTo;/走到什么地址intScore;/走法的分數CHESSMOVE;在著法生成器中,采用的基本思想就是遍整個棋(一個接一個地看棋上的每個地址點),當有當前下棋方的棋子先判斷它是何種型的棋子,爾后依照其棋子型而相地找出其全部合法著法并存入著法列。里到的“合法著法”包括以下幾點:1、各棋子按其行子行子。如跳“日”字、象走“田”字、士在九.優(yōu)選文檔宮內斜行等等(這里需要特別注意的是卒(兵)的行子規(guī)則會隨其所在地址的不同樣而發(fā)生變化過河后能夠左右平移)。2、行子不能夠越出棋盤的界限。自然全部棋子都不能夠走到棋盤的外面,同時某些特定的棋子還有自己的行棋界限,
23、如將、士不能夠出九宮,象不能夠過河。3、行子的半路上不能夠有其他子阻截(除了炮需要隔一個子才能打子之外)以及行子的目的點不能夠有本方的棋子。4、將帥不能夠見面(本程序中只在生成計算機的著法時認為將帥見面是非法的,而對用戶所走的以致將帥見面的著法其實不認為其非法,而可是產生敗局罷了)。產生了著法后要將其存入著法隊列以供找尋之用,由于找尋會找尋多層,所以在把著法存入著法隊列的時候還要同時儲藏該著法所屬的找尋層數。所以能夠將著法隊列定義為二維數組,其中第一個數組下標為層數,第二個數組下標為每一層的全部著法數。著法生成中的各個棋子走法以及其他規(guī)則代碼見MoveGenerator.cpp。棋子的搬動由以
24、下的函數分別執(zhí)行:帥(將):VoidCMoveGenerator:Gen_KingMove()士:紅士voidCMoveGenerator:Gen_RBishopMove()黑士voidCMoveGenerator:Gen_BBishopMove()象:voidCMoveGenerator:Gen_ElephantMove()馬:voidCMoveGenerator:Gen_HorseMove()車:voidCMoveGenerator:Gen_CarMove()炮:voidCMoveGenerator:Gen_CanonMove()兵(卒):.優(yōu)選文檔紅兵voidCMoveGenerator
25、:Gen_RPawnMove()黑卒voidCMoveGenerator:Gen_BPawnMove()5.6找尋算法我們用一棵象棋樹來表示下棋的過程:樹中每一個結點代表棋盤上的一個場面,對每一個場面依照不同樣的走法又產生不同樣的場面。該象棋樹包括三各種類的結點:奇數層的中間結點以及根結點,表示輪到紅方走棋;偶數層的中間結點,表示輪到黑方走棋;葉子結點,表示棋局結束。結合上面所講的樹,若給每個結點都打一個分值來議論其對應的場面,我們經過估值引擎SetEveluator()來實現,過比較該分值的大小來判斷場面的利害。voidSetEveluator(CEveluation*pEval)m_pEv
26、al=pEval;假設甲乙兩方下棋,甲勝的場面是一個極大值(一個很大的正數),那么乙勝的場面就是一個極小值(極大值的負值),和棋的場面則是零值(或是湊近零的值)。這樣,當輪到甲走棋時他會盡可能地讓場面上的分值大,相反輪到乙走棋時他會選盡可能地讓場面上的分值小。反響到博弈樹上,即若是假設奇數層表示輪到甲方走棋,偶數層表示輪到乙方走棋。那么由于甲方希望棋盤上的分值盡可能大,則在偶數層上會優(yōu)選分值最大的結點偶數層的結點是甲走完一步棋此后的棋盤場面,反響了甲方對棋局形勢的要求。同樣道理,由于乙方希望棋盤上的分值盡可能小,那么在奇數層上會選擇分值最小的結點。這是“最小-最大”(Minimax)的基本思想
27、。這樣找尋函數在估值函數的協助下能夠經過在奇數層選擇分值最大(最?。┑慕Y點,在偶數層選擇分值最?。ㄗ畲螅┑慕Y點的方式來找尋以當前場面為根結點、限制找尋層數以內的整棵樹來獲得一個最正確的著法。下面是“最大-最小”的主要代碼intCNegaMaxEngine:NegaMax(intnDepth).優(yōu)選文檔intcurrent=-20000;intscore;intCount,i;BYTEtype;i=IsGameOver(CurPosition,nDepth);/檢查棋局可否結束if(i!=0)returni;/棋局結束,返回極大/極小值if(nDepthEveluate(CurPosition,
28、(m_nMaxDepth-nDepth)%2,m_nUserChessColor);/列舉當前棋局下一步全部可能的走法Count=m_pMG-CreatePossibleMove(CurPosition,nDepth,(m_nMaxDepth-nDepth)%2,m_nUserChessColor);if(nDepth=m_nMaxDepth)/在根節(jié)點設定進度條m_pThinkProgress-SetRange(0,Count);m_pThinkProgress-SetStep(1);for(i=0;iStepIt();/走進度條type=MakeMove(&m_pMG-m_MoveList
29、nDepthi);/依照走法產生新場面score=-NegaMax(nDepth-1);/遞歸調用負極大值找尋下一層節(jié)點UnMakeMove(&m_pMG-m_MoveListnDepthi,type);/恢復當前場面if(scorecurrent)/若是score大于已知的最大值current=score;/更正當前最大值為scoreif(nDepth=m_nMaxDepth)m_cmBestMove=m_pMG-m_MoveListnDepthi;/湊近根部時保留最正確走法.優(yōu)選文檔returncurrent;/返回極大值“最小-最大”思想再加上“樹的裁剪”就是Alpha-Beta找尋算法
30、的核心。最基本的Alpha-Beta算法的代碼以下:intCAlphaBetaEngine:AlphaBeta(intnDepth,intalpha,intbeta)intscore;intCount,i;BYTEtype;i=IsGameOver(CurPosition,nDepth);/檢查可否游戲結束if(i!=0)returni;/結束,返回估值/葉子節(jié)點取估值if(nDepthEveluate(CurPosition,(m_nMaxDepth-nDepth)%2,m_nUserChessColor);此函數找出當前場面全部可能的走法,爾后放進m_pMG-m_MoveList中間Cou
31、nt=m_pMG-CreatePossibleMove(CurPosition,nDepth,(m_nMaxDepth-nDepth)%2,m_nUserChessColor);if(nDepth=m_nMaxDepth)/在根節(jié)點設定進度條m_pThinkProgress-SetRange(0,Count);m_pThinkProgress-SetStep(1);/對全部可能的走法for(i=0;iStepIt();/走進度條type=MakeMove(&m_pMG-m_MoveListnDepthi);/將當前場面應用此走法,變?yōu)樽庸?jié)點的場面score=-AlphaBeta(nDepth-
32、1,-beta,-alpha);/遞歸找尋子節(jié)點UnMakeMove(&m_pMG-m_MoveListnDepthi,type);/將此節(jié)點.優(yōu)選文檔的場面恢復為當前節(jié)點if(scorealpha)alpha=score;/保留極大值/湊近根節(jié)點時保留最正確走法if(nDepth=m_nMaxDepth)m_cmBestMove=m_pMG-m_MoveListnDepthi;if(alpha=beta)break;/剪枝,放棄找尋剩下的節(jié)點returnalpha;/返回極大值Alpha-Beta找尋算法是在“最小-最大”的基礎上引入“樹的裁剪”的思想以期提高效率,它的效率將在很大程度上取決
33、于樹的結構若是找尋了沒多久就發(fā)現能夠進行“裁剪”了,那么需要解析的工作量將大大減少,效率自然也就大大提高;而若是直至解析了全部的可能性此后才能做出“裁剪”操作,那此時“裁剪”也已經失去了它原有的價值(由于你已經解析了全部狀況,這時的Alpha-Beta找尋已和“最小-最大”找尋別無二致了)。所以,要想保證Alpha-Beta找尋算法的效率就需要調整樹的結構,即調整待找尋的結點的序次,使得“裁剪”能夠盡可能早地發(fā)生。能夠依照部分已經找尋過的結果來調整將要找尋的結點的序次。由于,平時當一個場面經過找尋被認為較好時,其子結點中經常有一些與它相似的場面(如個別沒關緊迫的棋子地址有所不同樣)也是較好的。
34、由J.Schaeffer所提出的“歷史啟示”(HistoryHeuristic)就是建立在這樣一種見解之上的。在找尋的過程中,每當發(fā)現一個好的走法,就給該走法累加一個增量以記錄其“歷史得分”,一個多次被找尋并認為是好的走法的“歷史得分”就會較高。關于立刻找尋的結點,依照“歷史得分”的高低對它們進行排序,保證較好的走法(“歷史得分”高的走法)排在前面,這樣Alpha-Beta找尋就可以盡可能早地進行“裁剪”,從而保證了找尋的效率。關于著法的排序能夠使用各種排序算法,在程序中采用了歸并排序。歸并排序的空間復雜度為O(n),時間復雜度為O(nlog2n),擁有較高的效率。歷史啟示部分的主要代碼以下:
35、voidCHistoryHeuristic:ResetHistoryTable()memset(m_HistoryTable,10,8100*4);intCHistoryHeuristic:GetHistoryScore(CHESSMOVE*move).優(yōu)選文檔intnFrom,nTo;nFrom=move-From.y*9+move-From.x;/原始地址nTo=move-To.y*9+move-To.x;/目標地址returnm_HistoryTablenFromnTo;/返回歷史得分5.7多線程由于程序出現了異常:有時對用戶方的功能完好正確,而對電腦方的有些功能卻不起作用,這是由于程序
36、在進行找尋時會占用大量的CPU時間,所以擁塞了位于同一線程內的其他指令,使之無法正常工作,所以我們引入了多線程的思想別的開一個線程,讓各程序分開于多個線程。函數原型:CWinThread*AfxBeginThread(AFX_THREADPROCThinkProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);該函數啟動一個新的線程并返回一個指向該新線程對象的指針,爾后新的線程與啟動
37、該新線程的線程同時運行。該函數的第一個參數AFX_THREADPROCThinkProc指定了線程函數。線程函數的內容即為新線程所要執(zhí)行的內容,線程函數執(zhí)行達成,新線程結束(自動銷毀)。線程函數必定被定義為全局函數,其返回值種類必定是UINT,必定有一個LPVOID種類的參數。能夠把調用引擎部分的找尋函數的代碼以及達成走棋動作的代碼放入所定義的思慮線程內,以下:DWORDWINAPIThinkProc(LPVOIDpParam)CChessDlg*pDlg=(CChessDlg*)pParam;pDlg-Think();return0;爾后,只要將本來調找尋函數并達成走棋的代碼代之以調用Afx
38、BeginThread來啟動新線程即可,實現了程序的多線程,不能夠正常工作的問題也就隨之解決了。5.8判斷勝敗紅方的帥被吃,也許黑方的將被吃,游戲結束,判斷被吃的一方輸。詳盡代碼以下:intCChessDlg:IsGameOver(BYTEposition9)inti,j;.優(yōu)選文檔BOOLRedLive=FALSE,BlackLive=FALSE;/檢查紅方九宮可否有帥for(i=7;i10;i+)for(j=3;j6;j+)if(positionij=B_KING)BlackLive=TRUE;if(positionij=R_KING)RedLive=TRUE;/檢查黑方九宮可否有將for(i=0;i3;i+)for(j=3;j6;j+)if(positionij=B_KING)BlackLive=TRUE;if(positionij=R_KING)RedLive=TRUE;if(m_nUserChessColor=REDCHESS)if(!RedLive)return1;if(!Black
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- QC/T 686-2024摩托車和輕便摩托車發(fā)動機組合式曲軸連桿總成
- 2025-2030年中國智能公交行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 新形勢下餐飲食材配送行業(yè)可持續(xù)發(fā)展戰(zhàn)略制定與實施研究報告
- 2025-2030年中國有色金屬礦產采選行業(yè)開拓第二增長曲線戰(zhàn)略制定與實施研究報告
- 高層領導戰(zhàn)略管理培訓課件
- 四川省綿陽市2024屆高三下學期第三次診斷性考試(三模)英語試題
- 中國錄音復制行業(yè)競爭格局分析及投資戰(zhàn)略咨詢報告
- 一年級數學(上)計算題專項練習匯編
- 實驗小學學年第一學期班主任參考計劃二年級3班
- 疫情防控視角下的社區(qū)多元主體協同治理研究
- 2024年危險化學品生產經營單位其他從業(yè)人員考試題庫附答案
- 信號分析與處理課程設計課程教學大綱基本要求及規(guī)范(集中實踐環(huán)節(jié))
- 2024年中考物理真題及分類匯編-考點25:磁現象-電生磁
- 2024年更新版:精準農業(yè)無人機植保服務合同
- 2024年度中國醫(yī)院人力資源現狀調研報告
- 【MOOC】有機化學-華中農業(yè)大學 中國大學慕課MOOC答案
- 二水石膏轉化為半水石膏的研究
- 中醫(yī)特色治療進修匯報
- 闌尾炎內鏡治療
- 《2025年日歷》電子版模板年歷月歷工作學習計劃橫版整年帶農歷
- 2023-2024學年廣東省廣州市白云區(qū)九年級(上)期末語文試卷
評論
0/150
提交評論