引言:当我们C语言学习完数组的时候,可以尝试一些小的游戏来提升自己,比如下面的这个三子棋。
游戏玩法介绍:我们跟电脑进行落棋,但同类型的棋子落在同行、同列以及斜着的情况时即可视为玩家赢,反之电脑赢,还有就是棋盘落满但没有分出胜负视为平局。
项目技能要求:分支语句以及循环语句、函数、数组。
接下来我将创建三个文件:
具备函数声明、宏定义、所需库函数的头文件
以及还有两个函数实现
以及测试代码逻辑
的源文件。
项目大纲
在我们正式写项目之前,要先想明白自己想写什么功能,比如:
- 测试游戏逻辑
- 菜单
- 创建并初始化棋盘
- 打印棋盘
- 玩家下棋
- 电脑下棋
- 判断状态(玩家赢、电脑赢、平局、继续游戏)
函数声明以及宏定义、库函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//初始化棋盘
void Initboard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayborad(char board[ROW][COL], int row, int col);
//玩家下棋
void Playermove(char board[ROW][COL], int row, int col);
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col);
//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char Is_Win(char board[ROW][COL], int row, int col);
在头文件里我们需要添加需要常用的库函数以及对函数的声明,还有宏定义避免后续修改造成麻烦。
函数实现
//初始化棋盘为空格
void Initboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Displayborad(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < row; j++)
{
printf(" %c ", board[i][j]);
if (j < row - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("---");
if (j < row - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
打印预览
//玩家下棋
void Playermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家请输入坐标:");
scanf("%d %d", &x, &y);
//首先判断坐标有无在指定区域落棋
if (((x >= 1) && (x <= 3)) && ((y >= 1) && (y <= 3)))
{
//当判断在指定区域的时候,我们还需要判断这个指定的坐标内有无棋子
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入!!!\n");
}
}
else
{
printf("坐标输入有误,请重新输入!!!\n");
}
}
}
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col)
{
int x = 0;//0 到 row - 1
int y = 0;//0 到 col - 1
printf("电脑输入:\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char Is_Win(char board[ROW][COL], int row, int col)
{
int i = 0;
//判断行内三个子有没有连在一起的情况
for (i = 0; i < row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != ' '))
{
if (board[i][0] == '*')
{
return '*';
}
else
{
return '#';
}
}
}
//判断列内三个子有没有连在一起的情况
for (i = 0; i < col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' '))
{
if (board[0][i] == '*')
{
return '*';
}
else
{
return '#';
}
}
}
//判断两个斜着的情况
//左斜
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] != ' '))
{
if (board[0][0] == '*')
{
return '*';
}
else
{
return '#';
}
}
//右斜
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[0][2] != ' '))
{
if (board[0][2] == '*')
{
return '*';
}
else
{
return '#';
}
}
//平局和继续其实就是看棋盘上的棋子有没有落满
//我们定义一个flag,当flag == 1 -> 平局
//当flag == 0 -> 继续
int flag = 1;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
flag = 0;
}
}
}
if (flag)
{
return 'Q';
}
else
{
return 'C';
}
}
游戏成功预览
测试代码逻辑:
//菜单
void menu()
{
printf("*********************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("*********************\n");
}
//游戏运行逻辑
void game()
{
char board[ROW][COL] = {0};
int ret = 0;
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Displayborad(board, ROW, COL);
while (1)
{
//玩家下棋
Playermove(board, ROW, COL);
//打印棋盘
Displayborad(board, ROW, COL);
//判断输赢
ret = Is_Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
Computermove(board, ROW, COL);
//打印棋盘
Displayborad(board, ROW, COL);
//判断输赢
ret = Is_Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
//除去继续游戏的可能性,判断胜负还是平局
if (ret == '*')
{
printf("玩家赢!!!\n");
}
else if (ret == '#')
{
printf("电脑赢!!!\n");
}
else
{
printf("平局!!!\n");
}
}
//主函数
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("欢迎下次再来!!!\n");
break;
default:
printf("输入有误,请重新输入!!!\n");
break;
}
} while (input);
return 0;
}
这样通过do…while()以及switch的配合使用可以保证至少执行一次,让我们有选择的余地是退出游戏还是继续玩游戏。
项目到此就结束了,觉得对你有帮助,不妨留下一个攒吧~