使用C语言构建简易扫雷游戏(完整实现与模块化设计)
项目概述
本文将详细介绍如何用C语言在控制台环境中开发一个简化版的扫雷游戏。通过合理划分功能模块,结合数组操作与用户交互逻辑,实现一个可重复运行、结构清晰的小型游戏程序。
整体架构设计
游戏采用多文件工程结构,分为三个核心部分:
- main.c:主函数入口,负责流程调度
- game.h:头文件,声明所有外部接口和宏定义
- board.c:实现棋盘初始化、布雷、排雷等具体逻辑
菜单系统实现
首先设计一个交互式菜单界面,引导玩家选择开始或退出游戏:
#include <stdio.h>
void ShowMenu() {
printf("\n+------------------+\n");
printf("| 扫雷小游戏 |\n");
printf("+------------------+\n");
printf("| 1. 启动游戏 |\n");
printf("| 0. 结束程序 |\n");
printf("+------------------+\n");
printf("请输入选项: ");
}
主控循环逻辑
使用do-while结构维持游戏状态,直到用户主动退出:
int main() {
int choice = 0;
do {
ShowMenu();
scanf("%d", &choice);
switch(choice) {
case 1:
LaunchGame(); // 调用游戏主体
break;
case 0:
printf("感谢游玩!再见。\n");
break;
default:
printf("无效输入,请重试。\n");
break;
}
} while(choice != 0);
return 0;
}
棋盘建模与数据结构
定义二维字符数组作为游戏底层存储结构:
bombMap[HEIGHT][WIDTH]:隐藏地图,记录地雷分布displayMap[HEIGHT][WIDTH]:显示层,呈现给玩家的视图
为避免越界访问,实际分配空间时扩大边界范围,便于边缘格子的邻域计算。
头文件定义(game.h)
#ifndef _GAME_H_
#define _GAME_H_
#define WIDTH 9
#define HEIGHT 9
#define MINE_COUNT 10
#define VISIBLE_ROWS (HEIGHT + 2)
#define VISIBLE_COLS (WIDTH + 2)
void LaunchGame();
void InitializeGrid(char grid[VISIBLE_ROWS][VISIBLE_COLS], char value);
void RenderBoard(const char grid[VISIBLE_ROWS][VISIBLE_COLS]);
void PlaceMines(char grid[VISIBLE_ROWS][VISIBLE_COLS]);
int ProbeCell(const char bombGrid[VISIBLE_ROWS][VISIBLE_COLS],
char showGrid[VISIBLE_ROWS][VISIBLE_COLS], int x, int y);
#endif
棋盘初始化与渲染
初始化两个独立图层:
void InitializeGrid(char grid[VISIBLE_ROWS][VISIBLE_COLS], char value) {
for (int i = 0; i < VISIBLE_ROWS; ++i) {
for (int j = 0; j < VISIBLE_COLS; ++j) {
grid[i][j] = value;
}
}
}
打印可视化界面:
void RenderBoard(const char grid[VISIBLE_ROWS][VISIBLE_COLS]) {
printf("\n ");
for (int col = 1; col <= WIDTH; ++col) {
printf("%d ", col);
}
printf("\n");
for (int row = 1; row <= HEIGHT; ++row) {
printf("%d ", row);
for (int col = 1; col <= WIDTH; ++col) {
printf("%c ", grid[row][col]);
}
printf("\n");
}
}
地雷布置机制
利用随机数生成器在合法区域内放置指定数量的地雷:
void PlaceMines(char grid[VISIBLE_ROWS][VISIBLE_COLS]) {
int placed = 0;
while (placed < MINE_COUNT) {
int x = rand() % HEIGHT + 1;
int y = rand() % WIDTH + 1;
if (grid[x][y] != 'X') {
grid[x][y] = 'X';
placed++;
}
}
}
玩家探查逻辑
根据坐标判断是否触雷,并统计周围地雷数量:
int ProbeCell(const char bombGrid[VISIBLE_ROWS][VISIBLE_COLS],
char showGrid[VISIBLE_ROWS][VISIBLE_COLS], int x, int y) {
if (bombGrid[x][y] == 'X') {
return -1; // 游戏失败
}
int count = 0;
for (int i = x - 1; i <= x + 1; ++i) {
for (int j = y - 1; j <= y + 1; ++j) {
if (bombGrid[i][j] == 'X') {
count++;
}
}
}
showGrid[x][y] = count + '0';
return 1; // 成功排查
}
游戏流程集成
在LaunchGame()中整合所有模块:
- 初始化两个图层
- 调用布雷函数
- 循环接收用户输入并更新显示
- 检测胜利条件或失败状态
每轮输出当前棋盘状态,提示用户输入行列坐标进行探测。