是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。
由于代码量过大,我把整个程序用了game.h、game.c ,test.c三个文件分别封装函数声明和函数实现以及主函数main。
首先用一个menu函数打印菜单:
void menu()
{`在这里插入代码片`
printf("#############\n");
printf("###0.exit####\n");
printf("###1.start###\n");
printf("#############\n");
}
接着就是选择进入游戏或者退出游戏的代码:
```c
int n = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &n);
switch (n)
{
case 0:
printf("退出游戏\n");
break;
case 1:
game();
break;
default:
printf("输入错误。\n");
break;
}
} while (n);
接就是创立一个字符数组来作为存放棋子的棋盘(将内容初始化为空格的函数)了,代码如下:
void Initbroad(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
broad[i][j] = ' ';
}
}
}
ps:ROW和COL均是在game.h文件define定义的常量。
然后就是打印棋盘的函数:
void display(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" %c |", broad[i][j]);
}
else
printf(" %c \n", broad[i][j]);
}
if (i < row - 1)
{
printf("---|---|---\n");
}
}
}
紧接着就该玩家下棋了,玩家通过输入坐标来下棋。在玩家下棋是会出现下面三种情况:
1.玩家输入的坐标不在棋盘范围内。
2.玩家输入的坐标已有棋子。
以上两种情况皆为不合法的情况。
3.合法的坐标。
于是我们可以用一个死循环来实现玩家下棋,只有当玩家输入的坐标是情况3时,使用break跳出循环。
代码如下:
void player(char broad[ROW][COL], int row, int col)
{
printf("玩家走。\n");
int i, j;
while (1)
{
scanf("%d%d", &i, &j);
if (i>=1 && i <= row && j>=1 && j <= col)
{
if (broad[i-1][j-1] == ' ')
{
broad[i-1][j-1] = '*';
break;
}
else
printf("该格子已被占用。\n");
}
else
printf("坐标非法。\n");
}
}
电脑下棋:
不涉及复制算法,只让电脑生成范围内的随机坐标,但是要注意以下几点
1.在生成的随机坐标在棋盘范围内
解决方法:
用rand函数生成的随机值模上(%)ROW并减去1。
2.坐标没有棋子。
依然使用一个死循环,直到生成的坐标没有棋子,break跳出循环。
代码如下:
void computer(char broad[ROW][COL], int row, int col)
{
printf("电脑走。\n");
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (broad[i][j] == ' ')
{
broad[i][j] = '#';
break;
}
}
}
最后一个为判断胜负函数(返回值为char类型):
胜负分为以下三种情况:
1.玩家赢(字符*)
2.电脑赢(字符#)
3.平局(字符p)
而判断胜负的依据为出现3个连续的棋子。
代码如下:
static int is_full(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (broad[i][j] == ' ')
return 0;
}
}
return 1;
}
char checkwin(char broad[ROW][COL], int row, int col)
{
int i = 0;
//判断一行是否出现三个连续棋子
for (i = 0; i < row; i++)
{
if (broad[i][0] == broad[i][1]
&& broad[i][1] == broad[i][2]
&& broad[i][0]!=' ')
return broad[i][0];
}
//判断一列是否出现三个棋子
for (i = 0; i < col; i++)
{
if (broad[0][i] == broad[1][i]
&& broad[1][i] == broad[2][i]
&& broad[0][i] != ' ')
return broad[0][i];
}
//判断斜线是否出现三个棋子
if ((broad[0][0] == broad[1][1] && broad[1][1] == broad[2][2]
&& broad[1][1] != ' ')
|| (broad[2][0] == broad[1][1] && broad[1][1] == broad[0][2]
&& broad[1][1] != ' '))
{
return broad[1][1];
}
//判断是否和棋
if (is_full(broad,row,col))
{
return 'p';
}
//当未出现输赢以及和棋,游戏继续。
return 'c';
}
ps:每一次落子都需判断一次。
整个程序的代码如下:
#include
#include
#include
#define ROW 3
#define COL 3
void Initbroad(char broad[ROW][COL],int row,int col);
void display(char broad[ROW][COL],int row,int col);
void player(char broad[ROW][COL], int row, int col);
void computer(char broad[ROW][COL], int row, int col);
char checkwin(char broad[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void Initbroad(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
broad[i][j] = ' ';
}
}
}
void display(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" %c |", broad[i][j]);
}
else
printf(" %c \n", broad[i][j]);
}
if (i < row - 1)
{
printf("---|---|---\n");
}
}
}
void player(char broad[ROW][COL], int row, int col)
{
printf("玩家走。\n");
int i, j;
while (1)
{
scanf("%d%d", &i, &j);
if (i>=1 && i <= row && j>=1 && j <= col)
{
if (broad[i-1][j-1] == ' ')
{
broad[i-1][j-1] = '*';
break;
}
else
printf("该格子已被占用。\n");
}
else
printf("坐标非法。\n");
}
}
void computer(char broad[ROW][COL], int row, int col)
{
printf("电脑走。\n");
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (broad[i][j] == ' ')
{
broad[i][j] = '#';
break;
}
}
}
static int is_full(char broad[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (broad[i][j] == ' ')
return 0;
}
}
return 1;
}
char checkwin(char broad[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (broad[i][0] == broad[i][1]
&& broad[i][1] == broad[i][2]
&& broad[i][0]!=' ')
return broad[i][0];
}
for (i = 0; i < col; i++)
{
if (broad[0][i] == broad[1][i]
&& broad[1][i] == broad[2][i]
&& broad[0][i] != ' ')
return broad[0][i];
}
if ((broad[0][0] == broad[1][1] && broad[1][1] == broad[2][2]
&& broad[1][1] != ' ')
|| (broad[2][0] == broad[1][1] && broad[1][1] == broad[0][2]
&& broad[1][1] != ' '))
{
return broad[1][1];
}
if (is_full(broad,row,col))
{
return 'p';
}
return 'c';
}
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void game()
{
char ret = 0;
char broad[ROW][COL] = {
0 };
Initbroad(broad,ROW,COL);
display(broad, ROW, COL);
while (1)
{
//玩家下
player(broad, ROW, COL);
//判断胜负
ret=checkwin(broad, ROW, COL);
if (ret != 'c')
{
break;
}
display(broad, ROW, COL);
//电脑下
computer(broad, ROW, COL);
//判断胜负
ret = checkwin(broad, ROW, COL);
if (ret != 'c')
{
break;
}
display(broad, ROW, COL);
}
display(broad, ROW, COL);
if (ret == '*')
printf("玩家赢。\n");
else if (ret == '#')
printf("电脑赢。\n");
else if (ret == 'p')
printf("平局。\n");
}
void menu()
{
printf("#############\n");
printf("###0.exit####\n");
printf("###1.start###\n");
printf("#############\n");
}
int main()
{
srand((unsigned int)time(NULL));
int n = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &n);
switch (n)
{
case 0:
printf("退出游戏\n");
break;
case 1:
game();
break;
default:
printf("输入错误。\n");
break;
}
} while (n);
return 0;
}
谢谢你的阅读。