人机对战五子棋,BOT的AI不太高,大约是初级的中等水平,,,等有时间再提升下BOT AI。。。。 操作:上下左右WSAD 回车是下棋 #include<iostream> #include<conio.h> using namespace std; struct mov { int x,y; }mov[8]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1}; class chessmap { int X,Y,lastX,lastY,step; public: friend class checker; int map[20][20]; chessmap(){ X=0; Y=0; lastX=-1; lastY=-1; memset(map,0,sizeof(map)); step=0; } void show(); }; void chessmap::show() { int i,j; system("cls"); cout<<" "; for(i=1;i<=20;i++) printf("%2c",i+64); cout<<endl; for(i=0;i<20;i++) { cout<<" "<<char(i+97); for(j=0;j<20;j++) if(i==X&&j==Y) cout<<"¤"; else { if(map[i][j]==1) cout<<"○"; else if(map[i][j]==2) cout<<"●"; else cout<<" "; } if(i==8) cout<<" 黑棋 ○"<<" 白棋 ●"; cout<<endl; } cout<<"当前执棋者: "; if(step%2) cout<<"黑 "; else cout<<"白 "; cout<<"上一步置棋位置: "; if(lastX>=0) cout<<char(lastX+97)<<char(lastY+65); else cout<<"NULL NULL"; cout<<" 当前步数: "<<step<<" 当前光标位置: "<<char(X+97)<<char(Y+65); } class checker { chessmap A; public: int dfs(int x,int y,int fang,int jige,int type); int checking(); void control(); void BOT(); }; void checker::BOT() { int i,j,fang,maxx,maxy,maxpoint=0,point; for(i=0;i<20;i++) for(j=0;j<20;j++) { point=0; for(fang=0;fang<4;fang++) if(A.map[i][j]==0) { int lenth=dfs(i,j,fang,0,1)+dfs(i,j,(fang+4)%8,0,1)-2; if(lenth==4) point+=100000; if(lenth==3) point+=15000; if(lenth==2) point+=2000; if(lenth==1) point+=1; lenth=dfs(i,j,fang,0,2)+dfs(i,j,(fang+4)%8,0,2)-2; if(lenth==4) point+=50000; if(lenth==3) point+=10000; if(lenth==2) point+=1000; if(lenth==1) point+=1; if(point>maxpoint) { maxpoint=point; maxx=i; maxy=j; } } } A.map[maxx][maxy]=1; A.step++; A.lastX=maxx; A.lastY=maxy; return; } void checker::control() { A.show(); char ch=getch(); if(ch=='/r') { if(A.map[A.X][A.Y]==0) { A.map[A.X][A.Y]=++A.step%2+1; A.lastX=A.X; A.lastY=A.Y; BOT(); } return; } int i; if(ch=='w'||ch=='W') { for(i=(A.X-1)%20;i!=A.X;i=--i%20) { if(i<0) i+=20; if(A.map[i][A.Y]==0) break; } A.X=i; } if(ch=='a'||ch=='A') { for(i=(A.Y-1)%20;i!=A.Y;i=--i%20) { if(i<0) i+=20; if(A.map[A.X][i]==0) break; } A.Y=i; } if(ch=='s'||ch=='S') { for(i=(A.X+1)%20;i!=A.X;i=++i%20) { if(i<0) i+=20; if(A.map[i][A.Y]==0) break; } A.X=i; } if(ch=='d'||ch=='D') { for(i=(A.Y+1)%20;i!=A.Y;i=++i%20) { if(i<0) i+=20; if(A.map[A.X][i]==0) break; } A.Y=i; } } int checker::checking() { int i,j,fang; for(i=0;i<20;i++) for(j=0;j<20;j++) if(A.map[i][j]!=0) for(fang=0;fang<4;fang++) { int lenth=dfs(i,j,fang,0,A.map[i][j])+dfs(i,j,(fang+4)%8,0,A.map[i][j])-1; if(lenth==5) goto end; } end: if(i<20&&j<20) if(A.map[i][j]==1) { A.show(); return 1; } else { A.show(); return 2; } else return 0; } int checker::dfs(int x,int y,int fang,int jige,int type) { if(x+mov[fang].x>=0&&x+mov[fang].x<20&&y+mov[fang].y>=0&&y+mov[fang].y<20&&A.map[x+mov[fang].x][y+mov[fang].y]==type) return dfs(x+mov[fang].x,y+mov[fang].y,fang,jige+1,type); else return jige+1; } int main() { checker N; while(N.checking()==0) { N.control(); } if(N.checking()==1) cout<<"/n黑棋WIN/n/a"; else cout<<"/n白棋WIN/n/a"; system("pause"); return 0; }