黑白棋(人人对战)——C语言实现方法之一
黑白棋,又叫翻转棋(Reversi)、奥赛罗棋(Othello)、苹果棋或正反棋(Anti reversi)。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。
棋规
- 棋局开始时黑棋位于E4和D5,白棋位于D4和E5。
- 黑方先行,双方交替下棋。
- 一步合法的棋步包括:在一个空格新落下一个棋子,并且翻转对手一个或多个棋子。
- 新落下的棋子与棋盘上已有的同色棋子间,对方被夹住的所有棋子都要翻转过来。可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格。
- 一步棋可以在数个方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。
- 除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。
- 如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。
- 棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。
- 结束时棋子多者是赢家。
(以上内容摘自百度百科)
下面是黑白棋的一种C语言实现方法:
界面:


C语言代码:
#include<stdio.h>
#include<stdlib.h>
//棋盘边界检测
#define BOUNDARY(x,y) ((x)>=1&&(x)<=8&&(y)>=1&&(y)<=8)
//开局介绍
int introduce()
{
printf(" [游戏规则]\n\n");
printf("[开局] 棋局开始时,黑棋位于E4和D5,白棋位于D4和E5。黑方先行,双方交替下棋。\n\n");
printf("[落子] 在空位落下一枚棋子,且在该棋子的横、竖、斜八个方向有一枚己方棋子,则\n");
printf(" 夹在中间的全部对方棋子翻转成为己方棋子。并且,只能在可以翻转棋子的地\n");
printf(" 方落子。若没有可落子位置,则这一轮只能弃权。\n\n");
printf("[结束] 当双方都不能落子时,游戏结束,棋子多的一方获胜。\n\n");
printf("[操作] 落子时输入行字母+列数字(如:D3);在轮到对方落子时输入字母“R”悔棋;\n");
printf(" 输入字母“P”查看游戏规则。\n\n");
system("pause");
return 0;
}
//重置并搜索可落子位置
int search( int * const piece , const int color )
{
int exist = 0;
for( int i=0 ; i<=63 ; i++ )
{
if( piece[i]==1 || piece[i]==-1 ) continue;//有子跳过
if( piece[i]==2*color || piece[i]==-2*color ) piece[i]=0;//重置标记
for( int dx=-1 ; dx<=1 ; dx++ )//八向搜索
for( int dy=-1 ; dy<=1 ; dy++ )
{
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;
}
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



