五子棋人機(jī)對(duì)弈_第1頁(yè)
五子棋人機(jī)對(duì)弈_第2頁(yè)
五子棋人機(jī)對(duì)弈_第3頁(yè)
五子棋人機(jī)對(duì)弈_第4頁(yè)
五子棋人機(jī)對(duì)弈_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

【概述】五子棋是一種大眾喜愛的游戲,其規(guī)則簡(jiǎn)單,變化多端,非常富有趣味性何消遣性。這里設(shè)計(jì)了一個(gè)簡(jiǎn)單的五子棋程序,采用對(duì)空格點(diǎn)進(jìn)行評(píng)分排序的算法。近來(lái)隨著計(jì)算機(jī)的快速發(fā)展,各種棋類游戲被紛紛請(qǐng)進(jìn)了電腦,使得那些喜愛下棋,又常常苦于沒(méi)有對(duì)手的棋迷們能隨時(shí)過(guò)足棋癮。而且這類軟件個(gè)個(gè)水平頗高,大有與人腦分庭抗禮之勢(shì)。其中戰(zhàn)勝過(guò)國(guó)際象棋世界冠軍-卡斯帕羅夫的''深藍(lán)〃便是最具說(shuō)服力的代表;其它像圍棋的''手淡〃、象棋的''將族〃等也以其優(yōu)秀的人工智能深受棋迷喜愛;而我也做了一個(gè)“無(wú)比”簡(jiǎn)單的五子棋算法。總的來(lái)說(shuō)(我們假定您熟悉五子棋的基本規(guī)則),要讓電腦知道該在哪一點(diǎn)下子,就要根據(jù)盤面的形勢(shì),為每一可能落子的點(diǎn)計(jì)算其重要程度,也就是當(dāng)這子落下后會(huì)形成什么棋型(如:''沖四〃、''活三〃等),然后通覽全盤選出最重要的一點(diǎn),這便是最基本的算法。主程序模塊包括:數(shù)據(jù)結(jié)構(gòu),評(píng)分規(guī)則,勝負(fù)判斷,搜索最優(yōu)空格的算法過(guò)程?!娟P(guān)鍵字】人工智能,博弈樹,五子棋,無(wú)禁手,評(píng)分,搜索,C,隨機(jī)。【環(huán)境】XP/TC3.0【算法及解析】(無(wú)禁手)一.數(shù)據(jù)結(jié)構(gòu):本程序中只使用了一個(gè)19X19的二元結(jié)構(gòu)數(shù)組如下定義:TypedefStruet{int player;int value[8][5];longintscore;}map[19][19];其中map[i][jH呆存i行j列棋子信息,player為下棋方,value數(shù)組記錄八個(gè)方向的連續(xù)5個(gè)棋子的信息,為以后評(píng)分服務(wù)。Score為空格評(píng)分。以及數(shù)據(jù)結(jié)構(gòu)可以滿足初級(jí)人機(jī)對(duì)弈程序的功用。對(duì)比其他程序結(jié)構(gòu):王小春五子棋源碼:該程序采用鏈表節(jié)點(diǎn)結(jié)構(gòu),保存下子信息,該結(jié)構(gòu)主要為悔棋提供方便(雖該源碼為開發(fā)悔棋功能)TypedefstruetStep{intm;intn;charside;};為鏈表clist節(jié)點(diǎn),m,n表示兩個(gè)坐標(biāo)值,side表示下子方相對(duì)于我的程序中的player.另外該程序還使用一個(gè)二維數(shù)組map[][],來(lái)保存棋盤信息。二?預(yù)定義單元TOC\o"1-5"\h\z#defineblank 0#defineblack 1#definewhite 2#defineNUM_HIGH19#defineNUM_LINE19#defineman1#definebot2其中blank表示空白點(diǎn),black該點(diǎn)放黑子(即man),white該點(diǎn)放白子(即robot)NUM_HIGH,NUM_LINE分別定義棋盤的高度與寬度。Turn為輪流下子方。三?評(píng)分機(jī)制判斷是否能成活四或者是雙死四或者是死四活三,如果是機(jī)器方的話給予10,000,000;判斷是否已成沖四,如果是機(jī)器方的話給予6,000,000;判斷是否成死3活3,如果是機(jī)器方的話給予1,500,000;;判斷是否已成雙活2,如果是機(jī)器方的話給予100,00;判斷是否能成活2,如果是機(jī)器方的話給予70,000;判斷是否能成死2,如果是機(jī)器方的話給予30,000。四?函數(shù)定義及其功能。Voidinit()初始化棋盤bgi圖形與棋盤棋型。將棋盤標(biāo)記map[][].player都置為blank(空白),各點(diǎn)8方向的連續(xù)五個(gè)棋子信息也初始為0,各點(diǎn)評(píng)分?jǐn)?shù)也置為0。voidinit(){inti,j,m,n;intgdriver二DETECT,gmode;initgraph(&gdriver,&gmode,"..\\bgi");for(i=0;i<19;i++)for(j=0;j<19;j++){map[i][j].player=blank;for(m=0;m<8;m++)for(n=0;n<4;n++)map[i][j].value[m][n]=blank;map[i][j].score=blank;}}Voidpaint()畫棋盤函數(shù),本五子棋程序使用的是標(biāo)準(zhǔn)圍棋棋盤,規(guī)格19X19,每格25大小(象素),并且規(guī)定man棋子顏色為黑,robot為白色,黑棋優(yōu)先。最后初始化光標(biāo)(開始位置)位置。voidpaint()inti,j;clearviewport();setbkcolor(BLUE);//設(shè)置背景色setcolor(WHITE);//設(shè)置作圖色for(i=20;i<=470;i+=25)line(20,i,470,i);for(j=20;j<=470;j+=25)line(j,20,j,470);outtextxy(525,160,"Man");setcolor(DARKGRAY);setfillstyle(SOLID_FILL,DARKGRAY);pieslice(545,185,0,360,10);setcolor(WHITE);outtextxy(520,210,"Robot");setcolor(WHITE);setfillstyle(SOLID_FILL,WHITE);pieslice(545,235,0,360,10);moverel(245,245);//開始游戲時(shí)man下棋的位置}voidmain()主函數(shù)控制。初始化圖形及棋型,規(guī)定黑子優(yōu)先,畫棋盤,開始下子。(略)Voidhuman()Man下棋函數(shù),其中添加了防棋子覆蓋控制。voidhuman(void){charch=l;intsize,x,y;void*buf;while(ch!=32){ch=getch();putimage(getx()-10,gety()T0,buf,C0PY_PUT);if(ch==27)//ESC退出exit(l);if(ch=='w'||ch=='W')//移動(dòng)控制單元moverel(0,-25);elseif(ch=='s' ||ch=='S')moverel(0,25);elseif(ch=='a' ||ch=='A')moverel(-25,0);elseif(ch=='d' ||ch=='D')moverel(25,0);if(getx()<20) //防止man下棋越界moverel(25,0);if(getx()>470)moverel(-25,0);if(gety()<20)moverel(0,25);if(gety()>470)moverel(0,-25);size=imagesize(getx()-10,gety()T0,getx()+10,gety()+10);buf=malloc(size);getimage(getx()-10,gety()T0,getx()+10,gety()+10,buf);if(man==black){setcolor(DARKGRAY);setfillstyle(SOLID_FILL,DARKGRAY);}else{setcolor(WHITE);setfillstyle(SOLID_FILL,WHITE);}pieslice(getx(),gety(),0,360,10); //光標(biāo)顯示x=(getx()-20)/25;//計(jì)算man下棋的棋盤位置y=(gety()-20)/25;if(ch==32&&map[y][x].player!=0)//防止man棋子覆蓋ch=1;map[y][x].player=man;mark(x,y);}Voidmark(int,int)標(biāo)記棋子,robot標(biāo)記為白棋,man標(biāo)記為黑棋。在程序結(jié)束添加了判斷下子方是否勝出(結(jié)束)判斷函數(shù),check(int,int).voidmark(intx,inty)//標(biāo)記棋子{inti,j,m,n;m=x;n=y;if(turn==man){setcolor(DARKGRAY);setfillstyle(SOLID_FILL,DARKGRAY);}else{setcolor(WHITE);setfillstyle(SOLID_FILL,WHITE);}if(turn==bot)for(x=0;x<19;x++) //bot下完子后,對(duì)評(píng)分機(jī)制初始化for(y=0;y<19;y++)if(map[x][y].player==blank){for(i=0;i<8;i++)for(j=0;j<5;j++)map[x][y].value[i][j]=blank;map[x][y].score=blank;}check(n,m);}voidcheck(int,int)判斷程序是否結(jié)束函數(shù)(一方勝利),共判斷了四個(gè)方向:水平方向,豎直方向,左斜線方向,右斜線方向。如果發(fā)現(xiàn)存在超過(guò)或等于5各連續(xù)棋子,則判斷一方勝利,調(diào)用win(int)函數(shù),顯示結(jié)果,程序結(jié)束。程序結(jié)尾,添加交換下子部分。voidcheck(intm,intn){intWinTag二map[m][n].player;inti二m,j二n,level=l;//outtextxy((m*25+20),(n*25+20),".");if(WinTag==man)outtextxy((n*25+17),(m*25+17),"M");elseouttextxy((n*25+17),(m*25+17),"R");//水平位置判斷while(map[i-l][j].player二二WinTag&&i>=l){level++;i—;}i=m;while(map[i+l][j].player二二WinTag&&i<(NUM_LINE-l)){level++;i++;}if(level>=5)win(WinTag);level=1;//豎直方向判斷i=m; j=n;while(map[i][j-l].player二二WinTag&&j>=1){level++;j—;}j=n;while(map[i][j+l].player二二WinTag&&j<(NUM_HIGH-l)){level++;j++;}if(level>=5)win(WinTag);level=l;//左斜線判斷i=m; j=n;while(map[i-l][j-l].player二二WinTag&&i>=l&&j>=l){level++;i--;j--;}i=m;j=n;while(map[i+l][j+l].player==WinTag&&i<(NUM_LINE-l)&&j<(NUM_HIGH-l)){level++;i++;j++;}if(level>=5)win(WinTag);level=1;//右斜線判斷i=m;j=n;while(map[i+l][j-l].player二二WinTag&&i<NUM_LINE&&j>=1){level++;i++;j--;}i=m;j=n;while(map[i-l][j+l].player二二WinTag&&i>=l&&j<(NUM_HIGH-l))level++;i--;j++;}if(level>=5)win(WinTag);//交換下棋順序if(turn==man){turn=bot; robot();}else{turn=man;human();}Voidwin(int)voidwin(intwinner){charch;setbkcolor(LIGHTGRAY);setcolor(YELLOW);//ch=getch();while(ch!=27){if(winner==man)outtextxy(240,210,""Youarethewinner!"");elseouttextxy(240,210,"Youarelost!"");outtextxy(245,250,"PressESCtoExit!〃);printf("%d",winner);closegraph();}exit(1);}voidrobot()也是人機(jī)對(duì)弈五子棋最核心的部分,其中包括了評(píng)價(jià)機(jī)制,估值,搜索部分搜索空格的八個(gè)方向,如:1 0 27空格36 5 4最后將權(quán)值最大的幾個(gè)點(diǎn)的位置信息保存于xposition[]與yposition[]數(shù)組中,如果極值權(quán)重相同,使用隨機(jī)函數(shù)選擇其中一點(diǎn)下棋。voidrobot(void){intx,y,X,Y,i,j;int*p,*mp;//用于指向特定數(shù)組longintxposition[38],yposition[38]; //存儲(chǔ)相同得權(quán)值longintmax;//當(dāng)前最大權(quán)值//將空格信息填入特定數(shù)組,用于bot評(píng)分并下子,將360度分成8個(gè)方向//即同一個(gè)空格可能五子相連的八個(gè)方向,具體看readme文件for(X=0;X<19;X++) //0方向檢查for(Y=18;Y>4;Y—)if(map[Y][X].player==blank)for(i=0,x=X,y=Y;y>Y-5;i++,y—)map[Y][X].value[O][i]=map[y-1][x].player;for(X=0;X<19;X++) //4方向檢查for(Y=0;Y<10;Y++)if(map[Y][X].player==blank)for(i=0,x=X,y=Y;y<Y+5;i++,y++)map[Y][X].value[4][i]=map[y+1][x].player;//'/'檢查,1方向檢查開始for(i=4;i<19;i++) //'/'檢查,1方向檢查,左上部分for(X=0,Y=i;Y>3;X++,Y—) //檢查一斜行if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(y>Y-5)||(y>0);j++,x++,y--)map[Y][X].value[1][j]=map[y-1][x+1].player;for(i=1;i<11;i++)for(X=i,Y=18;X<11;X++,Y--)//1方向檢查,右下部分if(map[Y][X].player==blank)map[Y][X].value[l][j]=map[y-l][x+l].player;for(i=18;i>3;i—)//'/'檢查,5方向檢查,左上部分for(X=i,Y=0;X>3;X—,Y++)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(x>X—5)||(x>0);j++,x--,y++)map[Y][X].value[5][j]=map[y+l][xT].player;for(i=1;i<11;i++)//5方向檢查,右下部分for(X=1&Y=i;Y<11;X--,Y++)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(y<Y+5)||(y<14);j++,x--,y++)map[Y][X].value[5][j]=map[y+1][xT].player;//'/'檢查結(jié)束,5方向檢查結(jié)束for(Y=0;Y<19;Y++)//2方向檢查,從左到右for(X=0;X<10;X++)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;x<X+5;j++,x++)map[Y][X].value[2][j]=map[y][x+1].player;for(Y=0;Y<19;Y++)//6方向檢查,從右到左for(X=18;X>4;X--)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;x>X-5;j++,x--)map[Y][X].value[6][j]=map[y][xT].player;//'\'檢查開始,3方向檢查開始for(i=0;i<11;i++)//3方向檢查,右上部分for(X=i,Y=0;X<11;X++,Y++)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(x<X+5)||(x<18);j++,x++,y++)map[Y][X].value[3][j]=map[y+1][x+1].player;for(i=1;i<11;i++)//3方向檢查,左下部分for(X=0,Y=i;Y<11;X++,Y++)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(y<Y+5)||(y<18);j++,x++,y++)map[Y][X].value[3][j]=map[y+1][x+1].player;for(i=18;i>3;i--)//7方向檢查,右上部分for(X=1&Y=i;Y>3;X—,Y—)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(y>Y-5)||(y>0);j++,x--,y--)map[Y][X].value[7][j]=map[y-1][xT].player;for(i=17;i>3;i--)//7方向檢查,左下部分for(X=i,Y=18;X>3;X--,Y--)if(map[Y][X].player==blank)for(j=0,x=X,y=Y;(x>X-5)||(x>0);j++,x--,y--)map[Y][X].value[7][j]=map[y-1][x-1].player;//'\'檢查結(jié)束,7方向檢查結(jié)束,bot檢查棋盤空格結(jié)束//進(jìn)入bot判斷,對(duì)棋盤上每一個(gè)空格進(jìn)行評(píng)分for(y=0;y<19;y++)for(x=0;x<19;x++)if(map[y][x].player==blank)for(i=0;i<8;i++){//for控制對(duì)一個(gè)空格的8個(gè)方向評(píng)分p=&map[y][x].value[i][O];//mp與p剛好組成空格的兩頭if(i<4)mp=&map[y][x].value[i+4][0];elsemp=&map[y][x].value[i-4][0];//b為bot,m為man,o為空格,x為評(píng)分點(diǎn)//己方已經(jīng)可以贏,或是對(duì)方可能有四子相連的評(píng)分為100,000,000—億的情況if(*p==bot&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==bot)map[y][x].score+=100000000;if(*p==man&&*(p+1)==man&&*(p+2)==man&&*(p+3)==man)map[y][x].score+=100000000;if(*p==bot&&*(p+1)==bot&&*(p+2)==bot&&*mp==bot)map[y][x].score+=100000000;if(*p==man&&*(p+1)==man&&*(p+2)==man&&*mp==man)map[y][x].score+=100000000;if(*p==man&&*(p+1)==man&&*mp==man&&*(mp+1)==man)map[y][x].score+=100000000;//活四評(píng)分為10,000,000—千萬(wàn)的情況if(*p==bot&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==blank&&*mp==blank)map[y][x].score+=10000000;if(*p==man&&*(p+1)==man&&*(p+2)==man&&*(p+3)==blank)map[y][x].score+=10000000;if(*p==bot&&*(p+1)==bot&&*(p+2)==blank&&*mp==man&&*(mp+1)==blank)map[y][x].score+=10000000;if(*p==man&&*(p+1)==man&&*(p+2)==blank&&*mp==man&&*(mp+1)==blank)map[y][x].score+=10000000;if(*p==blank&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==bot&&*(p+4)==blank&&*mp==blank)map[y][x].score+=10000000;//沖四評(píng)分為8,000,000八百萬(wàn)的情況if(*p==bot&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==man&&*mp==blank)map[y][x].score+=8000000;if(*p==bot&&*(p+1)==bot&&*(p+2)==man&&*mp==bot&&*(mp+1)==blank)map[y][x].score+=8000000;if(*mp==blank&&*p==blank&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==bot&&*(p+4)==man)map[y][x].score+=8000000;if(*mp==bot&&*(mp+1)==blank&&*p==blank&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==man)map[y][x].score+=8000000;//防對(duì)方?jīng)_四評(píng)分為6,000,000的情況if(*p==man&&*(p+1)==man&&*(p+2)==man&&*(p+3)==bot&&*mp==blank)map[y][x].score+=6000000;if(*p==man&&*(p+1)==man&&*(p+2)==bot&&*mp==man&&*(mp+1)==blank)map[y][x].score+=6000000;//活三評(píng)分為4,000,000四百萬(wàn)的情況if(*p==bot&&*(p+1)==bot&&*(p+2)==blank&&*mp==blank)map[y][x].score+=4000000;if(*p==man&&*(p+1)==man&&*(p+2)==blank&&*mp==blank)map[y][x].score+=4000000;if(*p==man&&*(p+1)==blank&&*(p+2)==man&&*(p+3)==blank&&*mp==blank)map[y][x].score+=4000000;if(*p==bot&&*(p+1)==blank&&*mp==bot&&*(mp+1)==blank)map[y][x].score+=4000000;if(*p==man&&*(p+1)==blank&&*mp==bot&&*(mp+1)==blank)//死三評(píng)分為1,500,000—百五十萬(wàn)的情況,進(jìn)攻為主if(*p==bot&&*(p+1)==bot&&*(p+2)==man&&*mp==blank)map[y][x].score+=1500000;if(*p==bot&&*(p+1)==man&&*mp==bot&&*(mp+1)==blank)map[y][x].score+=1500000;if(*mp==man&&*p==bot&&*(p+1)==bot&&*(p+2)二二blank)map[y][x].score+=1500000;if(*mp==blank&&*p==blank&&*(p+1)==bot&&*(p+2)==bot&&*(p+3)==man)map[y][x].score+=1500000;//活二評(píng)分為100,000十萬(wàn)的情況if(*p==bot&&*(p+1)==blank&&*mp==blank)map[y][x].score+=100000;if(*p==blank&&*(p+1)==bot&&*(p+2)==blank&&*mp==blank)map[y][x].score+=100000;//活二評(píng)分為70,000七萬(wàn)的情況if(*p==man&&*(p+1)==blank&&*mp==blank)map[y][x].score+=70000;if(*p==blank&&*(p+1)==man&&*(p+2)==blank&&*mp==blank)map[y][x].score+=70000;//沖二評(píng)分為30,000三萬(wàn)的情況if(*mp==blank&&*p==bot&&*(p+1)==man)map[y][x].score+=30000;if(*mp==blank&&*p==blank&&*(p+1)==bot&&*(p+2)==man)map[y][x].score+=30000;//沖二評(píng)分為10,000—萬(wàn)的情況,防守為主if(*mp==blank&&*p==man&&*(p+1)==bot)map[y][x].score+=10000;//開局情況,并限定下子范圍if(step==blank){do{x=random(19);y=random(19);if(map[y][x].player!=blank)x=blank;y-10>0);}while(x-5<0||x-10>0||yy-10>0);step+=1;}}max=blank; //權(quán)值評(píng)分機(jī)制初始化for(y=0;y<19;y++) //搜尋權(quán)值最大點(diǎn)for(x=0;x<19;x++)if(map[y][x].player==blank){if(map[y][x].score>max){max=map[y][x].score;for(i=0;i<38;i++)xposition[i]二blank;yposition[i]二blank;xposition[0]二x;yposition[0]二y;}elseif(map[y][x].score==max){i+=1;xposition[i]二x;xposition[i]二y;}}if(xposition[2]==blank)//選擇最大權(quán)值點(diǎn)做下子點(diǎn){map[yposition[0]][xposition[0]].player=bot;mark(xposition[0],yposition[0]);}else//在最大權(quán)值相等的位置中隨機(jī)選擇下子點(diǎn)*/{i=random(lO);x=xposition[i];y=yposition[i];map[y][x].player=bot;mark(x,y);【相關(guān)知識(shí)】篇幅所限制,活三,沖四等棋型在此就不贅述.【心得體會(huì)】通過(guò)本次實(shí)踐,初步掌握了五子棋“人機(jī)博弈”的基本算法,由于開發(fā)較為智能的程序,算法復(fù)雜度較高,固在此只進(jìn)行了一層搜索。采用博弈樹的算法,搜索最佳位置后,然后剪枝,選擇最優(yōu)。實(shí)際上按照王小春的說(shuō)法,要進(jìn)行深度為4搜索,計(jì)算機(jī)可能要思考15秒左右,算法時(shí)間性能較差,況且時(shí)間較倉(cāng)促,沒(méi)有進(jìn)行更深層次的思考,期間遇到不少挫折,程序規(guī)模較以前相比龐大了不少,參照了不少源碼(15X15)。人工智能算法博大精深,日前在網(wǎng)上看到一種所謂“稀疏矩陣”的算法,采用“易語(yǔ)言”編譯,時(shí)間性能尚可。有機(jī)會(huì)向作者請(qǐng)教請(qǐng)教。【參考文獻(xiàn)及相關(guān)資料】《PC游戲編程(人機(jī)博弈)》 王小春《算法分析與設(shè)計(jì)技術(shù)》 馬紹漢CSDN專欄Programfan.Com論壇baker五子棋是一種受大眾廣泛喜愛的游戲,其規(guī)則簡(jiǎn)單,變化多端,非常富有趣味性和消遣性這里設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)人機(jī)對(duì)下的五子棋程序,采用了博弈樹的方法,應(yīng)用了剪枝和最大最小樹原理進(jìn)行搜索發(fā)現(xiàn)最好的下子位置。介紹五子棋程序的數(shù)據(jù)結(jié)構(gòu)、評(píng)分規(guī)則、勝負(fù)判斷方法和搜索算法過(guò)程。一、相關(guān)的數(shù)據(jù)結(jié)構(gòu)關(guān)于盤面情況的表示,以鏈表形式表示當(dāng)前盤面的情況,目的是可以允許用戶進(jìn)行悔棋、回退等操作。CListStepList;其中Step結(jié)構(gòu)的表示為:structStep{intm;//m,n表示兩個(gè)坐標(biāo)值intn;charside;//side表示下子方};以數(shù)組形式保存當(dāng)前盤面的情況,目的是為了在顯示當(dāng)前盤面情況時(shí)使用:charFiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];其中FIVE_MAX_LINE表示盤面最大的行數(shù)。同時(shí)由于需要在遞歸搜索的過(guò)程中考慮時(shí)間和空間有效性,只找出就當(dāng)前情況來(lái)說(shuō)相對(duì)比較好的幾個(gè)盤面,而不是對(duì)所有的可下子的位置都進(jìn)行搜索,這里用變量CountList來(lái)表示當(dāng)前搜索中可以選擇的所有新的盤面情況對(duì)象的集合:CListCountList;其中類CBoardSituiton為:classCBoardSituation{CListStepList;//每一步的列表charFiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];structStepmachineStep;//機(jī)器所下的那一步doublevalue;//該種盤面狀態(tài)所得到的分?jǐn)?shù)}二、評(píng)分規(guī)則對(duì)于下子的重要性評(píng)分,需要從六個(gè)位置來(lái)考慮當(dāng)前棋局的情況,分別為:-二/\//,\\實(shí)際上需要考慮在這六個(gè)位置上某一方所形成的子的布局的情況,對(duì)于在還沒(méi)有子的地方落子以后的當(dāng)前局面的評(píng)分,主要是為了說(shuō)明在這個(gè)地方下子的重要性程度,設(shè)定了一個(gè)簡(jiǎn)單的規(guī)則來(lái)表示當(dāng)前棋面對(duì)機(jī)器方的分?jǐn)?shù)?;镜囊?guī)則如下:判斷是否能成5,如果是機(jī)器方的話給予100000分,如果是人方的話給予-100000分;判斷是否能成活4或者是雙死4或者是死4活3,如果是機(jī)器方的話給予10000分,如果是人方的話給予-10000分;判斷是否已成雙活3,如果是機(jī)器方的話給予5000分,如果是人方的話給予-5000分;判斷是否成死3活3,如果是機(jī)器方的話給予1000分,如果是人方的話給予-1000分;判斷是否能成死4,如果是機(jī)器方的話給予500分,如果是人方的話給予-500分;判斷是否能成單活3,如果是機(jī)器方的話給予200分,如果是人方的話給予-200分;判斷是否已成雙活2,如果是機(jī)器方的話給予100分,如果是人方的話給予-100分;判斷是否能成死3,如果是機(jī)器方的話給予50分,如果是人方的話給予-50分;判斷是否能成雙活2,如果是機(jī)器方的話給予10分,如果是人方的話給予-10分;判斷是否能成活2,如果是機(jī)器方的話給予5分,如果是人方的話給予-5分;判斷是否能成死2,如果是機(jī)器方的話給予3分,如果是人方的話給予-3分。實(shí)際上對(duì)當(dāng)前的局面按照上面的規(guī)則的順序進(jìn)行比較,如果滿足某一條規(guī)則的話,就給該局面打分并保存,然后退出規(guī)則的匹配。注意這里的規(guī)則是根據(jù)一般的下棋規(guī)律的一個(gè)總結(jié),在實(shí)際運(yùn)行的時(shí)候,用戶可以添加規(guī)則和對(duì)評(píng)分機(jī)制加以修正。三、勝負(fù)判斷實(shí)際上,是根據(jù)當(dāng)前最后一個(gè)落子的情況來(lái)判斷勝負(fù)的。實(shí)際上需

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論