三子棋游戏演示
这里是b站视频的链接(本人上传的),因为在CSDN上上传视频有点麻烦。
C语言三子棋演示
三子棋设计思路
接下来将会分成三个文件来讲述,分别是
游戏头文件,游戏的逻辑运行思路源代码,和游戏函数代码
游戏逻辑运行思路源代码
#include "game.h"
void game()
{
char arr[Line][Row] = { 0 };
// 初始化棋盘
Init_board(arr, Line, Row);
// 打印棋盘
Display_board(arr, Line, Row);
while (1)
{
// 玩家下棋
Player(arr, Line, Row);
Display_board(arr, Line, Row);
// 判断输赢
If_win(arr, Line, Row);
if (If_win(arr, Line, Row) == '*')
{
printf("玩家获胜\n");
break;
}
else if(If_win(arr, Line, Row) == '#')
{
printf("电脑获胜\n");
break;
}
else if(If_win(arr, Line, Row) == ' ')
{
printf("平局\n");
break;
}
else
{
printf("游戏继续\n");
}
// 电脑下棋
Computer(arr, Line, Row);
Display_board(arr, Line, Row);
// 判断输赢
If_win(arr, Line, Row);
if (If_win(arr, Line, Row) == '*')
{
printf("玩家获胜\n");
break;
}
else if (If_win(arr, Line, Row) == '#')
{
printf("电脑获胜\n");
break;
}
else if (If_win(arr, Line, Row) == ' ')
{
printf("平局\n");
break;
}
else
{
printf("游戏继续\n");
}
}
}
int main()
{
// 初始化变量
int input = 1;
do
{
// 打印游戏菜单
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("进入游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
游戏函数代码
- 初始化棋盘, 打印棋盘
根据视频中可以看到,既然下棋就要先打印一个棋盘,并且里面要存入空格,这样的话,就可以方便后期将电脑和玩家的下的棋放入到里面。
当然,在初始化棋盘之前要打印一个游戏菜单
代码实现(初始化棋盘,打印棋盘)
// 初始化棋盘
void Init_board(char arr[Line][Row], int line, int row)
{
int i = 0;
for (i = 0; i < line; i++)
{
int j = 0;
for (j = 0; j < row; j++)
{
arr[i][j] = ' ';
}
}
}
// 打印棋盘
void Display_board(char arr[Line][Row], int line, int row) {
int i = 0;
for (i = 0; i < line; i++) {
// 打印数据
int j = 0;
for (j = 0; j < row; j++) {
printf(" %c ", arr[i][j]);
if (j < row - 1) {
printf("|");
}
}
printf("\n");
// 打印分割行
if (i < line - 1) {
int j = 0;
for (j = 0; j < line; j++) {
printf("---");
if (j < row - 1) {
printf("|");
}
}
printf("\n");
}
}
}
对代码的一些注释和打印棋盘函数的说明:
Line表示行,头文件中宏定义为3,Row表示列,头文件中也宏定义为3
打印棋盘函数的说明:这样写的话,如果需要打印5行5列的棋盘或者是要改为更多行列的棋盘,就只需要在头文件中修改Line和Row的值就可以,不需要对源代码进行修改。
- 玩家下棋
按照视频中的做法,首先玩家输入坐标,然后再赋到数组中去
当然,玩家需要输入正确的坐标,如果坐标错误就要提醒
代码实现
// 玩家下棋
void Player(char arr[Line][Row], int line, int row)
{
while (1)
{
printf("玩家下棋:\n");
int a = 0, b = 0;
// 输入坐标
scanf("%d %d", &a, &b);
// 判断是否为空
if (arr[a][b] != ' ' || ( (a < 0 || a > Line) || (b < 0 || b > Row) ) )
{
printf("输入错误\n");
}
else
{
arr[a][b] = '*';
break;
}
}
}
- 电脑下棋
与玩家下棋不同的地方:
1.就是需要随机生成代码,所以就需要用到rand(具体用法这里就不再解释,在之前的文章中都有提到)
2.需要判断该坐标是否已经被使用
** 代码实现**
// 电脑下棋
void Computer(char arr[Line][Row], int line, int row)
{
printf("电脑下棋\n");
while (1)
{
// 生成随机坐标
srand((unsigned)time(NULL));
line = rand() % Line;
row = rand() % Row;
//判断是否被占用
if (arr[line][row] == ' ')
{
arr[line][row] = '#';
break;
}
}
}
- 判断输赢
一共就四种情况
横着赢,竖着赢,对角线赢,平局(先给出前三种情况)
// 判断输赢
char If_win(char arr[Line][Row], int line, int row)
{
int i = 0, j = 0;
// 横着赢
for (i = 0; i < Line; i++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2] && arr[i][j] != ' ')
{
return arr[i][j];
}
}
// 竖着赢
i = 0;
for (j = 0; j < Row; j++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j] && arr[i][j] != ' ')
{
return arr[i][j];
}
}
// 对角线赢
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ')
{
return arr[0][0];
}
else if (arr[2][0] == arr[1][1] && arr[2][0] == arr[0][2] && arr[2][2] != ' ')
{
return arr[2][2];
}
// 判断平局
}
相信也不难看懂,最后就是平局代码的实现。
平局就是棋盘所有的格子都满了,所以就需要一个判断是否棋盘满了的函数
// 判断是否满了
int If_full(char arr[Line][Row], int line, int row)
{
int flag = 0;
int i = 0, j = 0;
for (i = 0; i < Line; i++)
{
for (j = 0; j < Row; j++)
{
if (arr[i][j] != ' ')
{
flag = 1;
}
else
{
flag = 0;
}
}
}
return flag;
}
相当于就是遍历一遍数组,然后判断是否满了。
** 代码实现**
// 判断是否满了
int If_full(char arr[Line][Row], int line, int row)
{
int flag = 0;
int i = 0, j = 0;
for (i = 0; i < Line; i++)
{
for (j = 0; j < Row; j++)
{
if (arr[i][j] != ' ')
{
flag = 1;
}
else
{
flag = 0;
}
}
}
return flag;
}
// 判断输赢
char If_win(char arr[Line][Row], int line, int row)
{
int i = 0, j = 0;
// 横着赢
for (i = 0; i < Line; i++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2] && arr[i][j] != ' ')
{
return arr[i][j];
}
}
// 竖着赢
i = 0;
for (j = 0; j < Row; j++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j] && arr[i][j] != ' ')
{
return arr[i][j];
}
}
// 对角线赢
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ')
{
return arr[0][0];
}
else if (arr[2][0] == arr[1][1] && arr[2][0] == arr[0][2] && arr[2][2] != ' ')
{
return arr[2][2];
}
// 判断平局
if (If_full(arr, Line, Row))
{
return ' ';
}
return 0;
}
所以到了这里,发现三子棋对初学者并不难写,只是时间会耗费的多一点,最后给出头文件代码
游戏头文件
#define Line 3
#define Row 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 游戏菜单
void menu();
// 初始化棋盘
void Init_board(char arr[Line][Row], int, int);
// 打印棋盘
void Display_board(char arr[Line][Row], int, int);
// 玩家下棋
void Player(char arr[Line][Row], int, int);
// 电脑下棋
void Computer(char arr[Line][Row], int, int);
// 判断输赢
char If_win(char arr[Line][Row], int, int);
// 是否满了
int If_full(char arr[Line][Row], int, int);
最后想说的是,希望大家自己完完全全的写一遍,不要觉得麻烦,收获还是很大的