C语言_游戏目录
- C_Game001_三子棋
- C_Game002_扫雷
文章目录
前言
- 游戏规则:游戏是根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。不太了解的可以点击 链接 玩几把体验一下。
- 设计思路:多文件组织完成9×9的扫雷游戏,分为测试模块和游戏模块:
- 首先制作一个菜单让玩家选择是玩游戏还是退出游戏;
- 接着我们开始制作扫雷的两个棋盘(一个存放布置好的雷的信息,一个存放排查出的雷的信息),并初始化和打印;
- 下一步开始埋雷,置1为雷,0为非雷;
- 雷埋好了就开始扫雷:第一次扫雷实现展开一片的操作使游戏可玩性增加,后续扫雷可以标记雷和取消标记,并显示剩余雷的个数。
一、测试模块test.c
测试逻辑:
- 首先,我们封装函数,实现菜单和选择功能。
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*******1. play*******\n");
printf("*******0. exit*******\n");
printf("*********************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
玩游戏至少要出现一次,这里我们使用do-while循环。
- 定义game函数:(以下函数需要声明和定义,详见game.h和game.c)
- 游戏定义两个二维数组,一个存放布置好的雷的信息,一个存放排查出的雷的信息,如果二者都只用一个二维数组的话后面的实现逻辑会比较麻烦,所以这里我们创建两个二维数组。
char mine[ROWS][COLS] = { 0 };
存放布置好的雷的信息;
char show[ROWS][COLS] = { 0 };
存放排查出的雷的信息; - 初始化棋盘:click
InitBoard(mine, ROWS, COLS, '0');
将棋盘mine全部设为字符0
;
InitBoard(show, ROWS, COLS, '*');
将棋盘show全部设为字符*
; - 打印棋盘:click
DisplayBoard(mine,ROW,COL);
将布置的信息打印出来,可以先打印看一看效果;
DisplayBoard(show, ROW, COL, EASY_COUNT);
将排查出的雷的信息打印出来; - 埋雷:
SetMine(mine, ROW, COL);
在mine数组埋下10个雷,即将符号'0'
置为'1'
;click - 扫雷:
FindMine(mine, show, ROW, COL);
玩家输入扫雷坐标进行扫雷;click
- 游戏定义两个二维数组,一个存放布置好的雷的信息,一个存放排查出的雷的信息,如果二者都只用一个二维数组的话后面的实现逻辑会比较麻烦,所以这里我们创建两个二维数组。
void game()
{
char mine[ROWS][COLS] = {
0 };
char show[ROWS][COLS] = {
0 };
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//DisplayBoard(mine,ROW,COL);
DisplayBoard(show, ROW, COL, EASY_COUNT);
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);//可以打印出来查看布雷效果
FindMine(mine, show, ROW, COL);
//DisplayBoard(show, ROW, COL);
}
这里我们使用宏定义,定义ROW和COL为9;
二、游戏模块game.h
- 宏定义ROW、COL、ROWS、COLS
- 声明函数
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASY_COUNT 10 //埋雷的个数
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char mine[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
三、游戏模块game.c
1、初始化函数
遍历数组使mine数组成员初始化为字符`0`,使show数组成员初始化为字符`*`。
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
为了方便后续排雷时计算边界位置周围雷的个数,我们将棋盘行扩大两行,列扩大两列,即:
#define ROWS ROW+2
#define COLS COL+2
注意这里传参传的是ROWS和COLS,因为初始化需要将mine棋盘11行11列都初始化为字符0,否则后续排雷时,9行9列以外的不方便计算。
2、打印函数
打印棋盘时我们将行号和列号也一同打印出来,这样方便玩家观察游戏;
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("————扫雷————\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j); //控制列号
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i