C语言数组实现扫雷
C语言数组->实现扫雷
-
包含头文件
#include <stdio.h> #include <stdlib.h> //用于生成随机数 #include <time.h> //用于产生随机种子 -
创建数组
int board[11][11]; //存放随机生成的“雷区” int boardu[11][11]; //与用户交互的“雷盘” - 需要创建两个数组,一个用于存放随机生成的“雷区”,一个用于与用户交互的“雷盘”
- 如果后期有兴趣丰富游戏内容(比如不同难度等),可以使用宏定义常量定义数组,这里只讲数组
- 这里设计的是9×9的雷盘,创建的是11×11的数组是为了 后面计算每个位置周围的雷数时,不产生越界访问
这里简单举个栗子:
如果我们要计算1×1这个位置周围的总雷数,难免会产生越界访问
我们可以给数组加上一圈
这样就很好的避免了越界访问
- 游戏框架设计(主程序框架、游戏进程框架)
//游戏进程框架函数 void game() { srand((unsigned)time(NULL)); //产生随机种子,用于后面随机数的生成 initBoard(); //初始化“雷区”、“雷盘” do { printBoard(); //打印“雷盘” int temp = 0; while (1) { int x = 0, y = 0; printf("Please enter coordinate->"); scanf("%d %d", &x, &y); if (x > 0 && x < 10 && y > 0 && y < 10) { temp = sweeping(x, y); //排雷内部,变量接收返回值 break; } else printf("Input error!Please enter again!->"); } if (temp == -1) //如果用户“踩雷”,则退出循环 { printBoard(); printf("You DIE!!\n"); break; } } while (1); } //主程序框架函数 int main() { do { int i = 0; printf("1.Start the game!\n"); printf("2.Quit the game!\n"); printf("Please enter your choose->\n"); scanf("%d", &i); switch (i) { case 1: game(); break; case 2: return 0; break; default: printf("Input error!Please enter again!->\n"); break; } } while(1); }
- 初始化
void initBoard() { int i = 0, j = 0; for (i = 0; i < 11; i++) { for (j = 0; j < 11; j++) { board[i][j] = 0; //0代表 无雷 boardu[i][j] = -2; //-2代表用户未“开拓" } } int temp = 0; while (1) { //随机生成 10 个雷,存放至“雷区” int x = rand() % 8 + 1; int y = rand() % 8 + 1; if (board[x][y] == 0) { board[x][y] = -1; temp++; } if (temp == 10) break; } for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { //计算每个 无雷的位置 周围(9个格子) 雷的数量,并存放至“雷区” if (board[i][j] == -1) continue; int x = 0, y = 0,value = 0; for (x = 0; x < 3 ; x++) { for (y = 0; y < 3; y++) { if (board[i - 1 + x][j - 1 + y] == -1) value++; } } board[i][j] = value; } } }
- 打印“雷盘”
是时候展现真正的 艺术 了!这里简单打印一下,有兴趣的 帖子 可以升级一下
void printBoard() { int i = 0, j = 0; printf("# 1 2 3 4 5 6 7 8 9 #\n"); //让用户能清晰对应坐标 for (i = 1; i < 10; i++) { printf("%d", i); for (j = 1; j < 10; j++) { if (boardu[i][j] == -2) //如果“雷盘”中数值为初始值-2,说明用户还未“开采”此处,则打印 * printf(" %c", '*'); else if (boardu[i][j] == -1) //如果“雷盘”中数值变成了-1,说明用户“开采”了此处,且此处是雷,则用 $ 表示 printf(" %c", '$'); else if (boardu[i][j] == 0) //如果“类盘”中数值变为0;也说明用户“开采”了此处,且此处无雷,用 空格 表示 printf(" %c", ' '); else //此处打印用户开采出来的 周围雷的信息 printf(" %d", boardu[i][j]); } printf(" #\n"); } printf("# # # # # # # # # # #\n"); }
- 游戏核心(怎样扫雷)
int sweeping(int x,int y) //传入用户输入的坐标 { int i = 0, j = 0; if (board[x][y] == -1) //判断是不是“踩雷”了 { for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { if (board[i][j] == -1) //如果“踩雷”了,将剩余所有的雷先显示出来 boardu[i][j] = -1; } } return -1; //返回个-1,用来结束本局游戏 } else //如果没踩雷,那就把周围 隐藏 的 信息 显示出来 { for (i = x - 1; i < x + 2; i++) { for (j = y - 1; j < y + 2; j++) { if (board[i][j] != -1) boardu[i][j] = board[i][j]; } } return 0; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】