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

正文內(nèi)容

畢業(yè)設(shè)計(jì)-五子棋人機(jī)對(duì)弈程序設(shè)計(jì)-資料下載頁(yè)

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

【導(dǎo)讀】五子棋程序由兩個(gè)主要部分組成:一個(gè)估值函數(shù)和一個(gè)樹(shù)狀搜索算法。而程序依靠估值函數(shù)來(lái)判斷對(duì)于一方來(lái)說(shuō)什么局面是好而什么局面是壞,是最佳的一條路線。人工智能電腦下棋模擬的是人類(lèi)的智能,它的啟發(fā)式。搜索是邊走邊試探,即極大極小法。五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱(chēng)之。格”等多種稱(chēng)謂。軟件個(gè)個(gè)水平頗高,大有與人腦分庭抗禮之勢(shì)。象棋的“將族”等也以其優(yōu)秀的人工智能深受棋迷喜愛(ài)。學(xué)科算起,已有40多年歷史。理能力;而存儲(chǔ)程序式計(jì)算機(jī)的所有能力都是人們通過(guò)編制程序賦予它的,與人腦相比是機(jī)械的、死板的和無(wú)法自我提高的。探討一下該領(lǐng)域的問(wèn)題。展了能夠求解難題的下棋程序。自從早期欺騙性的下棋機(jī)展出后,人們已。拉開(kāi)了帷幕,這一幻想才有了變成現(xiàn)實(shí)的可能性。的重大原則,或許就存在于其它任何需要人類(lèi)智能的活動(dòng)中。使自己取勝、戰(zhàn)勝對(duì)手的策略。在決策過(guò)程中要對(duì)形勢(shì)做出恰當(dāng)?shù)墓烙?jì),

  

【正文】 將剛剛下的棋子所在的線段中的數(shù)據(jù)保存到臨時(shí)數(shù)組 TempArray中 TempArrayLength=chessman[chessman_no].line_heng[1]。 //將線長(zhǎng)度保存到變量 TempArrayLength中 //用一個(gè)指針 TempArray來(lái)指向線數(shù)組 ,這樣比數(shù)組復(fù)制效率高 TempArray=chessman[chessman_no].line_heng。 //下面要開(kāi)始判斷勝負(fù)和禁手了 ,共分三步來(lái)完成 //step1:從頭至尾搜索一遍 ,看看是否有長(zhǎng)連或 5連 ,如果有 ,則判定為 禁手 或 取勝 ,并且不用再進(jìn)行下面的判斷了 , //否則 ,就必須進(jìn)行下面的 step2:看看有沒(méi)有 四 (活四和跳四都是四 )和 step3:活三的判斷 temp1=0。//將黑棋的連接數(shù)初始化為 0 temp2=0。//將黑棋的臨時(shí)連接數(shù)初始化為 0 for (i=2。iTempArrayLength。i++) { if(TempArray[i]==2) temp2++。 else { if (temp2temp1) temp1=temp2。 temp2=0。 } } if (temp2temp1) temp1=temp2。 if (temp14) {if (temp1==5) { AfxMessageBox(黑棋獲勝 !)。 Game_Over=true。 return。 }else already_exceed_five=true。 //長(zhǎng)連禁手了,但是并不一定會(huì)輸 ,必須要等確認(rèn)四條線上都沒(méi)有 5連后,才可以確認(rèn)是輸了 } //step2:看看有沒(méi)有 四 (活四和跳四都是 四 ),因?yàn)橛刑牡某霈F(xiàn),所以要采用預(yù)走棋的方法來(lái)看看是否“四” 35 temp1=0。//將黑棋的連接數(shù)初始化為 0 temp2=0。//將黑棋的臨時(shí)連接數(shù)初始化為 0 temp3=1。temp4=1。 //下面的判斷方法是從一條線的頭搜索到尾,找到五、四、三以后再看看是不是包含落子點(diǎn)在內(nèi)。這樣不好,效率低,好處是思路簡(jiǎn)單。聰 明的方法是:落子點(diǎn)以為中心,向兩頭搜索,以尋找五、四、三。這樣效率高,缺點(diǎn)是分析復(fù)雜。 for (i=2。iTempArrayLength。i++) {if(TempArray[i]==1)//如果是空白棋 ,則預(yù)走上一個(gè)棋子,看看是否出現(xiàn)了五連,注意:長(zhǎng)連不算! { temp1=i。 while((temp12)amp。amp。(TempArray[temp11]==2)) {temp1。} temp2=i。 while((temp2(TempArrayLength1))amp。amp。(TempArray[temp2+1]==2)) {temp2++。} //不必?fù)?dān)心會(huì)出現(xiàn) 5+1連或長(zhǎng)連,因?yàn)樵?step1中已經(jīng)對(duì)是否有長(zhǎng)連作出了檢驗(yàn) if ((temp2temp1+1)==5)//如果預(yù)走上一步棋后,形成了五連,則 { //再判斷一下是不是剛才走的那步棋形成的五連,如果是,就發(fā)現(xiàn)一個(gè)“四” if (actual_position=temp1)amp。amp。(actual_position=temp2)) { if ((temp1!=temp3)amp。amp。(temp2!=temp4))//如果成立 ,就是死四或者是活四,不管怎樣,先記上一個(gè)四吧 Dead_and_Live_Four++。 else//否則就是活四 , // { // Live_Four++。 // AfxMessageBox(發(fā)現(xiàn)一個(gè)活四 !)。 // } //其實(shí),只要是四就行,不必區(qū)分死四和活四,但是 temp3和 temp4變量 //卻是有用的,因?yàn)檫@樣可以防止誤將一個(gè)活四記為兩個(gè)四 temp3=temp1+1。 temp4=temp2+1。 } } } } //step3:再判斷一下是否出現(xiàn)了一個(gè) 活三 ,判斷的方法是:預(yù)走一步棋看看是否處理出現(xiàn)了活四。 //“活三”的定義:再添加一個(gè)棋子就能形成“活四”的棋局 //“活四”的定義:兩端的任意一端添加上一個(gè)棋子都能形成五連勝,并且不是長(zhǎng)連! temp1=0。//將臨時(shí)變量初始化為 0 temp2=0。//將臨時(shí)變量初始化為 0 for (i=2。iTempArrayLength。i++) { if(TempArray[i]==1)//如果是空白棋 ,則預(yù)走上一個(gè)棋子,看看是否出現(xiàn)了四連 (跳四不叫 四連 !), { //向首端搜索 temp1=i。 while((temp12)amp。amp。(TempArray[temp11]==2)) {temp1。} 36 //再向末端搜索 temp2=i。 while((temp2(TempArrayLength1))amp。amp。(TempArray[temp2+1]==2)) {temp2++。} //如果預(yù)走上一步棋后,形成了四連,則進(jìn)一步判斷這個(gè)“四連”是不是活的 ,即這個(gè)四的兩端是否都有空 ,并且將空添上后是否會(huì)出現(xiàn)長(zhǎng)連禁手 if ((temp2temp1+1)==4) {if ((temp12)amp。amp。(temp2TempArrayLength1))//如果這個(gè)四連的兩端都離邊界線至少有一個(gè)格,則 {//如果四連的兩端都是空白,則 if ((TempArray[temp11]==1)amp。amp。(TempArray[temp2+1]==1)) {if (TempArrayLength==6)//如果線長(zhǎng)度是 6,則必定是活四 {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” if ((actual_position=temp1)amp。amp。(actual_position=temp2)) Live_Three++。 // AfxMessageBox(活三了,橫 )。 goto BB。 } else {if (temp1==3)//如果首端 離邊界只有一個(gè)位置,則只需判斷末端是否會(huì)形成長(zhǎng)連禁手 {if (TempArray[temp2+2]!=2)//如果第六個(gè)棋子不是黑棋,則 {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” if ((actual_position=temp1)amp。amp。(actual_position=temp2)) Live_Three++。 // AfxMessageBox(活三了,橫 )。 goto BB。 } } else {if (temp2==TempArrayLength)//如果末端離邊界只有一個(gè)位置,則只需判斷首端是否會(huì)形成長(zhǎng)連禁手 {if (TempArray[temp12]!=2)//如果第六個(gè)棋子不是黑棋,則 {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” if ((actual_position=temp1)amp。amp。(actual_position=temp2)) Live_Three++。 // AfxMessageBox(活三了,橫 )。 goto BB。 } } else//兩端都要判斷是否會(huì)形成長(zhǎng)連禁手,只有兩端都不會(huì)形成長(zhǎng)連禁手時(shí),才叫活四 {if ((TempArray[temp12]!=2)amp。amp。(TempArray[temp2+2]!=2)) {//再判斷一下是不是剛才走的那步棋形成的活三,如果是,就發(fā)現(xiàn)一個(gè)“活三” 37 if ((actual_position=temp1)amp。amp。(actual_position=temp2)) Live_Three++。 //AfxMessageBox(活三了,橫 )。 goto BB。 } }?? } BB //橫線判斷結(jié)束! 再判斷豎線 再判斷撇線 再判斷捺線 掃描棋盤(pán),找出白棋的所有有效防守點(diǎn)。此函數(shù)不需要返回值。 ScanChessboardAndGetAllWhiteDefencePoint()。 //將白棋的各 種防守點(diǎn)保存到局部鏈表 TempChainTableEnd3中 TempChainTableEnd3=SaveDefencePointToChainTable(TempChainTableEnd3)。 分析:因?yàn)楹谄宓倪M(jìn)攻點(diǎn)都是一些四三、沖四、活三,所以,白棋肯定能找到防止黑棋 5 連、活四的防守點(diǎn),只不過(guò)這些防守點(diǎn)有可能防不住,但是,不可能找不到防守點(diǎn)。所以,白棋的防守點(diǎn)的鏈表一定是非空的。 下面開(kāi)始循環(huán)處理保存到鏈表中的白棋的下點(diǎn),即試遍白棋所有的合理的應(yīng)對(duì)方法 int Min。//用來(lái)保存返回值 中的最小值用的 Min=2。//初始化此變量。不過(guò),我覺(jué)得這一行代碼好像是多余的。 TempChainTableCurrent3=TempChainTableEnd3。 while(TempChainTableCurrent3!=TempChainTableHead3) { //下上一個(gè)白棋 if(TempChainTableCurrent3Chessman_No0) { AfxMessageBox()。 } SaveChessmanInfo(TempChainTableCurrent3Chessman_No,false)。 尋找返回值中的最小值,并且,如果遇到一個(gè)返回 1的,就提前跳出循環(huán),因?yàn)?1是能返回的最小的值了 ,而按照博弈樹(shù)的理論,白棋應(yīng)該取最小值才對(duì) ReturnValue=RecursionAnalyzeFunction()。 if(ReturnValue==1) { Undo_Save_ChessmanInfo()。 //先清空 TempChainTableHead3鏈表,但是,要保留鏈表頭結(jié)點(diǎn) while(TempChainTableEnd3!=TempChainTableHead3) { TempChainTableEnd3=TempChainTableEnd3previous。 delete TempChainTableEnd3next。 } Min=1。 38 //再跳出白棋的 While循環(huán) break。 // } if(ReturnValueMin) Min=ReturnValue。 Undo_Save_ChessmanInfo()。 TempChainTableCurrent3=TempChainTableCurrent3previous。 } //如果白棋返回的是 1,表示白棋防不住這個(gè)黑棋的進(jìn)攻,所以就不用再往下判斷了,返回這個(gè)黑棋的編號(hào)就行了 //因?yàn)榘凑詹┺臉?shù)的理論,黑棋應(yīng)該取最大值才對(duì) if(Min==1) {Undo_Save_ChessmanInfo()。 //清空黑棋用的 TempChainTableHead 鏈表和白棋用的 TempChainTableHead3 鏈表中的所有的結(jié)點(diǎn) EmptingTwoChainTable(TempChainTableHead,TempChainTableEnd,TempChainTableHead3,TempChainTableEnd3)。 return 1。 } //繼續(xù)考察下一個(gè)黑棋點(diǎn) Undo_Save_ChessmanInfo()。 TempChainTableCurrent=TempChainTableCurrentprevious。 } //退出此函數(shù)前要清空此函數(shù)內(nèi)定義的兩個(gè)局部鏈表 //清空黑棋用的 TempChainTableHead 鏈表和白棋用的 TempChainTableHead3 鏈表中的所有的結(jié)點(diǎn) EmptingTwoChainTable(TempChainTableHead,TempChainTableEnd,TempChainTableHead3,TempChainTableEnd3)。 return 0。//沒(méi)分出勝負(fù)來(lái),就返回 0
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1