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

正文內(nèi)容

中國象棋游戲的的設(shè)計和實現(xiàn)(已改無錯字)

2022-07-27 20:09:35 本頁面
  

【正文】 方只有殘士象加雙馬,則紅方明顯占優(yōu)。棋子位置棋子位置,或稱控制區(qū)域,是指某一方的棋子在棋盤上所占據(jù)(控制)的位置。例如,沉底炮、過河卒、以及車占士角等都是較好的棋子位置狀態(tài),而窩心馬、將離開底線等則屬較差的棋子位置狀態(tài)。棋子的機動性棋子的機動性指棋子的靈活度(可移動性)。例如,起始位置的車機動性較差,所以下棋講究早出車。同樣四面被憋馬腿的死馬機動性也較差(對于一步也不能走的棋子,可以認為其機動性為零)。棋子的相互關(guān)系這一點的分析較為復(fù)雜,因為一個棋子與其它子之間往往存在多重關(guān)系。如:一個馬可能在對方的炮的攻擊之下同時它又攻擊著對方的車。在程序中,估值函數(shù)最后返回的是每一方的總分的差值,而各方的總分就是上面所提到的四個因素的打分的總和。對于子力打分和控制區(qū)域打分,只要遍歷棋盤,當遇到棋子時簡單地去查事先定義好的“子力價值表”和“控制區(qū)域價值表”,取出相對應(yīng)的值進行累加即可(這些值的具體設(shè)定參考了前人的程序并作了適當?shù)恼{(diào)整,今后仍應(yīng)根據(jù)電腦下棋所反映出的實際問題對這些值作適當修改)。對于機動性打分,需要求出各個子總共有多少種走法,然后根據(jù)各個子所不同的機動性價值每多一種走法就加一次相應(yīng)的分數(shù)。 對棋子間相互關(guān)系的打分,要用到以下幾個數(shù)據(jù):int m_BaseValue[15]。 //存放棋子基本價值int m_FlexValue[15]。 //存放棋子靈活性分值short m_AttackPos[10][9]。 //存放每一位置被威脅的信息BYTE m_GuardPos[10][9]。 //存放每一位置被保護的信息BYTE m_FlexibilityPos[10][9]。//存放每一位置上棋子的靈活性分值int m_chessValue[10][9]。 //存放每一位置上棋子的總價值其中計算機會進行所有棋子值的判斷,AttackPos和GuardPos分別記錄該棋子受到的威脅和被保護的值。當遍歷一遍棋盤之后,子力打分、控制區(qū)域打分和機動性打分都可以完成,而關(guān)系表也可以填完。之后,再根據(jù)關(guān)系表來具體考察棋子的相互關(guān)系,進行關(guān)系打分。分析關(guān)系時,首先,對王的攻擊保護應(yīng)分離出來單獨考慮,因為對王的保護沒有任何意義,一旦王被吃掉整個游戲就結(jié)束了。其次,對一個普通子,當它既受到攻擊又受到保護的時候要注意如下幾個問題:攻擊者子力小于被攻擊者子力,攻擊方將愿意換子。比如,一個車正遭受一個炮的攻擊,那么任何對車的保護都將失去意義——對方肯定樂意用一個炮來換一個車。多攻擊\單保護的情況,并且攻擊者最小子力小于被攻擊者子力與保護者子力之和,則攻擊方可能以一子換兩子。三攻擊\兩保護的情況,并且攻擊者子力較小的二者之和小于被攻擊者子力與保護者子力之和,則攻擊方可能以兩子換三子。攻擊方與保護方數(shù)量相同,并且攻擊者子力小于被攻擊者子力與保護者子力之和再減去保護者中最大子力,則攻擊方可能以n子換n子。當然,上述四條只是覆蓋了最常見的幾種情況,覆蓋并不全面。而且,在程序中并沒有直接地重新考慮雙方兌子之后的控制區(qū)域及機動性變化情況(之所以說沒有“直接地重新考慮”,是因為搜索繼續(xù)展開結(jié)點后仍會考慮這些因素,只是目前不知這樣效果是否受影響——考察這兩種方法在效果上的差異需要一定數(shù)量的試驗數(shù)據(jù)的支持)。所以,如果今后要對引擎進行改進,提高程序的下棋水平的話,還應(yīng)當在此進行研究。 程序組裝至此,已具備了實現(xiàn)一款中國象棋對弈程序引擎部分的所有要素。如下:——象棋相關(guān)定義。包括棋盤局面和著法的表示?!ㄉ善?。就當前局面生成某一方所有合法著法?!阉鞑糠?。使用搜索求出最佳著法?!獨v史啟發(fā)。AlphaBeta搜索之補充,以提高搜索效率?!ㄅ判颉χò雌錃v史得分進行降序排序,以提高搜索效率。——局面評估。為某一特定局面進行評分。當實現(xiàn)了引擎部分的各要素時,可先建了一個Win32控制臺項目,、調(diào)用搜索函數(shù)、顯示搜索結(jié)果,便可簡單的測試引擎了(采用輸入著法的起點坐標和終點坐標的方式來傳送用戶走棋的信息。同樣,程序顯示計算機走棋的起點坐標和終點坐標來做出回應(yīng))。此后,等到界面部分初步完成,引擎的上述各模塊無需作任何改動。這種連接方式實現(xiàn)起來非常簡單。3 界面及程序輔助設(shè)計 界面基本框架關(guān)于界面,建了一個基于對話框的MFC應(yīng)用程序。代碼主要分布于以下三大部分:一、初始化部分 BOOL CCChessUIDlg::OnInitDialog(){}OnInitDialog()負責的是對話框的初始化??梢园延嘘P(guān)中國象棋的棋局初始化情況也放在了這里面。初始化的內(nèi)容包括:對引擎部分所用到的變量的初始化。包括對棋盤上的棋子位置進行初始化(棋盤數(shù)組的初始化),對搜索深度、當前走棋方標志、棋局是否結(jié)束標志等的初始化;對棋盤、棋子的貼圖位置(即棋盤、棋子在程序中實際顯示位置)的初始化;對程序輔助部分所用到的一些變量的初始化。包括對悔棋、還原隊列的清空,棋盤、棋子樣式的默認形式,下棋模式的默認選擇,以及著法名稱列表的初始化等。二、繪圖部分void CCChessUIDlg::OnPaint() {……}OnPaint()函數(shù)負責的是程序界面的繪圖。因此,在這里將要完成棋盤、棋子的顯示走棋起始位置和目標位置的提示框的顯示。由于棋盤、棋子等都是以位圖的形式給出的。所以在OnPaint()函數(shù)里做的工作主要都是在貼位圖。需要注意的是由于位圖文件不能像GIF文件那樣有透明的背景并且棋子是圓形的而位圖文件只能是矩形的,所以如果直接貼圖的話會在棋盤上留下一塊白色的邊框——棋子的背景。因此,要想讓棋子文件的背景“隱藏”需要通過一些“與”和“異或”操作來屏蔽掉棋子的背景。三、走棋部分(用戶動作響應(yīng)部分)為WM_LBUTTONDOWN消息添加消息響應(yīng)事件,可得到如下函數(shù): void CCChessUIDlg::OnLButtonDown(UINT nFlags, CPoint point){……}當用戶在窗口客戶區(qū)按下鼠標左鍵時,程序就會調(diào)用OnLButtonDown(UINT nFlags, CPoint point)函數(shù)來進行響應(yīng)。其中第二個參數(shù)CPoint point是在本程序中所要用到的,它給出了當鼠標左鍵被按下時,鼠標指針的位置坐標??梢酝ㄟ^這一信息來得知用戶的走法。在OnLButtonDown函數(shù)里處理如下兩種操作:如果用戶點擊鼠標的位置落在己方的棋子上,表示用戶選中了該棋子,下一步將移動該子進行走棋(也可能用戶下一步將會選擇己方另外的棋子,總之這一操作會記錄下用戶所選的將要走的棋子)。如果之前用戶已經(jīng)選過了棋子,那么這一次的點擊(如果不是另選本方的其它棋子的話)表達了用戶的一次走棋過程。在收到用戶傳達的走棋信息后,可先判斷該著法是否合法(是否符合中國象棋的游戲規(guī)則),如果合法,則執(zhí)行之。緊接著調(diào)用引擎的搜索函數(shù)計算出計算機對用戶著法的應(yīng)著,然后執(zhí)行該應(yīng)著。如此,在OnLButtonDown函數(shù)里,實現(xiàn)了人與機器的對弈(當然每走一步棋,也還需要繪圖函數(shù)來顯示棋盤局面的更新)。以上三部分并非界面程序的全部,而僅僅是與程序密切相關(guān)的部分。此外還有其它部分對程序同樣必不可少,但這些部分主要由MFC自動生成,無需人為改動,故在此不多做介紹。 多線程如采用單線程方式,按照如下順序編寫代碼:用戶走棋 —〉計算機思考并走棋按這種方式編寫的程序似乎毫無問題,程序運行一切正常。然而,在給程序加入這些功能(后面將會在講到其實現(xiàn))后,程序出現(xiàn)了異常:有時對用戶方的功能完全正確,而對電腦方的有些功能卻不起作用!
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1