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

正文內(nèi)容

畢業(yè)設(shè)計(jì)-五子棋人機(jī)對(duì)弈程序設(shè)計(jì)(參考版)

2024-12-07 19:52本頁(yè)面
  

【正文】 //沒分出勝負(fù)來(lái),就返回 0 。 } //退出此函數(shù)前要清空此函數(shù)內(nèi)定義的兩個(gè)局部鏈表 //清空黑棋用的 TempChainTableHead 鏈表和白棋用的 TempChainTableHead3 鏈表中的所有的結(jié)點(diǎn) EmptingTwoChainTable(TempChainTableHead,TempChainTableEnd,TempChainTableHead3,TempChainTableEnd3)。 } //繼續(xù)考察下一個(gè)黑棋點(diǎn) Undo_Save_ChessmanInfo()。 //清空黑棋用的 TempChainTableHead 鏈表和白棋用的 TempChainTableHead3 鏈表中的所有的結(jié)點(diǎn) EmptingTwoChainTable(TempChainTableHead,TempChainTableEnd,TempChainTableHead3,TempChainTableEnd3)。 TempChainTableCurrent3=TempChainTableCurrent3previous。 // } if(ReturnValueMin) Min=ReturnValue。 } Min=1。 //先清空 TempChainTableHead3鏈表,但是,要保留鏈表頭結(jié)點(diǎn) while(TempChainTableEnd3!=TempChainTableHead3) { TempChainTableEnd3=TempChainTableEnd3previous。 尋找返回值中的最小值,并且,如果遇到一個(gè)返回 1的,就提前跳出循環(huán),因?yàn)?1是能返回的最小的值了 ,而按照博弈樹的理論,白棋應(yīng)該取最小值才對(duì) ReturnValue=RecursionAnalyzeFunction()。 while(TempChainTableCurrent3!=TempChainTableHead3) { //下上一個(gè)白棋 if(TempChainTableCurrent3Chessman_No0) { AfxMessageBox()。不過(guò),我覺得這一行代碼好像是多余的。//用來(lái)保存返回值 中的最小值用的 Min=2。所以,白棋的防守點(diǎn)的鏈表一定是非空的。 //將白棋的各 種防守點(diǎn)保存到局部鏈表 TempChainTableEnd3中 TempChainTableEnd3=SaveDefencePointToChainTable(TempChainTableEnd3)。此函數(shù)不需要返回值。 goto BB。(actual_position=temp2)) Live_Three++。(TempArray[temp2+2]!=2)) {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” 37 if ((actual_position=temp1)amp。 } } else//兩端都要判斷是否會(huì)形成長(zhǎng)連禁手,只有兩端都不會(huì)形成長(zhǎng)連禁手時(shí),才叫活四 {if ((TempArray[temp12]!=2)amp。 // AfxMessageBox(活三了,橫 )。amp。 goto BB。(actual_position=temp2)) Live_Three++。 } else {if (temp1==3)//如果首端 離邊界只有一個(gè)位置,則只需判斷末端是否會(huì)形成長(zhǎng)連禁手 {if (TempArray[temp2+2]!=2)//如果第六個(gè)棋子不是黑棋,則 {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” if ((actual_position=temp1)amp。 // AfxMessageBox(活三了,橫 )。amp。amp。amp。(TempArray[temp2+1]==2)) {temp2++。 while((temp2(TempArrayLength1))amp。(TempArray[temp11]==2)) {temp1。 while((temp12)amp。iTempArrayLength。//將臨時(shí)變量初始化為 0 temp2=0。 } } } } //step3:再判斷一下是否出現(xiàn)了一個(gè) 活三 ,判斷的方法是:預(yù)走一步棋看看是否處理出現(xiàn)了活四。 // } //其實(shí),只要是四就行,不必區(qū)分死四和活四,但是 temp3和 temp4變量 //卻是有用的,因?yàn)檫@樣可以防止誤將一個(gè)活四記為兩個(gè)四 temp3=temp1+1。 else//否則就是活四 , // { // Live_Four++。amp。amp。(TempArray[temp2+1]==2)) {temp2++。 while((temp2(TempArrayLength1))amp。(TempArray[temp11]==2)) {temp1。 while((temp12)amp。iTempArrayLength。這樣效率高,缺點(diǎn)是分析復(fù)雜。這樣不好,效率低,好處是思路簡(jiǎn)單。temp4=1。//將黑棋的連接數(shù)初始化為 0 temp2=0。 }else already_exceed_five=true。 Game_Over=true。 } } if (temp2temp1) temp1=temp2。 else { if (temp2temp1) temp1=temp2。iTempArrayLength。//將黑棋的連接數(shù)初始化為 0 temp2=0。 //將線長(zhǎng)度保存到變量 TempArrayLength中 //用一個(gè)指針 TempArray來(lái)指向線數(shù)組 ,這樣比數(shù)組復(fù)制效率高 TempArray=chessman[chessman_no].line_heng。 先判斷橫線 actual_position=chessman[chessman_no].position_heng。 Dead_and_Live_Four=0。//循環(huán)用的計(jì)數(shù)變量 already_exceed_five=false。 }} 34 b) //按照國(guó)際標(biāo)準(zhǔn)連珠規(guī)則來(lái)判斷勝負(fù)的函數(shù)。 else AfxMessageBox(白棋獲勝 !)。 if(Max_connected_numberconnected_number) Max_connected_number=connected_number。(ptrArray[back+1]==temp_chessman_type)) back++。 while((back(ptrArray[1]1))amp。(ptrArray[forword1]==temp_chessman_type)) forword。 while((forword2)amp。//chessman 和 Chessman_No都是全局變量 forword=actual_position。 temp_chessman_type=chessman[Chessman_No].chessman_type。 connected_number=0。 void victory_or_defeat(bool draw_black_chessman) {int Max_connected_number,connected_number,actual_position,temp_chessman_type。 勝負(fù)判斷: 某方形成五子連即獲勝;若黑棋走出 ‘ 雙三 ’ 、 ‘ 雙四 ’ 或長(zhǎng)連即以禁手判負(fù)。是不是應(yīng)該對(duì)白棋和黑棋分別建立兩套全局鏈表集呢?我覺得應(yīng)該建立兩套。為提高效率,在考察每一個(gè)點(diǎn)的時(shí)候,就應(yīng)該以考察點(diǎn)為中心,向線的兩端搜索,而不應(yīng)該采用判斷勝負(fù)函數(shù)中采用的那種從每一條線的首端考察到末端的笨辦法 ,那種笨辦法會(huì)多考慮很多的沒用的點(diǎn)的。這時(shí)再調(diào)用模塊 4 對(duì)預(yù)測(cè)后的棋進(jìn)行盤面分析,如果出現(xiàn)了 ‘ 四三 ’ 、 ‘ 雙三 ’或 ‘ 雙四 ’ 等制勝點(diǎn),那么己方就可以獲勝了(當(dāng)然對(duì)黑棋而言 ‘ 雙三 ’ 、‘ 雙四 ’ 是禁手,另當(dāng)別論);否則照同樣的方法向下分析,就可預(yù)測(cè)出第二步、第三步 ?? 要是盤面上沒有對(duì)手必須防的棋型,哪該怎么辦呢?進(jìn)攻不成的話就得考慮防守了,將自己和對(duì)手調(diào)換一下位置,然后用上面的方法來(lái)預(yù)測(cè)對(duì)手的棋,這樣既可以防住對(duì)手巧妙的攻擊,又能 待 機(jī)發(fā)動(dòng) 反擊! 預(yù)測(cè)法的運(yùn)算量相當(dāng)之大,用 P4 預(yù)測(cè) 7 步的走法平均需要 15 秒以上時(shí)間,所以建議預(yù)測(cè)量在 5 步以內(nèi)。但這種算法的弱點(diǎn)非常明顯,只顧眼前利益,不能顧全大局,這就和許多五子棋初學(xué)者一樣犯了 “ 目光短淺 ” 的毛病。所有棋型的編號(hào)都 已 事先定義好,越重要的號(hào)數(shù)越大! 電腦下子: 有了上面填寫的兩張棋型表,現(xiàn)在要作的就是讓電腦知道在哪一點(diǎn)下子了。而其他三個(gè)方向的棋型也可用同樣的方法得到,當(dāng)搜索完整張棋盤后, 己方棋型表也就填寫完畢了。 先來(lái)分析己方的棋型,我們從棋盤左上角出發(fā),向右逐行搜索,當(dāng)遇到一個(gè)空白點(diǎn)時(shí),以它為中心向左挨個(gè)查找,如果遇到己方的子則記錄然后繼續(xù),如果遇到對(duì)方的子、空白點(diǎn)或邊界就停止查找。 } 盤面分析填寫棋型表: 本程序核心模塊之一,人工智能算法的根本依據(jù)!其具體實(shí)現(xiàn)方法如下:您在下五子棋時(shí),一定會(huì)先根據(jù)棋盤上的情況,找出當(dāng)前最重要的一些點(diǎn)位,如 “ 活三 ” 、 “ 沖四 ” 等;然后再在其中選擇落子點(diǎn)。 chessman[chessman_no].line_na[chessman[chessman_no].position_na]=1。 chessman[chessman_no].line_pie[chessman[chessman_no].position_pie]=1。//將標(biāo)志位置 0,表示此線沒被修改過(guò) .不對(duì)!這條線上還有其它的棋子呀?。?! chessman[chessman_no].line_shu[chessman[chessman_no].position_shu]=1。 //將要撤銷的棋盤上的棋子對(duì)應(yīng)的線上的棋子顏色恢復(fù)為 1, 1代表沒棋子的,是空白 chessman[chessman_no].line_heng[chessman[chessman_no].position_heng]=1。 min_empty_index=1。 { if (min_empty_index=0) return。 chessman[chessman_no].line_na[chessman[chessman_no].position_na]=3。 chessman[chessman_no].line_shu[chessman[chessman_no].position_shu]=3。 } else { chessman[chessman_no].chessman_type=3。 chessman[chessman_no].line_pie[chessman[chessman_no].position_pie]=2。//黑棋子 //將棋子的編號(hào)記錄到對(duì)應(yīng)的線數(shù)組中 chessman[chessman_no].line_heng[chessman[chessman_no].position_heng]=2。 min_empty_index+=1。} 2) 保存每一步所下的棋 void SaveChessmanInfo(int chessman_no,bool is_black_chessman) { actual_step_saved[min_empty_index].chessman_no=chessman_no。//由單位坐標(biāo)計(jì)算出棋子的編號(hào)的公式 if (chessman[No].chessman_type==1) return true。 } 玩家下子: 當(dāng)輪到玩家下時(shí),您通過(guò)鍵盤或鼠標(biāo)在棋盤上落子,程序會(huì)根據(jù)該點(diǎn)的位置,在對(duì)戰(zhàn)雙方的棋型表數(shù)組的相應(yīng)地方記錄 ‘2’ ,以表明該子是玩家下的。 // Chessman_No=*15+。//返回精確對(duì)齊到交叉點(diǎn)后的像素坐標(biāo) } 6) 返回精確對(duì)齊到交叉點(diǎn)后的像素坐標(biāo) 參數(shù)是鼠標(biāo)單擊處的實(shí)際像素坐標(biāo) CPoint snap_to_grid(int x,int y)//封裝后的函數(shù)。 yy=35*(1+y)。 5) 返回與單位坐標(biāo)對(duì)應(yīng)的像素坐標(biāo) 參數(shù)是單位坐標(biāo) CPoint Pixel_Coordinate(int x,int y) { int xx,yy。 } if (arithmetical_pliment17) xx+=1。 while(arithmetical_plimen
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1