五子棋
五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国古代汉族人发明,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区。容易上手,老少皆宜,而且趣味横生,引人入胜
判断输赢:以某一点为中心向四周4个方向判断,连续数达到5个即取胜
源代码实现c算法版:
#include<stdio.h>
#include<memory.h>
#define size 10 //棋盘大小
char map[size][size]= {};
int row = 0,col = 0;
/*初始化棋盘数组*/
void init()
{
memset(map,' ',sizeof(map));
}
/*显示棋盘*/
void showmap()
{
int loop=0,row=0,col=0;
for(loop=0;loop<size;loop++)
{
printf("%4d",loop+1);
}
printf("\n");
for(row=0;row<size;row++)
{
printf(" ");
for(loop=0;loop<size;loop++)
{
printf("---+");
}
printf("\n");
printf("%2d|",row+1);
for(col=0;col<size;col++)
{
printf("%c | ",map[row][col]);
}
printf("\n");
}
printf(" ");
for(loop=0;loop<size;loop++)
{
printf("---+");
}
printf("\n");
}
/*判断输赢,胜利则返回玩胜利玩家*/
char judge(int x, int y, char player)
{
int count=0;//记录是否组成五子棋
/*东北和西南方向判断开始*/
/*向右上45度(东北方向)判断*/
row = x-1;
col = y+1;
while((row>=0)&&(col<=size-1))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row--;
col++;
}
/*向左下45度(西南方向)判断*/
row = x+1;
col = y-1;
while((row<=size-1)&&(col>=0))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row++;
col--;
}
if(count+1==5)
{
return player;
}
/*东北和西南方向判断结束*/
/*西北和东南方向方向判断开始*/
/*向左上45度(西北方向)判断*/
count = 0;
row = x-1;
col = y-1;
while((row>=0)&&(col>=0))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row--;
col--;
}
/*向右下45度(东南方向)判断*/
row = x+1;
col = y+1;
while((row<=size-1)&&(col<=size-1))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row++;
col++;
}
if(count+1==5)
{
return player;
}
/*西北和东南方向判断结束*/
/*竖直方向方向判断开始*/
/*竖直向上判断*/
count = 0;
row = x-1;
col = y;
while((row>=0))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row--;
}
/*竖直向下判断*/
row = x+1;
col = y;
while((row<=size-1))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
row++;
}
if(count+1==5)
{
return player;
}
/*竖直方向判断结束*/
/*水平方向判断*/
/*水平向左判读*/
count = 0;
row = x;
col = y-1;
while(col>=0)
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
col--;
}
/*水平向右判断*/
row = x;
col = y+1;
while((col<=size-1))
{
if(map[row][col]==player)
{
count++;
}
else
{
break;
}
col++;
}
if(count+1==5)
{
return player;
}
/*水平方向判断结束*/
return '0';//没有形成五子棋时
}
/*下棋*/
void chess()
{
char player = 'A';//玩家
char winner = '0';//赢家
while(winner=='0')
{
do
{
printf("玩家%c要下棋的位置坐标:",player);
scanf("%d,%d",&row,&col);
printf("坐标为:%d,%d\n",row,col);
printf("%s",(map[row-1][col-1]!=' ')?"输入无效,请重新输入\n":"输入正确\n");
}while(map[row-1][col-1]!=' ');
map[row-1][col-1]=player;
showmap();
winner = judge(row-1,col-1,player);//玩家下棋后,马上进行判断输赢
player = (player=='A')?'B':'A';//切换玩家
}
printf("游戏结束,玩家%c赢\n",winner);
}
int main()
{
init(); /*初始化棋盘位置元素值*/
showmap(); /*第一次显示棋盘*/
chess(); /*开始下棋*/
}