一字棋實(shí)驗(yàn)報(bào)告即程序代碼_第1頁
一字棋實(shí)驗(yàn)報(bào)告即程序代碼_第2頁
一字棋實(shí)驗(yàn)報(bào)告即程序代碼_第3頁
一字棋實(shí)驗(yàn)報(bào)告即程序代碼_第4頁
一字棋實(shí)驗(yàn)報(bào)告即程序代碼_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

一字棋實(shí)驗(yàn)報(bào)告題目:一字棋學(xué)號(hào):姓名:專業(yè):教師:XXXX大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院

摘要:本實(shí)驗(yàn)的思想有別于其他實(shí)驗(yàn),程序?qū)崿F(xiàn)起來相對(duì)簡單。在人機(jī)對(duì)壘中,分別編寫了計(jì)算機(jī)走步Mac函數(shù),人走步User函數(shù),評(píng)分value函數(shù),判定輸贏CheckWin函數(shù),以及打印PrintQP函數(shù)和主函數(shù)。本實(shí)驗(yàn)的創(chuàng)新點(diǎn)主要集中在Mac函數(shù)和value函數(shù)。計(jì)算機(jī)在走步之前先將當(dāng)前棋盤復(fù)制給臨時(shí)棋盤,在此我定義了兩個(gè)臨時(shí)棋盤。在臨時(shí)棋盤1中計(jì)算機(jī)試探性地走了一步,相應(yīng)地在臨時(shí)棋盤2中的相同位置計(jì)算機(jī)幫人走了一步,接下來分別對(duì)兩個(gè)臨時(shí)棋盤調(diào)用CheckWin函數(shù),根據(jù)返回的結(jié)果分別選擇性地記錄該走步的坐標(biāo)位置。最后計(jì)算機(jī)再將臨時(shí)棋盤1送入value函數(shù),并記錄評(píng)分。重置臨時(shí)棋盤1和2,依次對(duì)所有空缺位置進(jìn)行試探。根據(jù)返回的結(jié)果選擇合適的坐標(biāo)位置。而value函數(shù)實(shí)現(xiàn)起來相對(duì)比較簡單,簡化了極大極小分析法。返回的值等于所有空格上都放上計(jì)算機(jī)的棋子后,計(jì)算機(jī)的三個(gè)棋子所組成的行、列及對(duì)角線的總數(shù)減去所有空格上都放上人的棋子后,人的三個(gè)棋子所組成的行、列及對(duì)角線的總數(shù)。而在機(jī)機(jī)對(duì)壘中的Mac1函數(shù)和Mac2函數(shù)比較相似,其他函數(shù)類似。關(guān)鍵詞:極大極小分析法臨時(shí)棋盤試探評(píng)價(jià)一、一字棋游戲的文字描述“一字棋”游戲(又叫“三字棋”或“井字棋”),是一款十分經(jīng)典的益智小游戲。游戲雙方在一個(gè)3*3的格子上依次下入自己的棋子,任何一方首先三子連成一線即獲勝利,游戲結(jié)束。二、一字棋對(duì)壘過程計(jì)算機(jī)描述和實(shí)現(xiàn)首先我定義一個(gè)3*3的二維數(shù)組,作為一字棋的棋盤。主函數(shù)main程序輸出當(dāng)前棋盤并提示判斷是否玩家先走步。然后玩家電腦依次走步,當(dāng)當(dāng)前棋盤能夠判斷輸贏時(shí),游戲結(jié)束,否則直到棋盤下滿,游戲結(jié)束。打印函數(shù)PrintQP打印二維數(shù)組,即當(dāng)前棋盤。玩家走步函數(shù)User實(shí)現(xiàn)玩家的走步,并判斷玩家的走步是否有誤,返回結(jié)果。計(jì)算機(jī)走步函數(shù)Mac該函數(shù)是整個(gè)程序?qū)崿F(xiàn)智能的關(guān)鍵所在,函數(shù)中定義兩個(gè)臨時(shí)棋盤,一個(gè)是給計(jì)算機(jī)試探走步使用,另一個(gè)是計(jì)算機(jī)替玩家走步使用,并結(jié)合其他的判斷語句和評(píng)價(jià)函數(shù)value,得出一個(gè)最佳的走步坐標(biāo),并實(shí)現(xiàn)。評(píng)價(jià)函數(shù)valueValue函數(shù)采用極大極小函數(shù)的思想,并做了適當(dāng)?shù)暮喕T摵瘮?shù)對(duì)當(dāng)前棋盤直接計(jì)算val的值。Val的值等于所有空格上都放上計(jì)算機(jī)的棋子后,計(jì)算機(jī)的三個(gè)棋子所組成的行、列及對(duì)角線的總數(shù)減去所有空格上都放上人的棋子后,人的三個(gè)棋子所組成的行、列及對(duì)角線的總數(shù)。返回該值。判定輸贏函數(shù)CheckWin因?yàn)槊看螌?dǎo)致輸贏的只會(huì)是當(dāng)前放置的棋子,輸贏算法中只需從當(dāng)前點(diǎn)開始掃描判斷是否已經(jīng)形成三子。對(duì)于這個(gè)子的八個(gè)方向判斷是否已經(jīng)形成三子。如果有,則說明有一方勝利,如果沒有則繼續(xù)搜索,直到有一方勝利或者搜索完整個(gè)棋盤。三、實(shí)例本實(shí)驗(yàn)有人機(jī)對(duì)壘和機(jī)機(jī)對(duì)壘。人機(jī)對(duì)壘:

2、機(jī)機(jī)對(duì)壘:四、嘗試考慮五子棋的實(shí)現(xiàn)五子棋和一字棋在性質(zhì)上挺相似的,只是將棋盤擴(kuò)大,棋子的連線增加到5個(gè)。但五子棋所考慮的情況將更加復(fù)雜,五子棋的棋盤不在局限在5*5中,對(duì)智能的要求也是非常之高。五、體會(huì)本次實(shí)驗(yàn)在對(duì)極大極小分析法理解的基礎(chǔ)之上,結(jié)合自己的一些想法編寫而成,在程序?qū)崿F(xiàn)初期,出現(xiàn)了很多BUG,例如計(jì)算機(jī)不能準(zhǔn)確地判斷對(duì)自己構(gòu)成危險(xiǎn)的走步,還有就是計(jì)算機(jī)在可以獲勝情況下,沒有走對(duì)棋子等等。還好這些問題在接下來對(duì)程序的不斷完善中得以解決。六、參考文獻(xiàn)七、程序源代碼見附件。#include<iostream.h>intQP[3][3];voidPrintQP(){ for(inti=0;i<3;i++) { for(intj=0;j<3;j++) cout<<QP[i][j]<<'\t'; cout<<endl; }}intCheckWin(intb[3][3]){ for(inti=0;i<3;i++) { if((b[i][0]==1&&b[i][1]==1&&b[i][2]==1)||(b[0][i]==1&&b[1][i]==1&&b[2][i]==1)) { return1; } if((b[i][0]==-1&&b[i][1]==-1&&b[i][2]==-1)||(b[0][i]==-1&&b[1][i]==-1&&b[2][i]==-1)) { return-1; } } if((b[0][0]==1&&b[1][1]==1&&b[2][2]==1)||(b[2][0]==1&&b[1][1]==1&&b[0][2]==1)) { return1; } if((b[0][0]==-1&&b[1][1]==-1&&b[2][2]==-1)||(b[2][0]==-1&&b[1][1]==-1&&b[0][2]==-1)) { return-1; } return0;}intvalue(inta[3][3]){inttmpQP3[3][3],tmpQP4[3][3];intr=0; for(inti=0;i<3;i++) { for(intj=0;j<3;j++) { if(a[i][j]==0) { tmpQP3[i][j]=1; tmpQP4[i][j]=-1; } else { tmpQP3[i][j]=a[i][j]; tmpQP4[i][j]=a[i][j]; } } } for(i=0;i<3;i++) { r+=(tmpQP3[i][0]+tmpQP3[i][1]+tmpQP3[i][2])/3; r+=(tmpQP3[0][i]+tmpQP3[1][i]+tmpQP3[2][i])/3; r+=(tmpQP4[i][0]+tmpQP4[i][1]+tmpQP4[i][2])/3; r+=(tmpQP4[0][i]+tmpQP4[1][i]+tmpQP4[2][i])/3; } r+=(tmpQP3[0][0]+tmpQP3[1][1]+tmpQP3[2][2])/3; r+=(tmpQP3[2][0]+tmpQP3[1][1]+tmpQP3[0][2])/3; r+=(tmpQP4[0][0]+tmpQP4[1][1]+tmpQP4[2][2])/3; r+=(tmpQP4[2][0]+tmpQP4[1][1]+tmpQP4[0][2])/3; returnr;}voidMac1(){ intpos1=0; intpos2=0; intpos3=0; intval=100; intx,y,pos; inttmpQP1[3][3],tmpQP2[3][3];for(inti=0;i<3;i++){ for(intj=0;j<3;j++) { tmpQP1[i][j]=QP[i][j];tmpQP2[i][j]=QP[i][j]; }}for(i=0;i<3;i++){ for(intj=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP2)==-1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP1)==1) { pos1=10*(i+1)+j+1; } elseif(value(tmpQP2)<val) { val=value(tmpQP2); pos2=10*(i+1)+j+1; }tmpQP1[i][j]=0; tmpQP2[i][j]=0; } }}if(pos3!=0)pos=pos3;elseif(pos1!=0)pos=pos1;elsepos=pos2;x=pos/10;y=pos%10;cout<<"計(jì)算機(jī)1走步為:"<<x<<y<<endl;QP[x-1][y-1]=-1;}voidMac2(){ intpos1=0; intpos2=0; intpos3=0; intval=-100; intx,y,pos; inttmpQP1[3][3],tmpQP2[3][3];for(inti=0;i<3;i++){ for(intj=0;j<3;j++) { tmpQP1[i][j]=QP[i][j];tmpQP2[i][j]=QP[i][j]; }}for(i=0;i<3;i++){ for(intj=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP1)==1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP2)==-1) { pos1=10*(i+1)+j+1; } elseif(value(tmpQP1)>val) { val=value(tmpQP1); pos2=10*(i+1)+j+1; }tmpQP1[i][j]=0; tmpQP2[i][j]=0; } }}if(pos3!=0)pos=pos3;elseif(pos1!=0)pos=pos1;elsepos=pos2;x=pos/10;y=pos%10;cout<<"計(jì)算機(jī)2走步為:"<<x<<y<<endl;QP[x-1][y-1]=1;}voidmain(){ intnum=0; charIsFirst; cout<<"打印棋盤:"<<endl; PrintQP(); cout<<"計(jì)算機(jī)1先走步(y/n):"; cin>>IsFirst; while(IsFirst!='y'&&IsFirst!='n') { cout<<"輸入有誤!"<<"計(jì)算機(jī)1先走步(y/n):"; cin>>IsFirst; } if(IsFirst=='y') { Mac1(); num++; PrintQP(); for(;num<9;) { Mac2(); PrintQP(); if(CheckWin(QP)==1) { cout<<"計(jì)算機(jī)2獲勝"<<endl; break; } num++; Mac1(); PrintQP(); if(CheckWin(QP)==-1) { cout<<"計(jì)算機(jī)1獲勝"<<endl; break; } num++; if(num==9) { if(CheckWin(QP)==0) cout<<"平局"<<endl; } } } else { for(;num<9;) { Mac2(); PrintQP(); if(CheckWin(QP)==1) { cout<<"計(jì)算機(jī)2獲勝"<<endl; break; } num++; if(num==9) { if(CheckWin(QP)==0) cout<<"平局"<<endl; break; } Mac1(); PrintQP(); if(CheckWin(QP)==-1) { cout<<"計(jì)算機(jī)1獲勝"<<endl; break; } num++; } }}#include<iostream.h>intQP[3][3];voidPrintQP(){ for(inti=0;i<3;i++) { for(intj=0;j<3;j++) cout<<QP[i][j]<<'\t'; cout<<endl; }}intCheckWin(intb[3][3]){ for(inti=0;i<3;i++) { if((b[i][0]==1&&b[i][1]==1&&b[i][2]==1)||(b[0][i]==1&&b[1][i]==1&&b[2][i]==1)) { return1; } if((b[i][0]==-1&&b[i][1]==-1&&b[i][2]==-1)||(b[0][i]==-1&&b[1][i]==-1&&b[2][i]==-1)) { return-1; } } if((b[0][0]==1&&b[1][1]==1&&b[2][2]==1)||(b[2][0]==1&&b[1][1]==1&&b[0][2]==1)) { return1; } if((b[0][0]==-1&&b[1][1]==-1&&b[2][2]==-1)||(b[2][0]==-1&&b[1][1]==-1&&b[0][2]==-1)) { return-1; } return0;}intvalue(inta[3][3]){inttmpQP3[3][3],tmpQP4[3][3];intr=0; for(inti=0;i<3;i++) { for(intj=0;j<3;j++) { if(a[i][j]==0) { tmpQP3[i][j]=1; tmpQP4[i][j]=-1; } else { tmpQP3[i][j]=a[i][j]; tmpQP4[i][j]=a[i][j]; } } } for(i=0;i<3;i++) { r+=(tmpQP3[i][0]+tmpQP3[i][1]+tmpQP3[i][2])/3; r+=(tmpQP3[0][i]+tmpQP3[1][i]+tmpQP3[2][i])/3; r+=(tmpQP4[i][0]+tmpQP4[i][1]+tmpQP4[i][2])/3; r+=(tmpQP4[0][i]+tmpQP4[1][i]+tmpQP4[2][i])/3; } r+=(tmpQP3[0][0]+tmpQP3[1][1]+tmpQP3[2][2])/3; r+=(tmpQP3[2][0]+tmpQP3[1][1]+tmpQP3[0][2])/3; r+=(tmpQP4[0][0]+tmpQP4[1][1]+tmpQP4[2][2])/3; r+=(tmpQP4[2][0]+tmpQP4[1][1]+tmpQP4[0][2])/3; returnr;}voidUser(){ intpos,x,y;L:cout<<"請(qǐng)輸入行列號(hào)(xy)";cin>>pos;x=pos/10;y=pos%10;if(x>0&&x<4&&y>0&&y<4&&QP[x-1][y-1]==0) { QP[x-1][y-1]=-1; }else { cout<<"輸入有誤!"<<endl; gotoL; }}voidMac(){ intpos1=0; intpos2=0; intpos3=0; intval=-100; intx,y,pos; inttmpQP1[3][3],tmpQP2[3][3];for(inti=0;i<3;i++){ for(intj=0;j<3;j++) { tmpQP1[i][j]=QP[i][j];tmpQP2[i][j]=QP[i][j]; }}for(i=0;i<3;i++){ for(intj=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP1)==1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP2)==-1) { pos1=10*(i+1)+j+1; } elseif(value(tmpQP1)>val) { val=value(tmpQP1); pos2=10*(i+1)+j+1; }tmpQP1[i][j]=0; tmpQP2[i][j]=0; } }}if(pos3!=0)pos=pos3;elseif(pos1!=0)pos=pos1;elsepos=pos2;x=pos/10;y=pos%10;cout<<"計(jì)算機(jī)走步為:"<<x<<y<<endl;QP[x-1][y-1]=1;}voidmain(){ int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論