news 2026/5/1 11:26:23

C语言 扫雷

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言 扫雷

实现扫雷游戏的基本思路

使用C语言实现扫雷游戏需要结合二维数组、随机数生成、递归算法等核心概念。游戏的核心逻辑包括初始化雷区、埋雷、计算周围雷数、玩家交互以及胜负判断。

初始化游戏棋盘

定义两个二维数组,一个用于存储实际雷区(mine),另一个用于显示给玩家(show)。雷区通常用字符'1'表示雷,'0'表示安全;显示棋盘用'*'表示未探索区域。

#define ROW 9 #define COL 9 #define MINES 10 char mine[ROW][COL]; // 实际雷区 char show[ROW][COL]; // 显示给玩家的棋盘 // 初始化棋盘 void InitBoard(char board[ROW][COL], char set) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = set; } } }

随机埋雷

使用rand()函数在雷区随机生成雷的位置,需确保同一位置不重复埋雷。

#include <stdlib.h> #include <time.h> void SetMines(char mine[ROW][COL]) { srand((unsigned int)time(NULL)); int count = MINES; while (count > 0) { int x = rand() % ROW; int y = rand() % COL; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }

计算周围雷数

遍历每个非雷格子,统计其周围8个格子中的雷数,并将结果存入显示棋盘。

int GetMineCount(char mine[ROW][COL], int x, int y) { int count = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { int nx = x + i, ny = y + j; if (nx >= 0 && nx < ROW && ny >= 0 && ny < COL && mine[nx][ny] == '1') { count++; } } } return count; }

递归展开空白区域

当玩家点击一个周围无雷的格子时,递归展开所有相邻的空白区域,直到遇到数字边界。

void Expand(char mine[ROW][COL], char show[ROW][COL], int x, int y) { if (x < 0 || x >= ROW || y < 0 || y >= COL || show[x][y] != '*') { return; } int count = GetMineCount(mine, x, y); if (count > 0) { show[x][y] = count + '0'; } else { show[x][y] = ' '; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { Expand(mine, show, x + i, y + j); } } } }

玩家交互与胜负判断

通过循环接收玩家输入坐标,判断是否踩雷或胜利。胜利条件是所有非雷格子均被揭开。

void PlayGame() { int x, y; while (1) { printf("请输入坐标(例如:3 4):"); scanf("%d %d", &x, &y); if (mine[x][y] == '1') { printf("游戏结束!你踩到雷了!\n"); break; } Expand(mine, show, x, y); DisplayBoard(show); if (CheckWin(show)) { printf("恭喜你,扫雷成功!\n"); break; } } } int CheckWin(char show[ROW][COL]) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (show[i][j] == '*' && mine[i][j] == '0') { return 0; } } } return 1; }

完整代码结构

  1. 头文件声明:包含必要的库和函数声明。
  2. 主函数:调用初始化、埋雷和游戏循环。
  3. 辅助函数:如打印棋盘、检查胜利条件等。
#include <stdio.h> #include <stdlib.h> #include <time.h> // 函数声明 void InitBoard(char board[ROW][COL], char set); void SetMines(char mine[ROW][COL]); void DisplayBoard(char board[ROW][COL]); void PlayGame(); int main() { InitBoard(mine, '0'); InitBoard(show, '*'); SetMines(mine); DisplayBoard(show); PlayGame(); return 0; }

扩展功能建议

  • 难度调整:通过宏定义修改ROWCOLMINES的值实现不同难度。
  • 标记功能:允许玩家标记疑似雷的位置(如用'F'表示旗子)。
  • 计时系统:记录玩家完成游戏的时间。

通过以上步骤,可以实现一个基础的命令行扫雷游戏。如需图形界面,可结合EasyX等库进一步开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 14:27:55

客户需求访谈提纲:LobeChat准备专业问题

LobeChat 技术深度解析&#xff1a;构建企业级 AI 助手的现代前端基座 在大语言模型能力日益强大的今天&#xff0c;一个常被忽视的事实是&#xff1a;最前沿的模型本身并不等于可用的产品。很多团队花重金部署了 Llama、Qwen 或 GPT 系列模型后&#xff0c;却发现员工依然不愿…

作者头像 李华
网站建设 2026/5/1 8:12:08

Cockpit及同类服务器管理工具全解析

在服务器管理领域&#xff0c;命令行曾是运维人员的主要操作载体&#xff0c;但随着技术的迭代和运维场景的复杂化&#xff0c;可视化管理工具逐渐成为提升效率的关键。这类工具通过图形化界面&#xff08;GUI&#xff09;将复杂的命令行操作转化为直观的点击操作&#xff0c;降…

作者头像 李华
网站建设 2026/5/1 8:11:35

mysql批量插入数据如何更快

背景&#xff1a; 有个需求&#xff0c;需要向数据库插入300万数据&#xff0c;测试一个性能这里使用存储过程来循环插入 先看第一次的插入&#xff0c;非常慢&#xff0c;十分钟只写入十几万条 delimiter $$ create procedure auto_insert1() BEGINdeclare i int default 1;wh…

作者头像 李华
网站建设 2026/5/1 10:27:07

提高交流沟通能力,看这六本书就行了

市面上教你如何与人沟通交流的书有很多&#xff0c;但真正值得推荐的寥寥无几。 沟通不只是简单的说话艺术&#xff0c;而是由多种能力组合而成的一种综合素质&#xff0c;并且受情境的影响也很大。 本文推荐六本经典沟通书籍&#xff0c;涉及商务、谈判、亲密关系等类别&…

作者头像 李华
网站建设 2026/5/1 8:27:08

如何管理好自己的时间?我推荐你看这10本书

时间都去哪了&#xff1f;谁偷走了我们的时间&#xff1f;有太多人都在感叹时间不够用&#xff0c;根本原因还是缺乏对时间的有效管理。那么到底该如何做好时间管理呢&#xff1f;本文推荐10本时间管理经典必读书籍&#xff0c;帮你找回时间&#xff0c;重新做回时间的主人。一…

作者头像 李华
网站建设 2026/5/1 10:28:02

EmotiVoice在车载语音系统中的适配性研究

EmotiVoice在车载语音系统中的适配性研究在智能座舱的演进浪潮中&#xff0c;一个看似细微却至关重要的问题正被越来越多车企关注&#xff1a;为什么我们的语音助手听起来还是那么“不像人”&#xff1f; 尽管今天的车载系统早已能精准识别“打开空调”或“导航到最近加油站”&…

作者头像 李华