一.游戏介绍
我们之前学了数组的创建与使用等方面的内容,接下来我们就可以尝试动手自己写一个游戏,这里以三子棋游戏为例,要写这样的游戏代码我们就需要制定一下方案以及思路,以下是我的方案:
项目名:Game
源文件:
test.c 测试游戏的逻辑是否有问题
game.c 游戏代码
头文件:
game.h 存放游戏代码的声明与定义
其主要代码存放在game.c与game.h中,项目创建完成后如图所示:
二.游戏菜单
不知道大家还记得我们之前写过的猜数字游戏吗?程序一运行首先会显示一个菜单,让玩家选择游玩或者退出,那我们就先在test.c代码中实现这一功能,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(){
printf("***********************\n");
printf("****1.play 0.exit*****\n");
printf("***********************\n");
}
int main(void){
do{
menu();
} while ();
return 0;
}
我们使用do...while()循环,这个循环的特点就是先执行循环中的内容再进行判断是否可以进入下一次循环,也就是无论如何这个循环都会被执行一次,接下来我们就需要让用户进行选择,是进行游玩还是退出,其中用到的函数有printf() scanf() 以及switch()语句等,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(){
printf("***********************\n");
printf("****1.play 0.exit*****\n");
printf("***********************\n");
}
int main(void){
int user_choose;
do{
menu();
printf("请选择:");
scanf("%d",&user_choose);
switch (user_choose){
case 1:
printf("进入游戏!\n");
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误!请重新输入!\n\a");
break;
}
} while (user_choose);
return 0;
}
我们使用printf()提醒用户输入,使用scanf()来接收用户输入的数据,随后将user_choose变量传入switch()语句中根据变量的值选择执行不同的case子句,当用户输入非法数据时则跳转到default语句中提示用户输入错误,并要求用户重新输入,如图所示:
注意这里的case 1子句中printf("进入游戏!");是测试语句,这里需要替换成我们写的游戏代码,我们将游戏代码封装进game()函数中,这个函数就是我们case 1子句需要执行的内容
三.游戏逻辑
写完菜单部分我们就着重来看游戏逻辑部分,要求做一个3x3大小的棋盘,玩家先下棋,玩家下的棋用*表示,电脑下的棋用#表示,玩家下棋的方式是输入棋盘上的坐标,如 1 1,随后电脑下棋,电脑下完棋后再次提示玩家输入坐标进行下棋,最后判断输赢,棋盘样式(红圈代表落子点):
既然我们已知是用*与#来代表棋子,那么我们的棋盘也就应该是char类型的一个二维数组,代码如下:
//棋盘:
char board [3][3] = {0};
我们再来观察棋盘可以发现,在用户落子之前就已经分割成9块区域了,那么每块区域中看似没有内容,实则每块区域中都是空格,否则这个棋盘就无法形成,也就是说我们需要将空格放进这个二维数组的每一个元素中去,这样子才能看上去像棋盘,所以我们再写上一个初始化棋盘函数 InitBoard() 用来初始化棋盘,这个函数有三个参数,分别是:数组名,行数,列数,我们数组名是board,行与列都是3,则可以写成:
InitBoard(board,3,3);
既然是自定义函数那我们就需要定义这个函数,我们分别在game.c与game.h中写入以下代码:
game.c中代码:
void InitBoard(char board[3][3], int row, int col){
}
game.h中代码:
void InitBoard(char board[3][3], int row, int col);
补充:日后我们可能需要写更加大的棋盘,这就需要我们将棋盘大小 3x3全部改掉,很麻烦,我们可以在game.h的头文件中定义两个常量分别是 row(行)与col(列)代码如下:
#define ROW 3
#define COL 3
game.h中代码则变为:
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
game()函数代码则变为:
game(){
char board[ROW][COL] = {0};
InitBoard(board,ROW,COL);
}
注意我们直接写 ROW 与 COL 是会报错的,因为这两个常量是被定义在 game.h 的头文件中,所以我们先要引用 game.h 的头文件才可以,代码如下:
#include"game.h"
这将方便我们日后更改棋盘的大小,我们只需要更改#define ROW 与 #define COL 后面的值即可
回到正题我们需要二维数组的每一个元素为空格,我们就需要用到for循环,将每一行每一列都变为空格
代码如下:
//以下代码写在game.c的源文件中
#include"game.h"
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] = " ";
}
}
}
这样子我们就成功的创建了一个空棋盘
2023/9/3
王起舟