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

网站建设服务提供商宁波公司有哪些

网站建设服务提供商,宁波公司有哪些,商标设计网免费,优书网所有书单✨个人主页#xff1a; 熬夜学编程的小林 #x1f497;系列专栏#xff1a; 【C语言详解】 【数据结构详解】 扫雷 1、扫雷游戏分析和设计 1.1、扫雷游戏的功能说明 1.2 游戏的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、扫雷游戏的结构分析 2.1、用… ✨个人主页 熬夜学编程的小林 系列专栏 【C语言详解】 【数据结构详解】 扫雷 1、扫雷游戏分析和设计 1.1、扫雷游戏的功能说明 1.2 游戏的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、扫雷游戏的结构分析 2.1、用户选择 2.2、初始化棋盘 2.3、设置雷 2.4、排雷 3、扫雷游戏分文件的代码实现 3.1、test.c 3.2、game.c 3.3、game.h 4、扫雷游戏的扩展 总结 1、扫雷游戏分析和设计 1.1、扫雷游戏的功能说明 • 使用控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格子 • 默认随机布置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。如下如 对应的数组应该是 char mine[11][11] {0};//用来存放布置好的雷的信息 char show[11][11] {0};//用来存放排查出的雷的个数信息 1.2.2、文件结构设计 之前学习了多文件的形式对函数的声明和定义这里我们实践⼀下我们设计三个⽂件 test.c //文 件中写游戏的测试逻辑 game.c //文 件中写游戏中函数的实现等 game.h //文 件中写游戏需 要的数据类型和函数声明等 建议写一些代码就测试一些代码。 2、扫雷游戏的结构分析 2.1、用户选择 首先用户选择需要的功能输入1则进入游戏输入0则退出游戏输入其他值则重新输入。 从这可以知道此处为一个循环而且一定会进入一次符号do while的特性因此使用do while循环但是此处需要打印一个选项的界面因此可以使用创建一个菜单。 #includestdio.h //菜单 void menu() {printf(******************************\n);printf(********* 1.play *********\n);printf(********* 0.exit *********\n);printf(******************************\n); } int main() {int input 0;do{menu();printf(请选择:\n);scanf(%d, input);switch (input){case 1://游戏实现break;case 0:printf(游戏结束\n);break;default:printf(选择错误请重新输入\n);break;}} while (input);//为假则退出循环即输入0退出循环游戏结束return 0; } 2.2、初始化棋盘 根据前面的分析创建一个能够对两个棋盘初始化的函数。参数有该数组数组行号列号还有初始化的值(这样才能保证一个函数能够初始化两个棋盘)一个初始化为0一个初始化为*均为字符。为了测试我们需要将棋盘打印出来此处需要创建一个打印棋盘的函数。参数有数组行号列号。 //初始化棋盘 void BoardInit(char board[ROWS][COLS], int rows, int cols, char set) {int i 0;int j 0;for (i 0; i rows; i){for (j 0; j cols; j){board[i][j] set;//棋盘初始为set字符}} } //打印棋盘 void BoardPrint(char board[ROWS][COLS], int row, int col) {int i 0;int j 0;for (i 1; i row; i){for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);} } int main() {char mine[ROWS][COLS];//雷棋盘char show[ROWS][COLS];//展示棋盘//初始化雷棋盘BoardInit(mine, ROWS, COLS, 0);//初始化展示棋盘BoardInit(show, ROWS, COLS, *);//打印雷棋盘BoardPrint(mine, ROW, COL);//打印展示棋盘BoardPrint(show, ROW, COL);return 0; } 优化之后 #includestdio.h #define ROW 9 //原棋盘大小 #define COL 9#define ROWS ROW2 //将原棋盘周围加一圈即行列2 #define COLS COL2 void BoardInit(char board[ROWS][COLS], int rows, int cols, char set) {int i 0;int j 0;for (i 0; i rows; i){for (j 0; j cols; j){board[i][j] set;//棋盘初始为set字符}} } //打印棋盘 void BoardPrint(char board[ROWS][COLS], int row, int col) {int i 0;int j 0;printf(------------扫雷游戏-------------\n);for (i 0; i row; i){printf(%d , i);}printf(\n);for (i 1; i row; i){printf(%d , i);for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}printf(------------扫雷游戏-------------\n); } int main() {char mine[ROWS][COLS];//雷棋盘char show[ROWS][COLS];//展示棋盘//初始化雷棋盘BoardInit(mine, ROWS, COLS, 0);//初始化展示棋盘BoardInit(show, ROWS, COLS, *);//打印雷棋盘BoardPrint(mine, ROW, COL);//打印展示棋盘BoardPrint(show, ROW, COL);return 0; } 2.3、设置雷 按照前面要求我们需要随机设置10个雷那就需要用到随机数C语言中有一个函数可以生成随机数rand()但是这个随机数不是真正的随机数(每次程序运行的数是一样的)因此需要用到一个时间函数才能做到真正的是随机数。即srand((unsigned int)time(NULL));随机数函数的头文件为#includestdlib.h时间函数的头文件为#includetime.h。 //设置雷 void MineSet(char board[ROWS][COLS], int row, int col) {int count MINE_COUNT;//#define定义为10个雷while (count){int x rand() % row 1;//生成随机数 rand()%row 区间为0-8 x区间为1-9int y rand() % col 1;//判断是否重复 没有重复则添加雷 即等于0则放入雷 1if (board[x][y] 0){board[x][y] 1;count--;//随机数创建成功则count--}} } int main() {srand((unsigned int)time(NULL));char mine[ROWS][COLS];//雷棋盘char show[ROWS][COLS];//展示棋盘//初始化雷棋盘BoardInit(mine, ROWS, COLS, 0);//初始化展示棋盘BoardInit(show, ROWS, COLS, *);//设置雷MineSet(mine, ROW, COL);//打印雷棋盘BoardPrint(mine, ROW, COL);return 0; } 打印和初始化棋盘的函数在前面有此处就没有放上去了。 此处是在测试所以才需要打印存放雷的棋盘真实游戏场景是不需要打印的。 2.4、排雷 排雷有三种情况 1、如果是雷则结束 2、如果胜利则结束 3、不是雷且没有胜利则继续 根据扫雷游戏的界面我们如果没有找到雷则需要继续排雷因此可知此处需要使用循环实现。 排雷需要先输入坐标然后判断是什么情况如果坐标非法则重新输入符合棋盘范围则判断为上述三种情况的哪种如果不是雷且没有胜利则在展示棋盘中输出周围雷的个数再继续输入坐标继续排雷如果是雷输出游戏结束和打印存放雷的棋盘并退出循环如果坐标重复了做一个提示并重新输入坐标如果胜利则结束。 如何计算不是雷的坐标周围有几个雷呢 此处可以创建一个计算几个雷的函数返回int类型因为此处用的是字符数组所以将该坐标周围的8个位置的值加起来就是用字符表示个数但是我们需要返回整数所以需要减去8*0这样得到的结果就是整数的个数。 如何在展示棋盘打印该位置周围雷的个数呢 在初始化棋盘时我们的类型为字符类型因此打印时也需要为字符类型在上面我们通过函数计算了雷的个数要将整型数字改成字符数字只需加字符0即可。 如何判断胜利呢 首先我们知道棋盘总共有行*列个雷的个数在此处为10个如果雷的个数加判断不是雷的个数之和等于棋盘个数说明胜利。因此我们可以在不是雷且没有胜利的情况下创建一个变量计算不是雷的个数只要进入此条件则1。 //计算雷个数 int COUNT_MINE_OF(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 MineFind(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {//判断结束情况//1.如果是雷则结束//2.如果胜利则结束//3.不是雷且没有胜利则继续int x 0;int y 0;int win 0;//判断不是雷的次数//1.先输入一个选择//如果符合条件则判断雷 不符合则循环while (winrow*col-MINE_COUNT)//如果棋盘-雷小于则进行判断游戏是否结束{printf(请输入你的坐标\n);scanf(%d %d, x, y);if (x 1 x row y 1 y col){//被排查情况if (show[x][y] ! *){printf(该坐标被排查过请重重新输入坐标\n);}//区间正确 开始判断 开始找是否是雷 //如果是雷 则游戏结束else if (mine[x][y] 1){printf(游戏结束\n);BoardPrint(mine, ROW, COL);break;}//不是雷 判断周围有几个雷else{win;//不是雷的个数1int ret COUNT_MINE_OF(mine, x, y);//计算该坐标周围雷的个数show[x][y] ret 0;//将字符数字赋值给展示棋盘BoardPrint(show, ROW, COL);//打印展示棋盘}}else{//棋盘区间不正确则重新输入printf(输入错误请重新输入\n);}}//雷的个数不是雷的个数棋盘个数 则胜利if (win row * col - MINE_COUNT){printf(恭喜你胜利了\n);BoardPrint(mine, ROW, COL);} } 如何测试赢的情况呢 此处雷的个数为10个不是雷的个数为71个是不是要输入71次才能测试赢呢此处博主的办法是直接把雷的个数改为80个那么只有1个不是雷我们将存储雷的棋盘打印出来输入不是雷的下标如果输出胜利则程序没有问题。 注该游戏的棋盘大小和雷的个数都是通过#define定义#define可以定义常数此处这么定义的意义是如果需要改变棋盘大小或者雷个个数只需要该#define的那一处就行提高代码可读性和便捷性。 3、扫雷游戏分文件的代码实现 test.c //文 件中写游戏的测试逻辑 game.c //文 件中写游戏中函数的实现等 game.h //文 件中写游戏需 要的数据类型和函数声明等 3.1、test.c test.c代码 #define _CRT_SECURE_NO_WARNINGS #include game.h void menu() {printf(******************************\n);printf(********* 1.play *********\n);printf(********* 0.exit *********\n);printf(******************************\n); } void game() {//定义两个棋盘 一个表示雷状态 一个表示结果 9*9//最后需要判断周围8个元素的状态 但是可能会有越界情况//所以创建比原本大2的数组 遍历从1-大小char mine[ROWS][COLS];//雷棋盘char show[ROWS][COLS];//展示棋盘//初始化棋盘BoardInit(mine, ROWS, COLS,0);BoardInit(show, ROWS, COLS,*);//打印展示棋盘BoardPrint(show, ROW, COL);//设置雷MineSet(mine, ROW, COL);//排雷MineFind(mine, show, ROW, COL); } int main() {srand((unsigned int)time(NULL));int input 0;do{menu();printf(请选择:\n);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(游戏结束\n);break;default:printf(选择错误请重新输入\n);break;}} while (input);return 0; } 3.2、game.c game.c代码 #define _CRT_SECURE_NO_WARNINGS #pragma once #include game.h //初始化棋盘 void BoardInit(char board[ROWS][COLS], int rows, int cols,char set) {int i 0;int j 0;for (i 0; i rows; i){for (j 0; j cols; j){board[i][j] set;}} } //打印棋盘 void BoardPrint(char board[ROWS][COLS], int row, int col) {int i 0;int j 0;printf(------------扫雷游戏-------------\n);for (i 0; i row; i){printf(%d , i);}printf(\n);for (i 1; i row; i){printf(%d , i);for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}printf(------------扫雷游戏-------------\n); }//设置雷 void MineSet(char board[ROWS][COLS], int row, int col) {int count MINE_COUNT;while (count){int x rand() % row 1;int y rand() % col 1;//判断是否重复 被等于0则放入雷 1if (board[x][y] 0){board[x][y] 1;count--;}} } //计算雷个数 int COUNT_MINE_OF(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 MineFind(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {//判断结束情况//1.如果是雷则结束//2.如果胜利则结束//3.不是雷且没有胜利则继续int x 0;int y 0;int win 0;//判断不是雷的次数//1.先输入一个选择//如果符合条件则判断雷 不符合则循环while (winrow*col-MINE_COUNT)//如果棋盘-雷小于则进行判断游戏是否结束{printf(请输入你的坐标\n);scanf(%d %d, x, y);if (x 1 x row y 1 y col){//被排查情况if (show[x][y] ! *){printf(该坐标被排查过请重重新输入坐标\n);}//区间正确 开始判断 开始找是否是雷 //如果是雷 则游戏结束else if (mine[x][y] 1){printf(游戏结束\n);BoardPrint(mine, ROW, COL);break;}//不是雷 判断周围有几个雷else{win;//不是雷的个数1int ret COUNT_MINE_OF(mine, x, y);//计算该坐标周围雷的个数show[x][y] ret 0;//将字符数字赋值给展示棋盘BoardPrint(show, ROW, COL);//打印展示棋盘}}else{//棋盘区间不正确则重新输入printf(输入错误请重新输入\n);}}//雷的个数不是雷的个数棋盘个数 则胜利if (win row * col - MINE_COUNT){printf(恭喜你胜利了\n);BoardPrint(mine, ROW, COL);} } 3.3、game.h game.h代码 #define _CRT_SECURE_NO_WARNINGS #includestdio.h #includestdlib.h #includetime.h #define ROW 9 //原棋盘大小 #define COL 9#define ROWS ROW2 //将原棋盘周围加一圈即行列2 #define COLS COL2#define MINE_COUNT 10//初始化棋盘 void BoardInit(char board[ROWS][COLS],int rows,int cols,char set); //打印棋盘 void BoardPrint(char board[ROWS][COLS], int row, int col); //设置雷 void MineSet(char board[ROWS][COLS], int row, int col); //排雷 void MineFind(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col); //计算雷个数 int COUNT_MINE_OF(char mine[ROWS][COLS],int x,int y); 4、扫雷游戏的扩展 • 是否可以选择游戏难度 ◦ 简单 9*9 棋盘10个雷 ◦ 中等 16*16棋盘40个雷 ◦ 困难 30*16棋盘99个雷 • 如果排查位置不是雷周围也没有雷可以展开周围的⼀⽚ • 是否可以标记雷 • 是否可以加上排雷的时间显示 在线扫雷游戏http://www.minesweeper.cn/ 总结 本篇博客就结束啦谢谢大家的观看如果公主少年们有好的建议可以留言喔谢谢大家啦
http://www.pierceye.com/news/314262/

相关文章:

  • 经典网站建设邢台网站建设策划
  • 系统数据库与建设网站网站提交入口大全
  • 网站做数据分析的意义西安网站建设kxccc
  • 免费建个人网站alexa排名搜索
  • 做的网站第二年续费多钱店铺装修模板
  • 这么自己建设网站中卫网站设计厂家
  • 公司网站制作哪家公司好广州建设执业资格注册中心网站
  • 北京所有做招聘类网站建站公司Apache Wordpress伪静态处理
  • 大兴做网站公司制作网页可以用什么软件
  • 该怎么给做网站的提页面需求网上购物平台怎么建立
  • 用pw后缀的网站阳江网络问政平台首页
  • 建站网站建设哪个好网页设计个人总结
  • 网站开发时间进度表宁波网站建设使用技巧分享
  • wordpress官网案例移动端优化
  • 广告投放网宁波seo网络推广报价
  • 网站模板 哪个好烟台高端网站建设公司
  • 福建网站开发手机软件app下载
  • 网站开发的功能需求怎么写网页版式设计分析
  • 荔浦网站开发乐陵新闻最新消息今天
  • 盘锦网站建设服务如何上传网站到空间
  • 怎样建设自己网站常德seo招聘
  • 用别人家网站做跳转做商品抬价是什么兼职网站
  • 合肥市建设信息中心网站怎么做网站的签约编辑
  • 6入空间网站免费观看网站标题怎么修改
  • iis服务器的默认网站wordpress多级分销插件
  • jquery 网站后台模板 仿2021好心人给个开车的网站
  • 济宁定制网站建设推广关于协会网站建设的意见
  • 门户网站建站要求滨州网站seo服务
  • 国外 视频上传网站源码怎么看网站的访问量
  • 网站的建设框架3网站建设