- C语言实现扫雷
- 前言
- 一、基本思路
- 二、相关函数
- 1. 初始化
- 2. 打印
- 3. 埋雷
- 4. 排雷
- 计算周围雷的个数
- 三、测试模块
本文使用C语言实现扫雷小游戏
感兴趣的朋友赶快来看看吧
实现效果:
win:
前言
扫雷是一个经典的小游戏,一张雷盘中有多个不确定是雷还是安全区域的小格子。当排雷时,如果该区域是雷则游戏结束,如果不是雷则会在该区域显示一个数字,表示周围八个格子雷的个数。
一、基本思路
- 创建一个交互菜单
- 使用一个show二维数组作为雷盘的展示,并和用户进行交互
- 使用一个mine二维数组用来埋雷,也就是存储雷的信息
- 用户输入要排查的坐标
- 判断游戏是否结束
- 继续排查
…… - 如果雷全部排完则游戏胜利
- game.h
#include#include #include #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define EASY_MODE 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 board[ROWS][COLS], int row, int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
- game.c
初始化数组的内容为指定的内容,mine 数组在没有布置雷的时候,都是’0’
show 数组在没有排查雷的时候,都是’*’
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;//set是要初始化成的字符
}
}
}
2. 打印
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("-----------扫雷游戏----------n");
for (int j = 0; j <= col; ++j)
{
printf(" %d ", j);
}
printf("n");
for (int i = 1; i <= row; ++i)
{
printf(" %d ", i);
for (int j = 1; j <= col; ++j)
{
printf(" %c ", board[i][j]);
}
printf("n");
}
printf("-----------扫雷游戏----------n");
}
3. 埋雷
EASY_MODE为雷的个数,埋好一个雷就将个数减一,这里用字符’1‘表示该位置是雷,字符’0‘表示不是雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_MODE;
while (count)
{
//1~9
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
4. 排雷
计算周围雷的个数
我们知道数字字符1~9要想转换成数值1~9只需将其减去字符’0‘即可。
因为在初始化时mine数组全部被初始化为字符’0‘,而在埋雷时将雷设置为字符’1‘,所以在排雷时只需把该坐标周围八个的字符全部相加然后减去八个字符’0‘就可以得到该坐标周围雷的个数。这是设计的巧妙之处。
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
return (board[x - 1][y]
+ board[x - 1][y - 1]
+ board[x][y - 1]
+ board[x + 1][y - 1]
+ board[x + 1][y]
+ board[x + 1][y + 1]
+ board[x][y + 1]
+ board[x - 1][y + 1] - 8*'0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
int x = 0;
int y = 0;
while (win < row*col - EASY_MODE)
{
printf("输入排查坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
{
//show[x][y]有可能为'*'、数字字符
if (show[x][y] >= '0' && show[x][y] <= '8')
{
printf("不能重复排查n");
}
else
{
if (mine[x][y] == '1')//如果是雷
{
printf("游戏结束,你被炸死了n");
DisplayBoard(mine, ROW, COL);
break;
}
else//不是雷
{
int cnt = GetMineCount(mine, x, y);
show[x][y] = cnt + '0';//转换成数字字符
DisplayBoard(show, ROW, COL);
win++;
}
}
}
else
{
printf("输入坐标非法n");
}
if (win == row * col - EASY_MODE)
{
printf("恭喜你,排雷成功n");
DisplayBoard(mine, ROW, COL);
break;
}
}
}
三、测试模块
- test.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void game()
{
char show[ROWS][COLS] = { 0 };
char mine[ROWS][COLS] = { 0 };
int input = 0;
//初始化
InitBoard(show, ROWS, COLS,'*');
InitBoard(mine, ROWS, COLS,'0');
//埋雷
SetMine(mine, ROW, COL);
//打印
DisplayBoard(show, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//扫雷
FindMine(mine, show, ROWS, COLS);
}
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("退出成功");
break;
default :
printf("选择错误,请重新选择");
break;
}
} while (input);
return 0;
}
本文到此就结束了,如果有错误,请指正。



