五子棋游戏我们大家很多人都玩过,规则简单但是内容千变万化,今天我用C语言写了一个五子棋程序,由于时间仓促程序中难免会有BUG,希望您多多指正阿!!
程序的功能:
两个人轮流下子,在输入下子的时候,可以输入r来进行悔棋,也可以输入q来退出程序。
在本程序中,一共有5个模块,分别为:
1.生成棋盘模块:void create_board(char (*board)[N]);
本模块的功能很简单,仅仅生成一个棋盘,因为本程序的运行环境是linux中的终端,所以出于界面的美观性考虑,将棋盘的空白位置标志为“-”(减号),白方的棋子为X(大写的X),黑方的棋子为O(大写的O)。所以在这个模块中我们给传递过来的一个二维数组所有的元素都赋值为‘-’
2.打印棋盘模块:void print_board(char (*board[N]));
本模块的功能也很简单,就是将刚才生成的棋盘打印出来,同时我们还要这个模块打印目前棋盘的状态,在主函数中循环调用这个模块。由于这个程序是在linux的终端里面运行的,所以要实现棋盘的动态显示,还要不断调用system函数要调用clear的系统命令来刷新屏幕,这个功能也是在这个模块中实现的。
3.打印相关信息的模块:void print_info(int flag,int person);这个模块的功能就是打印出相关的信息,包括:这轮该哪一方下子,输入是否有误,是否有人赢。这是我们可以设置一个标志位flag来表示不同的情况,正常情况表示为0,用户输入有误表示为-1,如果有人赢就表示为1
4.下棋:int down_board(char (*board)[N], int person, int *x, int *y);
1.打印输入格式
2.接受坐标,x, y
3.判断输入是否合法
1)如何合法,下棋,返回0
2)如何不合法,返回-1
1.越界、有子、格式有误
5.判断输赢int check_board(char (*board][N],int *person, int x, int y);
1.判断输赢
2.如果没有人赢,切换棋手
源码:
/*************************************************************************
> File Name: wuziqi.c
> Author: Baniel Gao
> Mail: [email protected]
> Blog: blog.csdn.net/createchance
> Created Time: Fri 06 Dec 2013 10:32:41 AM CST
************************************************************************/
#include
#include
#define N 20
void create_board(char (*board)[N]);
void print_board(char (*board)[N]);
void print_info(int flag,int person);
int play_chess(char (*board)[N],int *person,int *x,int *y);
int check_board(char (*board)[N],int *person,int x,int y);
int main(void)
{
char board[N][N];
int person = 0,flag = 0,x = 0,y = 0;
create_board(board);
while(1)
{
print_board(board);
print_info(flag,person);
if(flag == 1)
{
break;
}
if((flag=play_chess(board,&person,&x,&y)) == -1 || flag == 3)
{
continue;
}
else if(flag == 2)
{
return 0;
}
flag = check_board(board,&person,x,y);
}
return 0;
}
void create_board(char (*board)[N])
{
int i,j;
for(i=0;i N-1 || *y < 0 || *y > N-1)
{
choice = getchar();
if(choice == 'q' && getchar() == '\n')
{
return 2;
}
else if(choice == 'r' && getchar() == '\n')
{
if(board[*x][*y] == '-')
{
printf("You have already rescinded!\n");
return -1;
}
board[*x][*y] = '-';
*person = (*person + 1)%2;
return 3;
}
return -1;
}
if(board[*x][*y] != '-')
{
return -1;
}
if(*person == 0)
{
board[*x][*y] = 'X';
}
else
{
board[*x][*y] = 'O';
}
return 0;
}
int check_board(char (*board)[N],int *person,int x,int y)
{
int i,j;
int pos_x = x,pos_y = y;
int cnt,sign;
int a[4][2] = {{0,1},{1,1},{-1,0},{-1,1}};
for(i=0;i<4;i++)
{
cnt = sign = 1;
j = 0;
while(1)
{
pos_x += sign*a[i][j];
pos_y += sign*a[i][j+1];
if((board[pos_x][pos_y] == board[x][y]) && pos_x >= 0 && pos_x <= N-1 && pos_y >= 0 && pos_y <= N-1)
cnt++;
else
{
if(sign == -1)
{
break;
}
sign = -1;
pos_x = x;
pos_y = y;
}
if(cnt == 5)
{
return 1;
}
}
}
*person = (*person + 1)%2;
return 0;
}