腾讯网站开发语言哈尔滨建工建设集团

当前位置: 首页 > news >正文

腾讯网站开发语言,哈尔滨建工建设集团,抓取wordpress站点用户,网站搭建服务器需要多少钱目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷#xff0c;就显示周围有几个雷 如果… 目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是99的格子默认随机布置10个雷可以排查雷 如果位置不是雷就显示周围有几个雷 如果位置是雷就炸死游戏结束 把除10个雷之外的所有⾮雷都找出来排雷成功游戏结束。 游戏的界面 初始界面 排雷界面 排雷失败界面 1.2 游戏的分析和设计 1.2.1 数据结构的分析 扫雷的过程中布置的雷和排查出的雷的信息都需要存储所以我们需要⼀定的数据结构来存储这些信息。 因为我们需要在9 9的棋盘上布置雷的信息和排查雷我们首先想到的就是创建⼀个9*9的数组来存放信息。
那如果这个位置布置雷我们就存放1没有布置雷就存放0。
假设我们排查(2,5)这个坐标时我们访问周围的⼀圈8个黄色位置统计周围雷的个数是1。 假设我们排查(8,6)这个坐标时我们访问周围的⼀圈8个黄色位置统计周围雷的个数时最下面的三个坐标就会越界为了防止越界我们在设计的时候给数组扩大一圈雷还是布置在中间的9*9的坐标上周围⼀圈不去布置雷就行这样就解决了越界的问题。所以我们将存放数据的数组创建成11 11是比较合适。 排雷的假设
周围加上⼀圈的棋盘
再继续分析我们在棋盘上布置了雷棋盘上雷的信息1和非雷的信息0假设我们排查了某⼀个位置后这个坐标处不是雷这个坐标的周围有1个雷那我们需要将排查出的雷的数量信息记录存储并打印出来作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢如果存放在布置雷的数组中这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。 这里我们肯定有办法解决比如雷和非雷的信息不要使用数字使用某些字符就行这样就避免冲突了但是这样做棋盘上有雷和非雷的信息还有排查出的雷的个数信息就比较混杂不够方便。 这里我们采用另外⼀种方案我们专门给⼀个棋盘对应⼀个数组mine存放布置好的雷的信息再给另外⼀个棋盘对应另外⼀个数组show存放排查出的雷的信息。这样就互不干扰了把雷布置到mine数组在mine数组中排查雷排查出的数据存放在show数组并且打印show数组的信息给后期排查参考。 同时为了保持神秘show数组开始时初始化为符’
‘为了保持两个数组的类型⼀致可以使用同⼀套函数处理mine数组最开始也初始化为字符’0’布置雷成’1’。如下如 mine数组布置雷后的状态
show输出初始化的状态
对应的数组应该是 char mine[11][11] {0};//⽤来存放布置好的雷的信息 char show[11][11] {0};//⽤来存放排查出的雷的个数信息1.2.2 文件结构设计 使用多文件的形式对函数的声明和定义我们设计三个文件 1.test.c //文件中写游戏的测试逻辑 2. game.c //文件中写游戏中函数的实现等 3. game.h //文件中写游戏需要的数据类型和函数声明等 2.扫雷游戏的代码实现 game.h #pragma once#include stdio.h #include stdlib.h #include time.h#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2//雷的数量 #define EASY_COUNT 10//初始化棋盘 void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);//打印棋盘 void DisplayBoard(char arr[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); game.c #define _CRT_SECURE_NO_WARNINGS #include game.hvoid InitBoard(char arr[ROWS][COLS], int rows, int cols,char set) {for (int i 0; i ROWS; i){for (int j 0; j COLS; j){arr[i][j] set;}} }void DisplayBoard(char arr[ROWS][COLS], int row, int col) {printf(——扫雷游戏——\n);//打印行号for (int i 0; i col; i){printf(%d , i);}printf(\n);for (int i 1; i row; i){//打印列号printf(%d , i);for (int j 1; j col; j){printf(%c , arr[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–;}} }int FindMineCount(char mine[ROWS][COLS], int x, int y) {int count 0;for (int i x - 1;i x 1; i){for (int j y - 1; j y 1; j){count (mine[i][j] - 0);//(易错点)}}return count; }void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {int x 0;int y 0;int win 0;while (winrow*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);break;}else{//不是雷就要统计周围的雷的个数int count FindMineCount(mine, x, y);show[x][y] count 0; //(易错点)DisplayBoard(show, ROW, COL);win;}}else{printf(该坐标已经被排查请重新输入。\n);}}else{printf(坐标非法请重新输入。\n);}}if (win row * col - EASY_COUNT) //(易错点){printf(恭喜你扫雷成功!\n);DisplayBoard(mine, ROW, COL);} } test.c #define _CRT_SECURE_NO_WARNINGS #include game.hvoid menu() {printf(***************\n);printf(** 1.play *\n);printf(** 0.exit *\n);printf(**************\n); }void game() {//建立棋盘//布置雷的信息的棋盘char mine[ROWS][COLS] { 0 };//显示雷的个数的棋盘char show[ROWS][COLS] { 0 };//初始化棋盘//mine棋盘初始化为‘0’InitBoard(mine, ROWS, COLS,0);//show棋盘初始化为‘’InitBoard(show, ROWS, COLS,*);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//打印棋盘DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}void test() {srand((unsigned int)time(NULL));int input 0;do{menu();printf(请选择:);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏!\n);break;default:printf(选择错误请重新选择。\n);break;}} while (input); }int main() {test();return 0; }