C语言扫雷游戏:附带源码和讲解
C语言扫雷游戏:附带源码和讲解
想学习如何用C语言编写经典的扫雷游戏吗?这篇文章提供了一个简单的命令行界面扫雷游戏的C语言代码,并附带详细的代码讲解,帮助你快速入门游戏开发。
代码c#include <stdio.h>#include <stdlib.h>#include <time.h>
#define SIZE 10#define MINE_COUNT 10
int mines[SIZE][SIZE];int revealed[SIZE][SIZE];
// 初始化游戏void initGame() { // 初始化雷区和已经揭示的区域 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { mines[i][j] = 0; revealed[i][j] = 0; } } // 随机生成雷的位置 int count = 0; while (count < MINE_COUNT) { int x = rand() % SIZE; int y = rand() % SIZE; if (mines[x][y] == 0) { mines[x][y] = 9; // 9表示雷 count++; } }}
// 打印游戏界面void printBoard() { printf(' '); for (int i = 0; i < SIZE; i++) { printf('%d ', i); } printf(' '); for (int i = 0; i < SIZE; i++) { printf('%d ', i); for (int j = 0; j < SIZE; j++) { if (revealed[i][j] == 0) { printf('. '); } else if (mines[i][j] == 9) { printf('* '); } else { printf('%d ', mines[i][j]); } } printf(' '); }}
// 揭示指定位置的单元格void revealCell(int x, int y) { if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) { return; } if (revealed[x][y] == 1) { return; } revealed[x][y] = 1; if (mines[x][y] == 0) { // 如果周围没有雷,递归揭示周围的单元格 revealCell(x - 1, y - 1); revealCell(x - 1, y); revealCell(x - 1, y + 1); revealCell(x, y - 1); revealCell(x, y + 1); revealCell(x + 1, y - 1); revealCell(x + 1, y); revealCell(x + 1, y + 1); }}
// 主函数int main() { srand(time(NULL)); // 初始化随机数生成器 initGame(); // 初始化游戏 int x, y; int gameOver = 0; while (!gameOver) { printBoard(); // 打印游戏界面 printf('请输入要揭示的单元格坐标: '); scanf('%d %d', &x, &y); if (mines[x][y] == 9) { gameOver = 1; // 踩雷,游戏结束 } else { revealCell(x, y); } } printf('游戏结束!你踩到了雷。 '); printBoard(); return 0;}
代码讲解
-
包含头文件: -
stdio.h: 提供输入输出函数,如printf和scanf。 -stdlib.h: 提供内存分配函数rand和srand。 -time.h: 提供时间函数time,用于生成随机数种子。 -
定义常量: -
SIZE: 定义游戏区域的大小,这里设置为 10x10。 -MINE_COUNT: 定义雷的数量,这里设置为 10。 -
定义全局变量: -
mines: 一个二维数组,用于存储雷的位置。9 表示雷,其他数字表示周围雷的数量。 -revealed: 一个二维数组,用于存储哪些单元格已经被揭示。1 表示已揭示,0 表示未揭示。 -
initGame函数: - 初始化mines和revealed数组。 - 随机生成MINE_COUNT个雷,并将mines数组中对应位置设置为 9。 -
printBoard函数: - 打印游戏界面。 - 根据revealed和mines数组的值,打印每个单元格的状态: - '.' 表示未揭示的单元格。 - '*' 表示雷。 - 数字表示周围雷的数量。 -
revealCell函数: - 接收单元格的坐标作为参数。 - 如果单元格超出边界或已经揭示,则直接返回。 - 将单元格标记为已揭示。 - 如果单元格不是雷,则递归揭示周围 8 个单元格。 -
main函数: - 初始化随机数生成器。 - 调用initGame函数初始化游戏。 - 进入游戏循环: - 调用printBoard函数打印游戏界面。 - 提示用户输入要揭示的单元格坐标。 - 如果用户踩到雷,则游戏结束。 - 否则,调用revealCell函数揭示单元格。 - 游戏结束后,打印游戏结果。
改进方向
这只是一个非常简单的扫雷程序,你可以在此基础上进行扩展和改进:
- 添加计时器: 记录游戏时间,并显示在界面上。- 添加计分系统: 根据游戏时间和难度进行评分。- 添加标记功能: 允许用户标记疑似雷的单元格。- 改进游戏界面: 使用图形界面库 (如 SDL) 创建更美观的游戏界面。
希望这篇文章能帮助你入门 C 语言游戏开发!
原文地址: https://www.cveoy.top/t/topic/RDq 著作权归作者所有。请勿转载和采集!