黑白棋(人人对战) 您所在的位置:网站首页 黑白格子棋盘叫什么棋 黑白棋(人人对战)

黑白棋(人人对战)

2024-07-08 15:02| 来源: 网络整理| 查看: 265

黑白棋(人人对战)——C语言实现方法之一

黑白棋,又叫翻转棋(Reversi)、奥赛罗棋(Othello)、苹果棋或正反棋(Anti reversi)。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。

棋规

棋局开始时黑棋位于E4和D5,白棋位于D4和E5。黑方先行,双方交替下棋。一步合法的棋步包括:在一个空格新落下一个棋子,并且翻转对手一个或多个棋子。新落下的棋子与棋盘上已有的同色棋子间,对方被夹住的所有棋子都要翻转过来。可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格。一步棋可以在数个方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。结束时棋子多者是赢家。

(以上内容摘自百度百科)

下面是黑白棋的一种C语言实现方法:

界面:

游戏规则界面 游戏界面,绿色位置可落子 C语言代码:

#include #include //棋盘边界检测 #define BOUNDARY(x,y) ((x)>=1&&(x)=1&&(y) int exist = 0; for( int i=0 ; i if( dx==0 && dy==0 ) continue; for( int row = i/8+1+dx, col = i%8+1+dy ; BOUNDARY(row,col) ; row+=dx, col+=dy ) if( piece[row*8+col-9] != -color ) break;//不是反色棋子就退出 else if( BOUNDARY(row+dx,col+dy) && piece[(row+dx)*8+col+dy-9]==color ) { //若反色棋子下一格是同色,则该点可落子;否则无操作 piece[i] = 2*color; exist = 1; goto finish; } } finish: ; } return exist;//存在可落子位置则返回1,不存在则返回0 } //输出棋盘界面 int gui( int * const piece ) { system("cls"); int score_black = 0, score_white = 0; printf("\033[0m\n [黑白棋]\n\n 1 2 3 4 5 6 7 8\n ┌─────────────────┐\n"); for( int i=0 ; i case 1: printf("○"); //黑棋 score_black++; break; case -1: printf("●"); //白棋 score_white++; break; case 2: case -2: printf("\033[32m┼ \033[0m"); break; //提示位置 default: printf("┼ "); //空位 } if( i%8 == 7 ) printf("│\n"); } printf(" └─────────────────┘\n 黑棋:%2d | 白棋:%2d \n", score_black, score_white); printf("─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─\n"); return score_black==score_white ? 0 : ( score_black>score_white ? 1 : -1 ) ; } //输出信息,在gui()后 int info( int * const piece, const int sign, const int color ) { static int cnt[3] = {0}; for(int i=0;i10){printf("再玩就坏了\n");cnt[i]=0;return 0;} switch( sign>=64 ? sign-80 : sign ) { case -1: printf("%s方悔棋!\n", color==1 ? "黑" : "白" ); break; case -2: printf("无效操作!\n"); cnt[0]++; break; case -3: printf("该位置已有棋子!\n"); cnt[1]++; break; case -4: printf("该位置不可落子!\n"); cnt[1]++; break; case -5: printf("开局不能悔棋哦!\n"); cnt[0]++; break; case -6: introduce(); gui(piece); cnt[2]++; break; default: //sign>=0 if( sign if( piece[i] != piece_last[i] ) sign = -1; piece[i] = piece_last[i]; } return sign; } //落子操作,落子前备份棋盘 int place( int * const piece, int * const piece_last, const int color )//棋盘,备份棋盘,颜色 { int row = 0, col = 0; char ch; printf("请%s方落子:\n", color==1 ? "黑" : "白" ); fflush(stdin); while( ( ch=getchar() ) == '\n' || ch == ' ' );//第一次输入 if( ch=='R' || ch=='r' ) return -1;//悔棋 if( ch=='P' || ch=='p' ) return -6;//游戏规则 if( ch>='A' && ch='a' && ch='1' && ch='A' && ch='a' && ch='1' && ch int piece[64] = {0}, piece_last[64], color=1, sign=-1; piece[27]=piece[36]=-1; piece[28]=piece[35]=1;//预设棋子位置 gui(piece); introduce(); start: piece[64] = {0}; piece[28]=piece[35]=color=1; piece[27]=piece[36]=sign=-1; search(piece,color);//首次落子 do{ gui(piece); if( sign


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有