这个示例实现了扫雷游戏的基本功能,包括初始化棋盘、布置地雷、显示棋盘以及排查地雷等。
文件结构
game.h:头文件,包含游戏所需的数据类型和函数声明。
game.c:源文件,包含游戏逻辑的实现。
main.c:主程序文件,包含main函数,用于启动游戏。
main.c
#include <stdio.h>
#include "game.h"
void menu() {
printf("********************************\n");
printf("********** 1.play ***********\n");
printf("********** 0.exit ***********\n");
printf("********************************\n");
}
int main() {
char mine[ROWS][COLS] = {0}; // 用于存储地雷分布的棋盘
char show[ROWS][COLS] = {0}; // 用于显示给用户的棋盘
int input = 0;
srand((unsigned int)time(NULL)); // 初始化随机数种子
do {
menu();
printf("请选择选项:>");
scanf("%d", &input);
switch (input) {
case 1:
InitBoard(mine, ROWS, COLS, '0'); // 初始化地雷棋盘
InitBoard(show, ROWS, COLS, '*'); // 初始化显示棋盘
SetMine(mine, ROW, COL); // 布置地雷
DisplayBoard(show, ROW, COL); // 显示棋盘
FindMine(mine, show, ROW, COL); // 开始排雷
break;
case 0:
printf("退出扫雷游戏\n");
break;
default:
printf("选择错误,请重新开始选择\n");
break;
}
} while (input != 0);
return 0;
}
game.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "game.h"
// 初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j] = set;
}
}
}
// 显示棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
int i, j;
printf("******* 扫雷 *******\n");
for (j = 0; j <= col; j++) {
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++) {
printf("%d ", i);
for (j = 1; j <= col; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
// 布置地雷
void SetMine(char mine[ROWS][COLS], int row, int col) {
int count = EASY_COUNT;
while (count) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0') {
mine[x][y] = '1';
count--;
}
}
}
// 排查地雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x, y, win = 0;
while (win < row * col - EASY_COUNT) {
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (show[x][y] == '*') {
if (mine[x][y] == '1') {
printf("很遗憾,你被炸死\n");
DisplayBoard(mine, ROW, COL); // 这里应该显示布雷的棋盘是不合适的,应该显示给用户看的棋盘show,但为简化示例,这里仍使用mine
return;
}
} else {
int mineCount = 0;
// 检查周围8个位置的地雷数量
if (mine[x - 1][y - 1] == '1') mineCount++;
if (mine[x - 1][y] == '1') mineCount++;
if (mine[x - 1][y + 1] == '1') mineCount++;
if (mine[x][y - 1] == '1') mineCount++;
if (mine[x][y + 1] == '1') mineCount++;
if (mine[x + 1][y - 1] == '1') mineCount++;
if (mine[x + 1][y] == '1') mineCount++;
if (mine[x + 1][y + 1] == '1') mineCount++;
show[x][y] = mineCount + '0'; // 显示地雷数量
}
} else {
printf("坐标输入不合法\n");
}
}
printf("恭喜你,排雷成功!\n");
}
game.h
#ifndef GAME_H
#define GAME_H
#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);
#endif // GAME_H
编译与运行
将上述代码分别保存为game.h、game.c和main.c文件,然后使用C编译器(如gcc)进行编译:
gcc main.c game.c -o minesweeper
编译成功后,运行生成的可执行文件:
./minesweeper
此时,你就可以玩这个简单的扫雷游戏了。注意,这个示例实现的是初级难度的扫雷游戏,棋盘大小为9x9,地雷数量为10个。你可以根据需要修改这些参数来增加游戏难度。