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

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

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

棋规

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

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

下面是黑白棋的一种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;
				}
		
黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。 棋子:黑白棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。棋子呈圆饼形。    棋盘:黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。棋盘可分为“角”、“边”以及黑白棋“中腹”。现今的棋盘多以8x8较为普遍。 棋钟:正式的比赛中可以使用棋钟对选手的时间进行限制。非正式的对局中一般不使用棋钟。 黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。    下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。 并且,只有在可以翻转棋子的地方才可以下子。  如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。将对手棋子吃光的一方获胜。     每个“翻转棋”游戏开始时,棋盘上已经交叉放好了四颗棋子。其中两颗是黑棋,另两颗是白棋。黑棋总是先走。    当您的棋子在某一直线方向包围了对手的棋子时,就可以翻转这些棋子的颜色,使它们成为您方的颜色。例如,如果您执黑棋,并且看到在一排白棋的某一端是一颗黑棋,那么当您将一颗黑棋放在这一排的另一端时,所有的白棋都将翻转并变为黑棋!   所有的直线方向均有效:水平、垂直和斜线方向。    走棋的唯一规则是只能走包围并翻转对手的棋子。每一回合都必须至少翻转一颗对手的棋子。    按规则不能再走棋时,这一回合弃权。计算机会自动将控制权交给对方。 得分 “翻转棋”的计分方法非常简单。游戏过程中随时都显示黑棋数与白棋数。结束时棋数最多的一方就是赢家。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值