黑白棋

来源:互联网 发布:汽车导航端口检测工具 编辑:程序博客网 时间:2024/04/28 12:10

#include<iostream>using namespace std;int qipan[8][8]={0};int tempqipan[8][8];int value[8][8]={8, 5, 5, 5, 5, 5, 5, 8,1, 2, 3, 4, 5, 6, 7, 8,8, 7, 6, 5, 4, 3, 2, 1,1, 2, 3, 4, 5, 6, 7, 8,8, 7, 6, 5, 4, 3, 2, 1,10, 20, 30, 40, 50, 60, 70, 80,80, 70, 60, 50, 40, 30, 20, 10,8, 7, 6, 5, 4, 3, 2, 1,};int dr[8]={-1,-1,0,1,1,1,0,-1};int dc[8]={0,-1,-1,-1,0,1,1,1};int peocolor,comcolor;void readdata();void playgame();int canput(int color);int test(int row,int col,int color);int search(int row,int col,int dir,int color,int m);void print();void comgo();void turn(int row,int col);int cal();void maxturn(int sum[8][8]);void win();int main(){readdata();playgame();print();win();return 0;}void readdata(){qipan[3][3]=qipan[4][4]=1;qipan[3][4]=qipan[4][3]=-1;cout<<"请选择棋子颜色,1表示黑棋,-1表示白棋"<<endl;cin>>peocolor;comcolor=(-1)*peocolor;}void playgame(){if(comcolor==1){qipan[5][7]=1;}else{int row,col;cin>>row>>col;qipan[row][col]=1;qipan[5][7]=-1;}int i;for(i=1;;i=i*(-1)){if(canput(peocolor)==0&&canput(comcolor)==0)//双方都不能落子{break;}int color;color=i*peocolor;if(canput(color))//当前颜色可以落子{if(i==1){//选手落子print();//显示当前棋盘int row,col;cin>>row>>col;if(qipan[row][col]!=0||row>7||col>7||row<0||col<0){continue;}qipan[row][col]=color;}else{//电脑选择最佳位置落子comgo();}}}}void print(){int i,j;for(i=0;i<8;i++){for(j=0;j<7;j++){cout<<qipan[i][j]<<" ";}if(j==7){cout<<qipan[i][j]<<endl;}}}int canput(int color){int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){if(qipan[i][j]==0&&test(i,j,color)==1){return 1;}}}return 0;}int test(int row,int col,int color){int i;int flag=0;for(i=0;i<8;i++)//遍历八个方向{if(search(row,col,i,color,1)){flag=1;}}if(flag==1){return 1;}return 0;}int search(int row,int col,int dir,int color,int m){if(qipan[row+m*dr[dir]][col+m*dc[dir]]==color&&m==1)//紧挨着的是己方{return 0;}if(row+m*dr[dir]<0||col+m*dc[dir]<0||row+m*dr[dir]>=8||col+m*dc[dir]>=8)//出界{return 0;}else if(qipan[row+m*dr[dir]][col+m*dc[dir]]==color&&m!=1){return 1;}else if(qipan[row+m*dr[dir]][col+m*dc[dir]]==0)//出现空格{return 0;}else{return search(row,col,dir,color,m+1);}}void comgo(){int i,j;int sum[8][8];//权值for(i=0;i<8;i++){for(j=0;j<8;j++){sum[i][j]=-1;if(qipan[i][j]==0&&test(i,j,comcolor)==1){turn(i,j);sum[i][j]=cal();}}}maxturn(sum);//选择最大的情况转变棋盘}void turn(int row,int col){tempqipan[row][col]=comcolor;int i;for(i=0;i<8;i++)//遍历八个方向{if(search(row,col,i,comcolor,1)){int n=1;while(qipan[row+n*dr[i]][col+n*dc[i]]==peocolor){tempqipan[row+n*dr[i]][col+n*dc[i]]=comcolor;n++;}}}}int cal(){int i,j;int sum1,sum2;int result;sum1=0;sum2=0;for(i=0;i<8;i++){for(j=0;j<8;j++){if(tempqipan[i][j]==1){sum1=sum1+value[i][j];}if(tempqipan[i][j]==-1){sum2=sum2+value[i][j];}}}result=sum1-sum2;return result;}void maxturn(int sum[8][8]){int i,j;int row,col;int temp;row=0;col=0;temp=sum[0][0];for(i=0;i<8;i++){for(j=0;j<8;j++){if(sum[i][j]>temp){temp=sum[i][j];row=i;col=j;}}}qipan[row][col]=comcolor;for(i=0;i<8;i++)//遍历八个方向{if(search(row,col,i,comcolor,1)){int n=1;while(qipan[row+n*dr[i]][col+n*dc[i]]==peocolor){qipan[row+n*dr[i]][col+n*dc[i]]=comcolor;n++;}}}}void win(){int i,j;int sum1=0,sum2=0;for(i=0;i<8;i++){for(j=0;j<8;j++){if(qipan[i][j]==peocolor){sum1++;}if(qipan[i][j]==comcolor){sum2++;}}}if(sum1>sum2){cout<<"WIN"<<endl;}else{cout<<"LOSE"<<endl;}}

黑白棋

时限:1000ms 内存限制:10000K  总时限:3000ms

描述
黑白棋是19世纪末英国人发明的。直到上个世纪70年代日本人长谷川五郎将其发展,借用莎士比亚名剧奥赛罗(othello)为这个游戏重新命名。奥赛罗是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就是借用这个黑人白人斗争的故事。
黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。 下子的方法   把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。并且,只有在可以翻转棋子的地方才可以下子。 其中1代表白棋,2代表黑棋  
图解:   
21   
12   
初局   
22(2)   
12  
黑走一步   
(1)   
122   
12   
白走一步   
棋规  
开局时,棋盘正中央的4格先置放黑白相隔的4枚棋子(亦有求变化相邻放置)。通常黑子先行。双方轮流落子。只要落子和棋盘上任一枚己方的棋子在一条线上(横、直、斜线皆可)夹着对方棋子,就能将对方的这些棋子转变为我己方(翻面即可)。如果在任一位置落子都不能夹住对手的任一颗棋子,就要让对手下子。当双方皆不能下子时,游戏就结束,子多的一方胜。

原创粉丝点击