电子商务网站建设与维护案例,wordpress本地视频播放器,专业建站公司,做网站为什么没收入#x1f6a9;纸上得来终觉浅#xff0c; 绝知此事要躬行。 #x1f31f;主页#xff1a;June-Frost #x1f680;专栏#xff1a;C语言 #x1f525;该篇将运用数组来实现 扫雷游戏。 目录#xff1a; #x1f31f;思路框架测试游戏 #x1f31f;测试部分函数实现纸上得来终觉浅 绝知此事要躬行。 主页June-Frost 专栏C语言 该篇将运用数组来实现 扫雷游戏。 目录 思路框架测试游戏 测试部分函数实现 游戏部分函数实现完整的代码❤️ 结语 思路框架
测试
通过迭代保证每次玩完游戏后可以再来一局或者退出。 游戏
说明 1 . 实现扫雷首先需要布置雷通过一个二维数组就可以很容易的将雷的信息存储下来。只需要将二维数组的元素赋予两个不同的值例如’1’ ——雷’0‘ ——无雷或者 ‘#’ ——雷’ * ’ ——无雷只不过这两种在后续排查雷中操作不同通过一个循环前者可以加起来计算出周围有几个雷后者可以通过比较来判定有多少雷。 如上图对于 排查雷(周围有多少雷)如果只有一个数组那么在周围如果只有一个雷的情况下(’1‘——表示雷’0‘——表示无雷)该位置的数组元素就会被赋值为1在最后展示棋盘的时候这个1就会造成歧义,就会不知道这个’1‘究竟是雷还是周围雷的个数。 所以,通过建立另一个数组来记录周围雷的数量。 如图 3. 但是我们可以将其逻辑统一 为了简便操作我们将两个数组规定为同类型同大小(两个都扩充一圈)。 优点1可以方便数组操作下标一样不需要重新计算对应数组元素的下标。优点2同类型意味着可以使用同一个函数不需要一个功能写两次。 每个部分都是单独的函数体下面将会单独对每个函数体进行实现。 测试部分函数实现 选择是否玩游戏 与三子棋一样该板块的循环部分将会使用do while 循环来实现保证一开始可以选择运行完游戏部分后还可以继续选择。
#define _CRT_SECURE_NO_WARNINGS 1
#includegame.hint main()
{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);return 0;
}游戏部分函数实现 首先我们根据游戏部分的思路框架将整个游戏的逻辑写在game()函数中。 前提
#define ROW 9
#define COL 9#define ROWS ROW2
#define COLS COL2定义两种可以在后续分别用于不同的函数。
游戏逻辑
void game()
{char mine[ROWS][COLS] { 0 };//存放雷char show[ROWS][COLS] { 0 };//存放排查出的雷的信息//初始化InitBoard(mine, ROWS, COLS, 0);//都先初始化为无雷InitBoard(show, ROWS, COLS, *);//布置雷SetMine(mine, ROW, COL);//打印第二个棋盘DisplayBoard(show, ROW, COL);//排查雷FineMine(mine, show, ROW, COL);
}初始化 由于想使用一个函数就可以将两个棋盘初始化所以在参数上需要增加一个变量用于接收初始化的值。
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{int i 0;for (i 0; i row; i){int j 0;for (j 0; j col; j){board[i][j] set;}}
}布置雷 前提#define Set_Mine 10;//需要布置雷的数量 布置雷是随机的所以我们采用伪随机数将下标在合法范围内随机如果该坐标下是无雷的就赋值‘1’定为有雷。
void SetMine(char board[ROWS][COLS], int row, int col)
{int count Set_Mine;while (count){int x rand() % row 1;int y rand() % col 1;if (x 1 x row y 1 y col){if (board[x][y] 0){board[x][y] 1;count--;//布置成功雷数减少1}}}
}打印棋盘 为了方便玩家定位坐标在打印棋盘的时候可以将行和列打印出来。并且展示出来的是中间的区域不展示扩容区域
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf(--------扫雷游戏-------\n);int i 0;for (i 0; i col; i)//打印列{printf(%d , i);}printf(\n);for (i 1; i row; i){printf(%d , i);//打印行int j 0;for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}
}排查雷
计数
int GetMineCount(char board[ROWS][COLS], int x, int y)
{int i x - 1;int j y - 1;int ret 0;for (i x - 1; i x 1; i){for (j y - 1; j y 1; j){ret board[i][j];}}return ret - 9 * 0;
}排雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col)
{int win 0;//如果要赢 需要的有检查的次数例如9*9棋盘有10个雷检查出71个地区不是雷就意味着获胜。while (winROW*COL-Set_Mine){int x 0;int y 0;printf(请输入坐标中间用空格: );scanf(%d %d, x, y);if (x 1 x row y 1 y col)//判断坐标合法{//踩到雷if (mine[x][y] 1){printf(很遗憾已踩到雷\n);DisplayBoard(mine, ROW, COL);break;}//没猜到雷else{Unfold(mine,show, ROW, COL, x, y,win);//递归展开DisplayBoard(show, ROW, COL);//展示棋盘}}else{printf(输入非法需要重新输入\n);}}if (win ROW * COL - Set_Mine){printf(游戏获胜\n);DisplayBoard(mine, ROW, COL);}
}展开 如何实现上面的展开效果呢 当我们点击一个坐标后看是否满足3个条件 1.这个坐标不是雷(如果按照博主的排雷逻辑这个条件不需要判断因为坐标下不是雷的时候才会调用展开函数) 2.周围没有雷 3.没有被递归过(防止死递归) 这时被点击的地方就可以被赋值为空并对周围的8个区块看是否符合这样的条件,8个区块也按照这个逻辑如果满足三个条件被赋空并且遍历周围如果不满足就显示周围有多少雷或者不做任何反应按照这样的逻辑一直延续下去。这种情况我们可以使用递归去解决。
void Unfold(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col,int x,int y, int* count_w)
{if (x 1 x row y 1 y col)//判断合法{if (!GetMineCount(mine, x, y) show[x][y] ! )//周围没有雷并且该位置没有被递归过{show[x][y] ;int i 0;int j 0;int ret 0;//直接遍历9个至于中间的那个坐标最后一个else if 会处理for (i x - 1; i x 1; i){for (j y - 1; j y 1; j){Unfold(mine, show, row,col,i, j, count_w);(* count_w);}}}else if (GetMineCount(mine, x, y))//周围有雷{int count GetMineCount(mine, x, y);show[x][y] count 0;(* count_w);}else if (show[x][y] )//被递归过{;//不需要操作}}//不合法的函数不需要任何处理
}这里需要判断合法性因为扩容出去的那一圈的元素不可以递归而且也不可以计算 (不然按照GetMineCount的逻辑会越界访问而且就会可以计算出也不会打印这个区域所以可以直接不用管递归这些地方的时候函数会什么都不处理。 完整的代码
game .h
#pragma once
#includestdio.h
#includestdlib.h
#includetime.h#define ROW 9
#define COL 9#define ROWS ROW2
#define COLS COL2#define Set_Mine 10//需要布置雷的数量
//游戏逻辑
void game();
//初始化
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
//埋雷
void SetMine(char board[ROWS][COLS], int row, int col);
//展示棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//排雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);game .c
#define _CRT_SECURE_NO_WARNINGS 1
#includegame.h
//菜单
void menu()
{printf(***********************\n);printf(***** 1. play *****\n);printf(***** 0. exit *****\n);printf(***********************\n);
}//初始化
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{int i 0;for (i 0; i row; i){int j 0;for (j 0; j col; j){board[i][j] set;}}
}
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{int count Set_Mine;while (count){int x rand() % row 1;int y rand() % col 1;if (x 1 x row y 1 y col){if (board[x][y] 0){board[x][y] 1;count--;//布置成功雷数减少1}}}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf(--------扫雷游戏-------\n);int i 0;for (i 0; i col; i)//打印列{printf(%d , i);}printf(\n);for (i 1; i row; i){printf(%d , i);//打印行int j 0;for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}
}
//计数
int GetMineCount(char board[ROWS][COLS], int x, int y)
{int i x - 1;int j y - 1;int ret 0;for (i x - 1; i x 1; i){for (j y - 1; j y 1; j){ret board[i][j];}}return ret - 9 * 0;
}//展开
void Unfold(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col,int x,int y, int* count_w)
{if (x 1 x row y 1 y col){if (!GetMineCount(mine, x, y) show[x][y] ! )//周围没有雷并且该位置没有被递归过{show[x][y] ;int i 0;int j 0;int ret 0;for (i x - 1; i x 1; i){for (j y - 1; j y 1; j){Unfold(mine, show, row,col,i, j, count_w);(* count_w);}}}else if (GetMineCount(mine, x, y))//周围有雷{int count GetMineCount(mine, x, y);show[x][y] count 0;(* count_w);}else if (show[x][y] )//被递归过{;}}
}
//排雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col)
{int win 0;while (winROW*COL-Set_Mine){int x 0;int y 0;printf(请输入坐标中间用空格: );scanf(%d %d, x, y);if (x 1 x row y 1 y col){//踩到雷if (mine[x][y] 1){printf(很遗憾已踩到雷\n);DisplayBoard(mine, ROW, COL);break;}//没猜到雷else{Unfold(mine,show, ROW, COL, x, y,win);//递归展开DisplayBoard(show, ROW, COL);//展示棋盘}}else{printf(输入非法需要重新输入\n);}}if (win ROW * COL - Set_Mine){printf(游戏获胜\n);DisplayBoard(mine, ROW, COL);}
}//游戏逻辑
void game()
{char mine[ROWS][COLS] { 0 };//存放雷char show[ROWS][COLS] { 0 };//存放排查出的雷的信息//初始化InitBoard(mine, ROWS, COLS, 0);//都先初始化为无雷InitBoard(show, ROWS, COLS, *);//布置雷SetMine(mine, ROW, COL);//打印第二个棋盘DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);//排查雷FineMine(mine, show, ROW, COL);
}test.c
#define _CRT_SECURE_NO_WARNINGS 1
#includegame.hint main()
{int input 0;srand((unsigned)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);return 0;
}❤️ 结语
文章到这里就结束了如果对你有帮助你的点赞将会是我的最大动力如果大家有什么问题或者不同的见解欢迎大家的留言~