网站建设翻译插件,石家庄住房城乡建设厅网站,阳江网络问政平台 周报,宝安中心客运站目录
1. 扫雷游戏分析和设计
1.1 扫雷游戏的功能说明
1.2 游戏的分析和设计
1.2.1 数据结构的分析
1.2.2 文件结构设计
2. 扫雷游戏的代码实现
3. 如何生成用户版本 4. 完整的排雷程序 1. 扫雷游戏分析和设计
1.1 扫雷游戏的功能说明 1#xff09;使用控制台实现经典…目录
1. 扫雷游戏分析和设计
1.1 扫雷游戏的功能说明
1.2 游戏的分析和设计
1.2.1 数据结构的分析
1.2.2 文件结构设计
2. 扫雷游戏的代码实现
3. 如何生成用户版本 4. 完整的排雷程序 1. 扫雷游戏分析和设计
1.1 扫雷游戏的功能说明 1使用控制台实现经典的扫雷游戏 2游戏可以通过菜单实现继续玩或者退出游戏 3扫雷的棋盘是9*9的格子 4默认随机布置10个雷 5可以排查雷 如果位置不是雷就显示周围几个雷 如果位置是雷就炸死游戏结束 把除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。如下如 对应的数组应该是
char mine[11][11] { 0 };//存放布置好的雷的信息数组全部初始化为 0
//char mine[11][11] {0};这只是初始化一个元素为字符0
char show[11][11] { 0 };//存放排查出雷的信息数组全部初始化为 *
1.2.2 文件结构设计
test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等
2. 扫雷游戏的代码实现
1首先创建在 VS 中好三个文件 test.c game.c game.h
2每个工程有且仅有一个 main 函数敲写 main 函数并且实现第一个功能游戏可以通过菜单实现继续玩或者退出游戏
test.c
int main()
{test();return 0;
} main 函数中可以调用函数简洁明了可以在 test 函数中实现大的框架功能打印菜单提示信息进行手动输入选择进入游戏还是退出游戏进入游戏游戏的执行可以再写另外一个函数来实现此功能。总结在实现一个大的功能时先把整体框架定好再去完成一个个的细节比如进行游戏的功能先把它确定好再去实现编写这个功能的函数。
test.c
void test()
{int input 0;//对调用随机函数的种子进行设定srand((unsigned int)time(NULL));do{menu();//打印菜单提示信息 printf(请选择:);scanf(%d, input);switch(input){case 1:game();break;case 0:printf(游戏结束退出游戏\n);break; default:printf(选择错误重新选择\n);break;}}while(input);
}
test.c
打印提示信息的菜单函数
void menu()
{printf(***********************\n);printf(*******1. play ********\n);printf(*******0. exit ********\n);printf(***********************\n);
}
test.c
实现扫雷游戏的函数
void game()
{//完成扫雷游戏char mine[ROWS][COLS] { 0 };//存放布置好的雷的信息数组全部初始化为 0//char mine[ROWS][COLS] {0};这只是初始化一个元素为字符0char show[ROWS][COLS] { 0 };//存放排查出雷的信息数组全部初始化为 *//初始化棋盘InitBoard(mine, ROWS, COLS, 0);InitBoard(show, ROWS, COLS, *);//布置雷 就是在9*9的棋盘上随机布置 10 个雷SetMine(mine, ROW, COL);/*DisplayBoard(mine, ROW, COL);*///打印棋盘/*DisplayBoard(mine, ROW, COL);*/DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}
对扫雷游戏 game() 函数进行分析 首先对存放布置好雷的信息的数组 mine 和 存放排查出雷的信息的数组 show进行初始化
char mine[ROWS][COLS] { 0 };//存放布置好的雷的信息数组全部初始化为 0
//char mine[ROWS][COLS] {0};这只是初始化一个元素为字符0
char show[ROWS][COLS] { 0 };//存放排查出雷的信息数组全部初始化为 * 然后对棋盘进行初始化赋值就是填充字符 ‘0’ 和 ‘*’ 对 mine 数组赋值字符 ‘0’对 show 数组赋值字符 *建立一个函数传参进去有数组数组的大小还有对每个元素赋什么值这样一个函数其实说白了就是对二维数组进行赋值 //初始化棋盘InitBoard(mine, ROWS, COLS, 0);InitBoard(show, ROWS, COLS, *);
game.c
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set)
{int i 0;for (i 0; i rows; i){int j 0;for (j 0; j cols; j){arr[i][j] set;}}
} 赋值结束后想看下是否赋值的对不对写个遍历二维数组的程序进行打印也是传入要遍历的数组以及要遍历的数组的大小只需要遍历我们需要显示的棋盘不需要遍历棋盘我们故意做大一圈的棋盘所以就是传入的是 row 和 col
game.c
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{int i 0;//打印列号printf(-------扫雷游戏-------\n);for (i 0; i col; i){printf(%2d , i);//%2d 输出两个宽度的整数且默认是右对齐//printf(%-2d , i);左对齐}printf(\n);for (i 1; i row; i){int j 0;printf(%2d , i);for (j 1; j col; j){printf(%2c , arr[i][j]);}printf(\n);}
} 初始化完成后就是进行布雷布雷肯定要用到随机值在 ROW 行 COL 列里进行随机摆放字符 ‘1’ 仍然是传入需要布雷的数组以及数组的大小在该大小的二维数组中该函数中通过宏定义的布雷个数赋值给局部变量 count 然后通过 rand 函数 产生随机值随机在数组的位置上进行赋值布雷 rand() % 9,模上一个9余数是0-8模上一个10余数是0-9布置雷后想查看的话可以再 调用 DisplayBoard(show, ROW, COL) 进行查看。
game.c
void SetMine(char arr[ROWS][COLS], int row, int col)
{int count EASY_COUNT;//布雷的个数while (count){int x rand() % row 1;// rand() % 9,模上一个9余数是0-8模上一个10余数是0-9int y rand() % col 1;if (arr[x][y] 0){arr[x][y] 1;count--;}}
}
布置好雷后就可以进行排查雷排查雷需要传入 布置好雷的信息的数组传入 排查出雷的信息的数组以及需要排查的范围大小首先进入排雷可以先判断你输入的坐标是否是雷也就是判断数组中的元素是否是字符 ‘1’如果是则直接宣布你被炸死并且跳出循环如果不是那就要统计该坐标周围有几个雷 ‘1’统计完成后把这个数值赋值给 排查出雷的信息的数组show然后重新显示 排查出雷的信息的数组 show
代码就是有时候需要从外到里写比如定框架的时候就是先写外边大的框架再写细节处而这里就是从里往外写比如判断完你输入的坐标是否是雷后外层可以再次判断你输入的坐标是否已经被排查过了在此之外还可以判断你输入的坐标是否是有效的还可以再循环上进行判断你可以排查多少次进行一个循环。
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;while(win row*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 GetMineCount(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(show, ROW, COL);}
}
3. 如何生成用户版本 这里点击平时程序员用的是 Debug 版本调试版本
Release用户使用版本修改为 Release 后编译以下可以在该工程目录下的文件夹下找到后缀 .exe 文件可以把这个发给用户用户双击就可以运行。 4. 完整的排雷程序
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include game.hvoid menu()
{printf(***********************\n);printf(*******1. play ********\n);printf(*******0. exit ********\n);printf(***********************\n);
}void game()
{//完成扫雷游戏char mine[ROWS][COLS] { 0 };//存放布置好的雷的信息数组全部初始化为 0//char mine[ROWS][COLS] {0};这只是初始化一个元素为字符0char show[ROWS][COLS] { 0 };//存放排查出雷的信息数组全部初始化为 *//初始化棋盘InitBoard(mine, ROWS, COLS, 0);InitBoard(show, ROWS, COLS, *);//布置雷 就是在9*9的棋盘上随机布置 10 个雷SetMine(mine, ROW, COL);/*DisplayBoard(mine, ROW, COL);*///打印棋盘/*DisplayBoard(mine, ROW, COL);*/DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}
void test()
{int input 0;srand((unsigned int)time(NULL));do{menu();printf(请选择:);scanf(%d, input);//1 0 xswitch (input){case 1:game();break;case 0:printf(游戏结束退出游戏\n);break;default:printf(选择错误重新选择\n);break;}} while (input);
}int main()
{test();return 0;
}
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 arr[ROWS][COLS], int row, int col);//排查雷
void FindMine(char arr[ROWS][COLS],char show[ROWS][COLS], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
#include game.hvoid InitBoard(char arr[ROWS][COLS], int rows, int cols,char set)
{int i 0;for (i 0; i rows; i){int j 0;for (j 0; j cols; j){arr[i][j] set;}}
}void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{int i 0;//打印列号printf(-------扫雷游戏-------\n);for (i 0; i col; i){printf(%2d , i);//%2d 输出两个宽度的整数且默认是右对齐//printf(%-2d , i);左对齐}printf(\n);for (i 1; i row; i){int j 0;printf(%2d , i);for (j 1; j col; j){printf(%2c , arr[i][j]);}printf(\n);}
}void SetMine(char arr[ROWS][COLS], int row, int col)
{int count EASY_COUNT;//布雷的个数while (count){int x rand() % row 1;// rand() % 9,模上一个9余数是0-8模上一个10余数是0-9int y rand() % col 1;if (arr[x][y] 0){arr[x][y] 1;count--;}}
}
//这个函数只是用来为 FindMine 函数做服务的所有没必要把它暴露在头文件中而且不想让别人看到可以放在这里再加上static
static int GetMineCount(char mine[ROWS][COLS],int x,int y)
{return mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y - 1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y 1] - 8 * 0;
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;while(win row*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 GetMineCount(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(show, ROW, COL);}
}