dw怎么做别人可以看的网站,哪个网站可以做司考题,wordpress去除相册样式,城乡建设部网站察周圣进证件1.扫雷游戏的分析和设计
需要创建3个文件夹
test.c----扫雷游戏的测试
game.c----扫雷游戏的实现
game.h----扫雷游戏的实现
雷的信息使用二维数组存放
• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认…1.扫雷游戏的分析和设计
需要创建3个文件夹
test.c----扫雷游戏的测试
game.c----扫雷游戏的实现
game.h----扫雷游戏的实现
雷的信息使用二维数组存放
• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷 ◦ 如果位置不是雷就显⽰周围有⼏个雷◦ 如果位置是雷就炸死游戏结束◦ 把除10个雷之外的所有⾮雷都找出来排雷成功游戏结束扫雷的过程中布置的雷和排查出的雷的信息都需要存储所以我们需要⼀定的数据结构来存储这些信息
创建两个数组一个存放雷1是雷0不是雷
第二个数组就存放排查出的雷的信息避免太过混乱
越界访问会导致程序崩溃
把存放雷的数组扩大一圈防止越界上下左右多一行和列
1.使用两个二维数组来实现
2.如果棋盘的大小是99数组的大小就给1111
因为要扩大一圈后的大小就是11*11
3.数组使用字符数组就行
2.扫雷游戏的代码实现
game.h
#pragma once#include stdio.h//直接把头文件放在.h文件里面
#include stdlib.h
#include time.h
#pragma once
#define ROW 9//行
#define COL 9//列#define ROWS ROW2//11
#define COLS COL2#define EASY_count 10//简单版本设置的雷为10
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//11//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//9//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);test.c
#define _CRT_SECURE_NO_WARNINGS 1#include game.h//包含自己的头文件就能引用game.h中自己定义的一些条件
void menu()
{//打印菜单printf(**********************************************\n);printf(*************** 1 . play ***************\n);printf(*************** 0 . exit ***************\n);printf(**********************************************\n);
}
void game()
{//游戏逻辑 11 * 11char mine[ROWS][COLS] {0};//存放雷的信息char show[ROWS][COLS] {0};//存放排查出的雷的信息//初始化棋盘初始化的是11*11的规格因为最外面的外围要保证咱们得程序不越界InitBoard(mine,ROWS,COLS,0);//把11行11列传过去InitBoard(show, ROWS, COLS,*);//打印棋盘就只打印9*9的部分DisplayBoard(show, ROW, COL);//DisplayBoard(mine, ROW, COL);测试一下//布置雷只在9*9的部分布置雷SetMine(mine, ROW, COL);//把雷放到mine数组内因为mine数组就是存放雷的信息的数组//DisplayBoard(mine, ROW, COL);//排查雷在9*9的部分排查雷FindMine(mine,show,ROW,COL);
}void test()
{int input 0;//这个变量必须放外面如果放里面的话//每次循环进行就会将input重新赋值为0srand((unsigned int)time(NULL));//要包含头文件使rand产生随机值就是产生随机的雷do{menu();//打印菜单printf(请选择:);scanf(%d,input);//判断输入的值switch (input){case 1:game();//输入1之后进入游戏printf(扫雷\n);break;case 0:printf(退出游戏\n);break;default://输入错误printf(选择错误重新选择\n);break;}}while (input);//一直玩的情况玩完一把接着玩输入input,是1就接着玩}int main()
{test();return 0;
}game.c
#define _CRT_SECURE_NO_WARNINGS 1#include game.h//包含自己的头文件
//初始化棋盘规格是11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{for (int i 0; i rows; i){for (int j 0; j cols; j){board[i][j] set;//想初始化什么就初始化什么初始化的值就是传过来的字符}}
}//只打印9*9
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf(温馨提示);printf(在输入数据的时候不要输入逗号\n);printf(应该在输入一个坐标值后按一下空格\n);printf(再输入另一个坐标值\n);printf(不听话你就等着出乱码吧\n);printf(--------扫雷-------\n);int i 0;for (i 0; i col; i)//从0开始保证对其{printf(%d , i);//打印列数}printf(\n);for (i 1; i row; i)//为什么从1开始因为最外围有一圈是空的为了防止越界{printf(%d , i);//打印行数int j 0;for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);//打印完一行就换行}printf(--------扫雷-------\n);
}
//布置的雷是在棋盘上随机的找啊10个坐标布置的
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count EASY_count;//给出雷的个数每布置一个雷就减少一个雷int x 0, y 0;while (count)//当count为0的时候就不再进入循环了雷已经布置好了{//x,y生成的坐标范围都是1~9x rand()%row1;//行y rand()%col1;//列//如果这个坐标已经放雷就不需要重复放雷如果没放就放雷if (mine[x][y] ! 1)//如果这个位置不是字符一{mine[x][y] 1;//就放一个字符一//布置一个雷count--;//减少一个雷}}
}
//1-01, 1的ASCLL值是49
// 2-02
//统计周围雷的个数
int Get_Mine_Count(char mine[ROWS][COLS],int x,int y)//返回雷的个数
{//将你输入的坐标周围的8个坐标的原有的字符相加起来这些原有的字符可能是1或者是0//有雷或者没有雷//第一种写法/*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;//坐标上面的值减去字符0就是他们坐标上面有的数字//在你输入的坐标周围总共有8个坐标所以直接8*0*///第二种写法使用循环的方式int i 0,count0;for (i -1; i 1; i){int j 0;for (j -1; j 1; j){countmine[x i][y j] - 0;//因为你输入的坐标不是雷所以将他加进去也无所谓//要排查周围雷的信息//将这8个坐标上的字符数字累加在count内}//mine[x i][y j]随之i和j的变化模拟了你输入的坐标周围的8个坐标的值}return count;
}//排查雷思路
//1.输入一个坐标
//2.判断这个坐标是否越界
//3.判断这份位置是否是雷
//如果是雷就炸死
//如果不是雷就统计这个周围雷的个数显示出来
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0, y 0;int win 0;while (wincol*row- EASY_count)//总共的方格数-雷的数量直到这个值为0是不会停下的除非你提前踩雷了{printf(请输入排查的坐标);scanf(%d %d, x, y);if (x 1 x row y 1 y col)//输入的坐标是合法的{//接下来就判断这个坐标上面是不是雷if (mine[x][y] 1)//输入的位置是雷{printf(很遗憾你踩雷了游戏结束);DisplayBoard(mine, ROW, COL);//让玩家死得瞑目知道雷的位置break;//让循环停下来}else//输入的位置不是雷我们就要统计这个坐标周围的8个坐标雷的数量{int count Get_Mine_Count(mine, x, y);//统计类雷的个数//将算出的雷的数量放到show数组show[x][y] count 0;//转化为字符放到数组里面DisplayBoard(show, ROW, COL);//打印show数组内的信息//不是雷的话win;//}}else{printf(输入的坐标有误x(1~9),y(1~9),应该重新输入);}}//如果我们把所有不是雷的位置都排查完了那我们排雷就成功了if (win row * col - EASY_count)//所有的雷都被排完了{printf(恭喜你排雷成功了);//把雷的信息打印出来DisplayBoard(mine, ROW, COL);}
}3.扫雷游戏的拓展
是否可以选择游戏难度
简单9*9棋盘,10个雷
中等16*16棋盘40个雷
困难30*16棋盘99个雷
点开一个坐标周围不是雷的就都显现出来了
在线扫雷游戏扫雷游戏网页版 - Minesweeper