扫雷这款游戏相信没有人没玩过,学生时期每次上微机课的时候一定会先打开玩上两把。那这款经典的游戏是怎么被写出来的呢?这篇博客将带您从零开始,使用C语言编写一个简化版的扫雷游戏。
游戏规则
扫雷游戏通常在一个方格网格中进行,每个方格可能包含以下几种元素之一:
- 地雷:某些方格中包含地雷,踩到地雷会导致游戏失败。
- 数字:数字表示相邻方格中的地雷数量。
- 空白:空白方格表示周围没有地雷,揭开时可能会展开一片区域。
游戏的目标是揭开所有不含地雷的方格,同时避免揭开地雷。
准备工作
在开始编写代码之前,我们需要进行一些准备工作。首先,我们要定义游戏的网格大小和地雷数量。在这个示例中,我们将使用一个10x10的网格,并在其中放置10颗地雷。
#define SIZE 10
#define MINES 10
我们还需要定义两个二维数组来表示游戏的状态:grid 用于存储地雷和数字信息,
revealed 用于跟踪哪些方格已经揭开。
int grid[SIZE][SIZE];
int revealed[SIZE][SIZE];
初始化游戏
游戏初始化是整个游戏的第一步。在初始化阶段,我们将清空grid
和revealed
数组,并随机布置地雷。
void initializeGame() {
// 清空游戏网格和已揭开方块的数组
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
grid[i][j] = 0;
revealed[i][j] = 0;
}
}
// 随机布置地雷
srand(time(NULL));
int count = 0;
while (count < MINES) {
int x = rand() % SIZE;
int y = rand() % SIZE;
if (grid[x][y] == 0) {
grid[x][y] = -1; // -1 表示地雷
count++;
}
}
}
打印游戏界面
在游戏进行中,我们需要能够查看当前游戏的状态。我们将创建一个函数来打印游戏界面,显示已揭开的方格、地雷和数字。
void printGameBoard() {
// 打印游戏标题和列数
printf("扫雷游戏\n\n");
printf(" ");
for (int i = 1; i <= SIZE; i++) {
printf("%d ", i);
}
printf("\n");
// 打印游戏界面
for (int i = 0; i < SIZE; i++) {
printf("%d ", i + 1); // 打印行数
for (int j = 0; j < SIZE; j++) {
if (revealed[i][j]) {
if (grid[i][j] == -1) {
printf("* "); // 地雷
} else if (grid[i][j] == 0) {
printf(" "); // 0表示周围没有地雷
} else {
printf("%d ", grid[i][j]); // 数字
}
} else {
printf("* "); // 未揭开的网格
}
}
printf("\n");
}
}
揭开方格
游戏的核心部分是揭开方格。我们将创建一个reveal
函数来处理这个过程。此函数将接受用户输入的坐标,并根据坐标揭开相应的方格。
void reveal(int x, int y) {
x--; // 将用户输入的坐标从1到10映射到0到9
y--;
// 检查方格是否合法以及是否已经揭开
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || revealed[x][y]) {
return; // 超出边界或已经揭开的方格不再处理
}
revealed[x][y] = 1; // 标记方格已揭开
remainingTiles--;
if (grid[x][y] == -1) {
// 游戏失败,揭开地雷
printf("游戏失败!你踩到了地雷。\n");
// 揭示所有方格和地雷
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
revealed[i][j] = 1;
}
}
return;
} else {
// 揭开数字方块
int count = 0; // 计算周围的地雷数量
// 检查周围8个方块
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (x + dx >= 0 && x + dx < SIZE && y + dy >= 0 && y + dy < SIZE) {
if (grid[x + dx][y + dy] == -1) {
count++;
}
}
}
}
if (count > 0) {
// 存储数字到grid数组中
grid[x][y] = count;
}
}
if (remainingTiles == 0) {
// 游戏胜利,所有非地雷方块都已揭开
printf("恭喜,你赢了!\n");
// 在这里可以添加游戏结束的逻辑
return;
}
}
主函数
最后,我们来编写主函数来驱动整个游戏。在主函数中,我们将初始化游戏,然后在一个无限循环中等待玩家的输入。
int main() {
initializeGame();
while (1) {
printGameBoard();
int x, y;
printf("\n请输入要揭开的方块的坐标(格式:x y):");
scanf("%d %d", &x, &y);
reveal(x, y);
}
return 0;
}
总结
通过以上的步骤,我们成功地创建了一个简单的扫雷游戏,并用C语言实现了它。让我们开始游玩吧!
这个示例虽然简单,但包含了扫雷游戏的核心功能,可以作为进一步扩展和改进的基础。
希望这篇博客对初学者有所帮助,如果您有任何问题或建议,请随时提出。玩得开心,扫雷游戏!
以下是完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
#define MINES 10
int grid[SIZE][SIZE];
int revealed[SIZE][SIZE];
int remainingTiles; // 未揭开的方块数量
void initializeGame() {
// 初始化游戏网格和已揭开方块的数组
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
grid[i][j] = 0;
revealed[i][j] = 0;
}
}
// 随机布置地雷
srand(time(NULL));
int count = 0;
while (count < MINES) {
int x = rand() % SIZE;
int y = rand() % SIZE;
if (grid[x][y] == 0) {
grid[x][y] = -1; // -1 表示地雷
count++;
}
}
}
void printGameBoard() {
printf("扫雷游戏\n\n");
// 打印列数
printf(" ");
for (int i = 1; i <= SIZE; i++) {
printf("%d ", i);
}
printf("\n");
// 打印游戏界面
for (int i = 0; i < SIZE; i++) {
printf("%d ", i + 1); // 打印行数
for (int j = 0; j < SIZE; j++) {
if (revealed[i][j]) {
if (grid[i][j] == -1) {
printf("* "); // 地雷
}
else if (grid[i][j] == 0) {
printf(" "); // 0表示周围没有地雷
}
else {
printf("%d ", grid[i][j]); // 数字
}
}
else {
printf("* "); // 未揭开的网格
}
}
printf("\n");
}
}
void reveal(int x, int y) {
x--; // 将用户输入的坐标从1到10映射到0到9
y--;
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || revealed[x][y]) {
return; // 超出边界或已经揭开的方块不再处理
}
revealed[x][y] = 1; // 标记方块已揭开
remainingTiles--;
if (grid[x][y] == -1) {
// 游戏失败,揭开地雷
printf("游戏失败!你踩到了地雷。\n");
// 揭示所有方格和地雷
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
revealed[i][j] = 1;
}
}
return;
}
else {
// 揭开数字方块
int count = 0; // 计算周围的地雷数量
// 检查周围8个方块
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (x + dx >= 0 && x + dx < SIZE && y + dy >= 0 && y + dy < SIZE) {
if (grid[x + dx][y + dy] == -1) {
count++;
}
}
}
}
if (count > 0) {
// 存储数字到grid数组中
grid[x][y] = count;
}
}
if (remainingTiles == 0) {
// 游戏胜利,所有非地雷方块都已揭开
printf("恭喜,你赢了!\n");
// 在这里可以添加游戏结束的逻辑
return;
}
}
int main() {
initializeGame();
while (1) {
printGameBoard();
int x, y;
printf("\n请输入要揭开的方块的坐标(格式:x y):");
scanf("%d %d", &x, &y);
reveal(x, y);
}
return 0;
}