黑白棋
来源:互联网 发布:汽车导航端口检测工具 编辑:程序博客网 时间: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枚棋子(亦有求变化相邻放置)。通常黑子先行。双方轮流落子。只要落子和棋盘上任一枚己方的棋子在一条线上(横、直、斜线皆可)夹着对方棋子,就能将对方的这些棋子转变为我己方(翻面即可)。如果在任一位置落子都不能夹住对手的任一颗棋子,就要让对手下子。当双方皆不能下子时,游戏就结束,子多的一方胜。
黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。 下子的方法 把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。并且,只有在可以翻转棋子的地方才可以下子。 其中1代表白棋,2代表黑棋
图解:
21
12
初局
22(2)
12
黑走一步
(1)
122
12
白走一步
棋规
开局时,棋盘正中央的4格先置放黑白相隔的4枚棋子(亦有求变化相邻放置)。通常黑子先行。双方轮流落子。只要落子和棋盘上任一枚己方的棋子在一条线上(横、直、斜线皆可)夹着对方棋子,就能将对方的这些棋子转变为我己方(翻面即可)。如果在任一位置落子都不能夹住对手的任一颗棋子,就要让对手下子。当双方皆不能下子时,游戏就结束,子多的一方胜。
阅读全文
0 0
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 黑白棋
- 我的黑白棋
- “黑白棋”技术文档
- 黑白棋的问题
- 人工智能.黑白棋规则
- Git初学 小白笔记(二)
- springmvc配置jackson
- 简要叙述“自顶向下设计”
- Android Studio混淆模板及常用第三方混淆(看了都说好)
- Dijkstra 简要证明
- 黑白棋
- 算二十四第二道
- 使用zbar+opencv+cpp 进行二维码解析以及提高识别率
- 自己做的一个游戏 先不要看程序 想玩的自己复制粘贴运行 不然就没意思了
- day 33 iptables
- ubuntu下的apache2打开mod_rewrite及开启wordpress固定链接
- 新版AndroidStudio3较2.X中Moudle 的新特性
- 文章标题
- [数据结构]二叉树遍历、求深度C语言的简单实现