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

正文內(nèi)容

中國象棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)畢業(yè)論文-閱讀頁

2025-07-13 02:50本頁面
  

【正文】 //裁剪return beta。}return alpha。因而,要想保證 AlphaBeta 搜索算法的效率就需要調(diào)整樹的結(jié)構(gòu),即調(diào)整待搜索的結(jié)點(diǎn)的順序,使得“裁剪”可以盡可能早地發(fā)生。因?yàn)?,通常?dāng)一個(gè)局面經(jīng)過搜索被認(rèn)為較好時(shí),其子結(jié)點(diǎn)中往往有一些與它相似的局面(如個(gè)別無關(guān)緊要的棋子位置有所不同)也是較好的。在搜索的過程中,每當(dāng)發(fā)現(xiàn)一個(gè)好的走法,就給該走法累加一個(gè)增量以記錄其“歷史得分” ,一個(gè)多次被搜索并認(rèn)為是好的走法的“歷史得分”就會較高。對于著法的排序可以使用各種排序算法,在程序中采用了歸并排序。 局面評估前文已經(jīng)講過了棋局表示、著法生成、搜索算法(包括搜索輔助) , 在象棋程序中如果說搜索算法是心臟,那么局面評估就是大腦。因而搜索與局面評估是整個(gè)下棋引擎的核心。就不同的棋類可能要考慮的因素略有差異。通俗地講就是一個(gè)棋子它值個(gè)什么價(jià)。所以在評估局面時(shí),首先要考慮雙方的子力總和的對比。棋子位置棋子位置,或稱控制區(qū)域,是指某一方的棋子在棋盤上所占據(jù)(控制)的位置。棋子的機(jī)動性棋子的機(jī)動性指棋子的靈活度(可移動性) 。同樣四面被憋馬腿的死馬機(jī)動性也較差(對于一步也不能走的棋子,可以認(rèn)為其機(jī)動性為零) 。如:一個(gè)馬可能在對方的炮的攻擊之下同時(shí)它又攻擊著對方的車。對于子力打分和控制區(qū)域打分,只要遍歷棋盤,當(dāng)遇到棋子時(shí)簡單地去查事先定義好的“子力價(jià)值表”和“控制區(qū)域價(jià)值表” ,取出相對應(yīng)的值進(jìn)行累加即可(這些值的具體設(shè)定參考了前人的程序并作了適當(dāng)?shù)恼{(diào)整,今后仍應(yīng)根據(jù)電腦下棋所反映出的實(shí)際問題對這些值作適當(dāng)修改) 。 對棋子間相互關(guān)系的打分,要用到以下幾個(gè)數(shù)據(jù):int m_BaseValue[15]。 //存放棋子靈活性分值short m_AttackPos[10][9]。 //存放每一位置被保護(hù)的信息BYTE m_FlexibilityPos[10][9]。 //存放每一位置上棋子的總價(jià)值其中計(jì)算機(jī)會進(jìn)行所有棋子值的判斷,AttackPos 和 GuardPos 分別記錄該棋子受到的威脅和被保護(hù)的值。之后,再根據(jù)關(guān)系表來具體考察棋子的相互關(guān)系,進(jìn)行關(guān)系打分。其次,對一個(gè)普通子,當(dāng)它既受到攻擊又受到保護(hù)的時(shí)候要注意如下幾個(gè)問題:攻擊者子力小于被攻擊者子力,攻擊方將愿意換子。多攻擊\單保護(hù)的情況,并且攻擊者最小子力小于被攻擊者子力與保護(hù)者子力之和,則攻擊方可能以一子換兩子。攻擊方與保護(hù)方數(shù)量相同,并且攻擊者子力小于被攻擊者子力與保護(hù)者子力之和再減去保護(hù)者中最大子力,則攻擊方可能以 n 子換 n 子。而且,在程序中并沒有直接地重新考慮雙方兌子之后的控制區(qū)域及機(jī)動性變化情況(之所以說沒有“直接地重新考慮” ,是因?yàn)樗阉骼^續(xù)展開結(jié)點(diǎn)后仍會考慮這些因素,只是目前不知這樣效果是否受影響——考察這兩種方法在效果上的差異需要一定數(shù)量的試驗(yàn)數(shù)據(jù)的支持) 。 程序組裝至此,已具備了實(shí)現(xiàn)一款中國象棋對弈程序引擎部分的所有要素,將上述 頭文件。包括棋盤局面和著法的表示。就當(dāng)前局面生成某一方所有合法著法。使用搜索求出最佳著法。AlphaBeta 搜索之補(bǔ)充,以提高搜索效率。對著法按其歷史得分進(jìn)行降序排序,以提高搜索效率。為某一特定局面進(jìn)行評分。同樣,程序顯示計(jì)算機(jī)走棋的起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)來做出回應(yīng)) 。這種連接方式實(shí)現(xiàn)起來非常簡單。主要工作都在對話框類的兩個(gè)文件 和 下展開??梢园延嘘P(guān)中國象棋的棋局初始化情況也放在了這里面。包括對棋盤上的棋子位置進(jìn)行初始化(棋盤數(shù)組的初始化) ,對搜索深度、當(dāng)前走棋方標(biāo)志、棋局是否結(jié)束標(biāo)志等的初始化;對棋盤、棋子的貼圖位置(即棋盤、棋子在程序中實(shí)際顯示位置)的初始化;對程序輔助部分所用到的一些變量的初始化。二、繪圖部分void CCChessUIDlg::OnPaint() {……}OnPaint()函數(shù)負(fù)責(zé)的是程序界面的繪圖。由于棋盤、棋子等都是以位圖的形式給出的。需要注意的是由于位圖文件不能像 GIF 文件那樣有透明的背景并且棋子是圓形的而位圖文件只能是矩形的,所以如果直接貼圖的話會在棋盤上留下一塊白色的邊框——棋子的背景。三、走棋部分(用戶動作響應(yīng)部分)為 WM_LBUTTONDOWN 消息添加消息響應(yīng)事件,可得到如下函數(shù):void CCChessUIDlg::OnLButtonDown(UINT nFlags, CPoint point){……}當(dāng)用戶在窗口客戶區(qū)按下鼠標(biāo)左鍵時(shí),程序就會調(diào)用 OnLButtonDown(UINT nFlags, CPoint point)函數(shù)來進(jìn)行響應(yīng)??梢酝ㄟ^這一信息來得知用戶的走法。如果之前用戶已經(jīng)選過了棋子,那么這一次的點(diǎn)擊(如果不是另選本方的其它棋子的話)表達(dá)了用戶的一次走棋過程。緊接著調(diào)用引擎的搜索函數(shù)計(jì)算出計(jì)算機(jī)對用戶著法的應(yīng)著,然后執(zhí)行該應(yīng)著。以上三部分并非界面程序的全部,而僅僅是與程序密切相關(guān)的部分。 多線程如采用單線程方式,按照如下順序編寫代碼:用戶走棋 —〉計(jì)算機(jī)思考并走棋按這種方式編寫的程序似乎毫無問題,程序運(yùn)行一切正常。解決方案就是另外開一個(gè)線程,讓各程序分開于多個(gè)線程。該函數(shù)啟動一個(gè)新的線程并返回一個(gè)指向該新線程對象的指針,然后新的線程與啟動該新線程的線程同時(shí)運(yùn)行。線程函數(shù)的內(nèi)容即為新線程所要執(zhí)行的內(nèi)容,線程函數(shù)執(zhí)行完畢,新線程結(jié)束(自動銷毀) ??梢园颜{(diào)用引擎部分的搜索函數(shù)的代碼以及完成走棋動作的代碼放入所定義的思考線程內(nèi),如下:DWORD WINAPI ThinkProc(LPVOID pParam){CChessDlg* pDlg=(CChessDlg*)pParam。 //計(jì)算機(jī)思考并走棋return 0。 著法名稱顯示每當(dāng)下棋方(用戶或是計(jì)算機(jī))走一步棋,在棋盤旁邊的一個(gè)列表框控件(List Box)中按照中國象棋關(guān)于著法描述的規(guī)范要求顯示出該著法的名稱。為了獲得該著法名稱,寫了一個(gè)六百余行的函數(shù)。由于該函數(shù)主要涉及的是中國象棋關(guān)于著法表示的規(guī)范要求,故在此不對其具體實(shí)現(xiàn)做額外的解釋。首先,在 ChessDlg 下定義以下函數(shù):thisGetMoveStr(nFromX,nFromY,nToX,nToY,nSourceID)。當(dāng)列表框中的項(xiàng)的數(shù)目超過列表框的顯示范圍時(shí),列表框會自動添加垂直滾動條(前提是其 VerticalScrollbar 屬性要為 True——該屬性默認(rèn)即為True) 。在控件屬性里選擇 Vertical Scroll,使得列表框可垂直滾動以顯示最新的著法名稱。減一之后正好是最后一項(xiàng)的行號。要實(shí)現(xiàn)悔棋和還原功能,首先要明確哪些信息應(yīng)當(dāng)被保存以供悔棋和還原所使用。這里需要特別說明的是通常象棋程序處于程序效率的考慮并不保存所有棋子的信息,而只是保存之前一步的走棋信息。然而,在編寫自己的程序時(shí)一來考慮到程序的可讀性和不易出錯(cuò)性,二來考慮到對當(dāng)今的計(jì)算機(jī)的配置來說這點(diǎn)開銷基本上不會對程序的效率產(chǎn)生什么影響。根據(jù)所要保存的數(shù)據(jù)定義了如下基本結(jié)構(gòu)類型:typedef struct{CHESSMOVE cmChessMove。//被吃掉的棋子}UNDOMOVE。還原功能是與悔棋功能相對應(yīng)的,只有當(dāng)產(chǎn)生了悔棋功能之后,還原功能才會被激活。在悔棋中主要完成了以下任務(wù):;,以供還原所用;,恢復(fù)到當(dāng)前局面,然后將其從隊(duì)列中剔除掉;列,以供還原所用。而在還原中所做的剛好和悔棋相反:;,以供悔棋所用;,恢復(fù)到當(dāng)前局面,然后將其從隊(duì)列中剔除;(兩項(xiàng),因?yàn)槊炕睾蠒a(chǎn)生兩步著法) ,將其重新顯示到列表框中。以上便是悔棋和還原功能所完成的具體操作,其代碼分別寫入悔棋和還原按鈕(Button)的事件處理函數(shù)中。下面簡單介紹一下象棋相關(guān)規(guī)則:對局時(shí),由執(zhí)紅棋的一方先走,雙方輪流各走一著,直至分出勝、負(fù)、和,對局即終了。雙方各走一著,稱為一個(gè)回合。各種棋子的走法:*帥(將):帥和將是棋中的首腦,是雙方竭力爭奪的目標(biāo)。帥與將不能在同一直線上直接對面,否則走方判負(fù)。它的行棋路徑只能是九宮內(nèi)的斜線。它的走法是每次循對角線走兩格,俗稱’象走田‘。 *車:車在象棋中威力最大,無論橫線、豎線均可行走,只要無子阻攔,步數(shù)不受限制。 *炮:炮在不吃子的時(shí)候,走動與車完全相同。馬一次可走的選擇點(diǎn)可以達(dá)到四周的八個(gè)點(diǎn),故有’八面威風(fēng)‘之說。 *兵(卒):兵(卒)在未過河前,只能向前一步步走,過河以后,除不能后退外,允許左右移動,但也只能一次一步。棋盤界面(圖 4)所示:圖 4 棋盤界面從界面上方的菜單欄中可以進(jìn)行相關(guān)設(shè)置參數(shù)設(shè)置界面(圖 5)如下: 圖 5 參數(shù)設(shè)置界面等你將參數(shù)設(shè)置完畢之后,既可進(jìn)入游戲?!百Y源共享,信息互通” 需要更多相關(guān)設(shè)計(jì)資料和源代碼加 :49370312
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1