freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

五子棋人工智能人機(jī)博弈畢業(yè)設(shè)計(jì)-在線瀏覽

2024-08-06 04:20本頁(yè)面
  

【正文】 是否合法,不合法則不作任何操作,合法則改變棋盤(pán)狀態(tài),以及把當(dāng)前玩家更改為另一方。34第5章 面向?qū)ο笤O(shè)計(jì)167。棋盤(pán)類(lèi)(1)屬性board:表示1515棋盤(pán),可用一個(gè)二維數(shù)組表示int board[15][15]。stackPOINT chessStack,記錄下子位置的堆棧,以便于悔棋操作。Undo(),接受玩家的悔棋,恢復(fù)棋盤(pán)到該玩家上次應(yīng)下子的狀態(tài)。LoadBoard(char filename[]),從指定的文件裝入棋局。int IsGameOver()。其C++的類(lèi)定義如下:class CChessBoard{ int board[15][15]。CPlayer *pBlackPlayer,*pWhitePlayer,*pCurrentPlayer。//判斷游戲是否已經(jīng)結(jié)束,沒(méi)有則返回0,否則返回哪方勝利 void NewRound(void)。//所指定位置可以放相當(dāng)?shù)钠遄臃祷豻rue,否則false bool Undo(void)。//保存棋盤(pán)到指定的文件中,如果成功返回truebool LoadBoard(char filename[])。 玩家類(lèi),它表示玩家,它是一個(gè)純虛類(lèi),為“人”、“計(jì)算機(jī)”玩家的公共接口。(2)操作:POINT Think(char board[15][15]),根據(jù)傳入的棋盤(pán)狀態(tài)產(chǎn)生走法。//該玩家所持何子public: virtual POINT Think(char board[][15])=0。 } ~cPlayer()。167。在界面建立時(shí)把設(shè)置玩家對(duì)象的列表框都選擇為人玩家對(duì)象,并建立人玩家對(duì)象,并調(diào)用該函數(shù)在改變?cè)O(shè)置玩家對(duì)象的下拉列表框時(shí)調(diào)用,用來(lái)設(shè)置好玩家對(duì)象。在游戲循環(huán)中,每當(dāng)有一個(gè)玩家由Think()操作得到了一個(gè)下子位置,然后就調(diào)用棋盤(pán)類(lèi)的PutChess()來(lái)下子,該函數(shù)檢查下子位置是否合法,如果不合法,則什么也不做,直接返回。 第6章 詳細(xì)設(shè)計(jì)及編碼167。167。而基于對(duì)話框的程序有自己的消息循環(huán),在消息循環(huán)中要調(diào)用ContinueDodal()函數(shù),幫游戲循環(huán)合適在這一函數(shù)中處理,代碼如下:BOOL CFiveChessDlg::ContinueModal(){ POINT point=Think()。//重繪棋盤(pán) int side=()。}167。如下圖所示: 五子棋程序界面 黑方,白方下拉列表框黑白下拉列表框在CFiveChessDlg類(lèi)中類(lèi)型為CComboBox類(lèi)的成員對(duì)象, 名稱分別為m_boBlack、m_boWhite。 設(shè)置計(jì)算機(jī)智力對(duì)話框 悔棋、新局、保存、載入、退出按鈕在棋盤(pán)類(lèi)(CChessBoard)中用一個(gè)棧來(lái)保存下棋歷史,該棧中數(shù)據(jù)元素為POINT類(lèi)型,悔棋時(shí)進(jìn)行出棧操作,每次出棧兩個(gè)棋子位置,將它們對(duì)應(yīng)棋盤(pán)坐標(biāo)設(shè)置為無(wú)子(NONE)。保存按鈕按下后先彈出一個(gè)保存文件的對(duì)話框。載入與保存一致,先讀取文件標(biāo)識(shí),如果標(biāo)識(shí)不對(duì),則不載入,然后載入棋盤(pán)數(shù)據(jù),再載入歷史棧,然后根據(jù)歷史棧中最后一個(gè)模棋子設(shè)置好當(dāng)前玩家。 棋盤(pán)的繪制棋盤(pán)的繪制在CFiveChessDlg類(lèi)中的重繪函數(shù)(OnPaint)中處理,先用畫(huà)線函數(shù)畫(huà)好棋盤(pán)網(wǎng)格,15*15個(gè)格,從坐標(biāo)(15,15)處繪制,每格30象素。另外,從歷史棧中取出最后一次下子坐標(biāo),將棋子外線用紅色繪制。167。所以該Think操作就是查看鼠標(biāo)是否按下,如果按下則取得按下位置返回。一直在正確位置按下了鼠標(biāo)為止,然后清除掉bMouse標(biāo)志(表示我已經(jīng)下過(guò)棋子了,需要重新接收鼠標(biāo)按下)。167。計(jì)算機(jī)估值也就是對(duì)這種好壞的一個(gè)量化,最簡(jiǎn)單的是靜態(tài)估值,它僅從當(dāng)前棋局來(lái)考慮,五子棋的靜態(tài)估值最簡(jiǎn)單直觀的便是根據(jù)相連的棋子數(shù)來(lái)評(píng)價(jià)棋局好壞。const int MAX_VALUE=99999。//沖2分?jǐn)?shù)const int TWO=40。//沖3分?jǐn)?shù)const int THREE=300。//沖4分?jǐn)?shù)const int FOUR=2000。另外,每個(gè)位置也給予不同的分?jǐn)?shù),如下面數(shù)組所示:const int CEvaluation::m_nPosValue[15][15]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,2,2,2,2,2,2,2,2,2,2,2,1,0}, {0,1,2,3,3,3,3,3,3,3,3,3,2,1,0}, {0,1,2,3,4,4,4,4,4,4,4,3,2,1,0}, {0,1,2,3,4,5,5,5,5,5,4,3,2,1,0}, {0,1,2,3,4,5,6,6,6,5,4,3,2,1,0}, {0,1,2,3,4,5,6,7,6,5,4,3,2,1,0}, {0,1,2,3,4,5,6,6,6,5,4,3,2,1,0}, {0,1,2,3,4,5,5,5,5,5,4,3,2,1,0}, {0,1,2,3,4,4,4,4,4,4,4,3,2,1,0}, {0,1,2,3,3,3,3,3,3,3,3,3,2,1,0}, {0,1,2,2,2,2,2,2,2,2,2,2,2,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }。其定義如下:int value(int board[][15],int side)。計(jì)算值的過(guò)程實(shí)際上就是統(tǒng)計(jì)連續(xù)相同二子,三子,四子,五子的過(guò)程,依次按左下方,下方,右下方,右方掃描棋盤(pán)上每個(gè)棋子連續(xù)相連數(shù)目,然后計(jì)算分?jǐn)?shù),最后加上每個(gè)棋子所在位置的分?jǐn)?shù)。故有一個(gè)重載版的估值函數(shù):int value(int board[][15],int side,int pvalue,int y,int x)。 極大極小值算法有了估值算法,我們可以簡(jiǎn)單地試著產(chǎn)生一個(gè)最大估值的走法,如下圖所示:……12n 深度為1的對(duì)弈樹(shù)根結(jié)點(diǎn)表示當(dāng)前棋盤(pán)局勢(shì),此時(shí)該電腦下子,它試著產(chǎn)生每一種可能走法,對(duì)于五子棋,最多15*15種,每一種走法都用估值引擎估值,如果此時(shí)電腦執(zhí)黑子,它會(huì)選擇估值最大的一種走法(估值引擎中棋局的值是黑方的價(jià)值減去白方的價(jià)值),因?yàn)檫@種走法對(duì)自己最有利,如果執(zhí)白子,則選擇估值最小的走法。 if(side==BLACK) best=MAX_VALUE。 for(int y=0。y++)for(int x=0。x++){ board[y][x]=side。 board[y][x]=NONE。 =。 }}return pos。要讓計(jì)算機(jī)足夠聰明,必須采用某種搜索算法。class CSearch{public: virtual POINT Search(int board[][15],int side,int depth,CEvaluation *pE)=0。在上面深度為1的算法中,我們看到,每一個(gè)結(jié)點(diǎn)產(chǎn)生子結(jié)點(diǎn),要在這子結(jié)點(diǎn)中選擇一個(gè)對(duì)自己最有利的子結(jié)點(diǎn),所以,對(duì)于黑方來(lái)說(shuō),總是選擇子結(jié)點(diǎn)值為最大的結(jié)點(diǎn)來(lái)走,而不會(huì)選擇其它結(jié)點(diǎn),所以,該最大值的子結(jié)點(diǎn)值就是該結(jié)點(diǎn)的值。但是此時(shí)n1……nk的節(jié)點(diǎn)值此時(shí)還不知,比如說(shuō)n1的值必須要通過(guò)計(jì)算n1的子結(jié)點(diǎn)n11……n1k,一直到達(dá)葉子結(jié)點(diǎn)為止,n結(jié)點(diǎn)為黑方,則n1為白方,它會(huì)選擇所有子結(jié)點(diǎn)值為最小的作為自己的結(jié)點(diǎn)值,n2,n3,……,nk結(jié)點(diǎn)的值計(jì)算也一樣,最后,n2,n3,……,nk當(dāng)中最大的一個(gè)結(jié)點(diǎn)就作為n的結(jié)點(diǎn)值,也就是需要確定的走法。 游戲結(jié)束返回估值 深度為0估值返回 Best=極大極小值 for(each possible pos){ board[y][x]=side。 board[y][x]=NONE。 else best=min(value,best)。}CmaxMinSearch類(lèi)在其公共接口中調(diào)用這個(gè)函數(shù),選擇最佳的一個(gè)走法,其Search函數(shù)如下:POINT CMaxMinSearch::Search(int board[][15],int side,int depth,CEvaluation *pe)。167。我們將取極大值節(jié)點(diǎn)(上圖中n)所產(chǎn)生子節(jié)點(diǎn)的最大值用變量alpha表示,如果子節(jié)點(diǎn)(極小值節(jié)點(diǎn))在搜索過(guò)程中,產(chǎn)生的孫子節(jié)點(diǎn)值小于alpha,則子節(jié)點(diǎn)不需要搜索了,這叫做alpha截枝?!璶1n2nknn21n2m…………n2kn為極小值節(jié)點(diǎn)(白方)n1到nk為極大值節(jié)點(diǎn)(黑方)n1=20n11=33 Beta 截枝再來(lái)看另一方的情況,如上圖(圖83)情況與圖81相反,n為取極小值節(jié)點(diǎn),它的某子節(jié)點(diǎn)的值為20(n1),搜索其后繼子節(jié)點(diǎn),如圖中的n2,n2的子節(jié)點(diǎn)中某子節(jié)點(diǎn)n21的值為33,而n2取極大值,n2的值至少為33,故n2的父節(jié)點(diǎn)不可能選擇n2,所以n2中一旦搜索發(fā)現(xiàn)其子節(jié)點(diǎn)值大于兄弟節(jié)點(diǎn)中的最小值,就沒(méi)有搜索必要了。再推而廣之,任何一層取最小值的節(jié)點(diǎn),它的子節(jié)點(diǎn)值大于beta,則應(yīng)該截枝。 到葉子節(jié)點(diǎn)估值返回。 board[y][x]=side。 board[y][x]=NONE。//子節(jié)
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1