阅读水平条件:
C语言的基本语法:
我们实现一个 9 * 9 的宫格扫雷,有81 个格子,在 81个格子随机放入 10个雷;当输入格子对应坐标时候,开始扫雷,扫到雷游戏结束,没扫到雷,则继续游戏,直到扫完为止;
前提准备文件:(笔者用vs2013创建的文件)
game.c 文件:用于实现扫雷游戏的功能函数;
game.h 文件:用于声明函数,和声明一些头文件;
text.c 文件:用于主函数测试游戏文件;
game.h 头文件代码:
# pragma once
# define _CRT_SECURE_NO_WARNINGS 1
# include
# include //随机数种子 srand()的头文件
# include //时间函数time 的头文件
# 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 ShowBoard(char board[ROWS][COLS], int row, int col);
//设置宫格
void SetBoard(char board[ROWS][COLS], int row, int col);
//排雷功能
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c 文件代码就是 扫雷游戏功能函数的集合;
首先:我们需要一个简易的菜单函数:显示游戏界面的菜单;
其次:我们需要选择游戏开始的按键和游戏结束的按键;
接着:选择游戏时候可以用 do while 循环,switch 语句实现;
最后:设置选择 1开始游戏,选择 0 退出游戏;
主函数基本代码逻辑:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:》");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择有误,重写选择:\n\n");
break;
}
} while (input);
system("pause");
return 0;
}
如下代码:
void game()
{
char mine[ROWS][COLS] = {
0 };//存放雷的信息
char show[ROWS][COLS] = {
0 };//显示排除出雷的信息
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//设置雷的位置
SetBoard(mine, ROW, COL);
ShowBoard(mine, ROW, COL);
//显示棋盘
ShowBoard(show, ROW, COL);
//开始排查雷
FindMine(mine, show,ROW, COL);
}
初始化,本质就是给二维数组设置值:
注意传入的参数:
ROWS 在头文件定义的 11
COLS 在头文件定义的 11
set 为数组存放的字符
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
//printf("%d ", board[i][j]);
}
}
}
主要控制赋值的地方是在下标【1,9】的地方即可;
其他的都是修饰
void ShowBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <=row+1; i++) //显示棋盘的行号
{
if (i == 0) //第一个下标显示扫字
{
printf("扫 ");
continue;
}
if (i == row+1) //第10个下标时候显示雷字
{
printf("雷");
continue;
}
printf("%d ", i); //下标1-9显示 数字
}
printf("\n");
for (int i = 0; i <= row+1; i++) //分割棋盘的作用
{
printf("__");
}
printf("\n");
for (int i = 1; i <= row+1; i++) //显示棋盘的内容,下标为为 1-9 二维数组的范围
{
if (i != row + 1) //显示竖列的棋盘数字和分割竖列的棋盘
{
printf("%d ", i);
printf("|");
}
if (i == row + 1) //在棋盘最后一行的下一行打印--符号分割
{
for (int j = 0; j <= col + 1; j++)
{
printf("--");
}
printf(" \n");
continue; //跳过外层循环,不然其再打印棋盘大小了
}
//显示棋盘的内容
for (int j = 1; j <= col+1; j++)
{
if (j == col + 1) //显示棋盘最后1列的下一列的分割符号
{
printf("|");
continue;
}
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetBoard(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
//生成随机下标插入 雷的信息
int x = rand() % row + 1;//保持下标在 1 - 9 的位置
int y = rand() % col + 1;
if (board[x][y] != '1') //随机下标下落点,不能有下落过的地方
{
board[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y) //统雷的个数
{
int count = 0;
for (int i = x - 1; i <= x + 1;i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == '1') count++;
}
}
return count;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win <row*col - EASY_COUNT)
{
printf("请输入你要排雷的坐标位置:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col )//保证坐标合法,且在合适的坐标排雷
{
if (mine[x][y] == '1') //排中雷
{
printf("很遗憾,你排中地雷了。\n!!!游戏结束!!!\n");
SetBoard(mine, ROW, COL);
break;
}
else //排的不是雷
{
int count = GetMineCount(mine, x, y); //统计雷的个数
show[x][y] = count + '0'; //count是数字,要加个字符’0‘,转化为字符count
ShowBoard(show, ROW, COL);
win++;
}
}
else
{
printf("你输入的非法坐标,请重新输入:");
}
}
if (win == row*col - EASY_COUNT)
printf("恭喜你,排雷成功,游戏结束啦\n");
}