五子棋,咋结束不了捏~【已完结】
//五子棋的棋盘是15*15#include <stdio.h>
#include <ctype.h>
const int SIZE = 15;
const char player_c = '@';
const char computer_c = 'O';
void display(char board[][SIZE]);
int valid_moves(char board[][SIZE],int row,char col);
int five(char board[][SIZE], int row, int col,char play_c);
int check(char board[][SIZE], char play_c);
int main(void)
{
char board[SIZE][SIZE] = {0};
int x = 0;
char y = 0;
bool next_player = true;
char go = 'n';
//游戏主体循环
do
{
//初始化棋盘
for(int row = 0;row < SIZE; row++)
for(int col = 0; col < SIZE; col++)
board[row][col] = ' ';
next_player=!next_player;
do
{
display(board);
if(next_player = !next_player)
{//这是你的回合
//读取坐标
printf("请输入你要下的坐标:");
fflush(stdin);
scanf("%d%c",&x,&y);
//转化成数组的下标
x -= 1;
y -= 'a';
//检查这一步是否可行
for(;!(valid_moves(board,x,y));)
{
printf("\n这一步不可行,请重新走:");
scanf("%d%c",&x,&y);
x -= 1;
y -= 'a';
}
//执行这一步
board[x][y]=player_c;
}
else
{//这是我的回合
fflush(stdin);
printf("请输入你要下的坐标:");
scanf("%d%c",&x,&y);
//转化成数组的下标
x -= 1;
y -= 'a';
//检查这一步是否可行
while(!valid_moves(board,x,y))
{
printf("\n这一步不可行,请重新走:");
scanf("%d%c",&x,&y);
x -= 1;
y -= 'a';
}
//执行这一步
board[x][y]=computer_c;
}
}while(check(board,next_player?player_c:computer_c));//check函数用来检查该玩家有没有赢得胜利
//显示到底谁赢得了游戏
display(board);
if(next_player)
printf("\n@玩家取得了胜利");
else
printf("\nO玩家胜利");
//决定是否继续游戏
printf("\n还想再来一次么?(y/n):");
fflush(stdin);
scanf("%c",&go);
}while(tolower(go)=='y');
}
void display(char board[][SIZE])
{
char col_label = 'a';
int row_label = 1;
//打印首行
printf("\n ");
for(int col = 0; col < SIZE; col++)
printf(" %2c ",col_label++);
printf("\n ");
printf("+");
for(int col = 0;col < SIZE; col++)
printf("---+");
//打印下面的
for(int row = 0;row < SIZE; row++)
{
printf("\n%2d",row_label++);
for(int col = 0;col < SIZE; col++)
printf("| %c ",board[row][col]);
printf("|");
printf("\n +");
for(int col = 0;col < SIZE; col++)
printf("---+");
}
printf("\n ");
}
int valid_moves(char board[][SIZE], int row, char col)
{
if(row<0 || row>SIZE || col<0 || col >SIZE || (board[row][col]!=' '))
return 0;
else
return 1;
}
int check(char board[][SIZE],char play_c)
{
for(int row = 0; row < SIZE; row++)
for(int col = 0; col < SIZE; col++) //检查棋盘上的没一个元素
{
if(board[row][col]==play_c) //如果这个元素是你的棋子,就进行检查
{
if(five(board,row,col,play_c))//是否有方向连成五个
return 0; //如果有五子连珠就返回0表示游戏结束
else
continue;//游戏没有结束,内层循环继续
}
else //如果这个元素不是你的棋子,就跳过这个元素
continue;
}
return 1; //游戏没有结束,继续执行
}
int five(char board[][SIZE],int row,int col, char play_c)
{
for(int row_delta = -1; row_delta<=1; row_delta++) //搜索八个方向以及自身
for(int col_delta = -1; col_delta<=1; col_delta++)
{
int count = 1;//每次循环都会初始化一次count,因为刚开始就有一个棋子,所以count是1
if(row+row_delta<0 || row+row_delta>SIZE || col+col_delta<0 ||
col+col_delta>SIZE || (row_delta==0 && col_delta==0))
continue; //跳过超出边界以及自己;
if(board[row+row_delta][col+col_delta]==play_c) //如果下一个方向是自己的棋子就开始检查
{//这个没有进行测试;
int x = row+row_delta;
int y = col+col_delta; //定义x,y到该方向的第一个棋子上
count++; //找到了一个相同的棋子count+1
for(;;)
{
x += row_delta;
y += col_delta; //该方向上去检查
if(x<0 || x>SIZE || y<0 || y>SIZE)
break; //超出边界则退出该方向的检查
if(board[x][y]!=play_c)
break; //如果下一个元素不是自己的棋子,同样退出循环
else
count++; //是自己棋子的话就给count+1
}
//某方向检测完毕
if(count>=5)
return 1; //一旦该方向count数达到5就返回连成五个棋子
}
}
return 0; //如果所有方向都检测完却没有return则没有五子连珠,就要return 0;
}
嗷嗷嗷啊~版主大人我爱死你了!
[ 本帖最后由 NET_雷 于 2013-5-22 16:53 编辑 ]