建站平台 phpwind,四川建设厅网上查询网站,短链接生成器手机版,域名不同网站程序相同本文进行关于扫雷代码C语言实现的解释。
目录
一、思路
二、代码实现
1、game.h
2、test.c
3、game.c
a. initboard
b. displayboard
c. check_mine
d. setmines
e. input
f. minesweeper#xff08;最关键#xff09;
三、运行展示
四、功能拓展 一、思路
我…本文进行关于扫雷代码C语言实现的解释。目录一、思路二、代码实现1、game.h2、test.c3、game.ca. initboardb. displayboardc. check_mined. setminese. inputf. minesweeper最关键三、运行展示四、功能拓展一、思路我们创建两个数组进行代码实现我们两个数组分别命名为mine show首先第一个数组存放炸弹位置和安全位置如下再创建第二个数组作为扫雷的棋盘进行展示给玩家用*表示未知用数字表示检查后的周围的炸弹数如上在游戏过程中我们挑选位置并判断是不是炸弹若是死亡若不是统计它周围八格的炸弹数并显示。但是我们发现如果要检查的位置处在数组边缘没法统计它周围八格的元素数组会越界为此我们对数组进行扩充将其周围再加上一圈为0的元素使检查时永远不越界如下。每当我们检查一个位置时我们把它放在前一个数组中判断是否为炸弹若是则死亡若不是则判断周围炸弹数量然后放入第二个数组中进行展示然后计数加一。若除炸弹以外所有格子都已检查则成功获胜。二、代码实现为将代码书写简介我们分为三个文件进行书写。分别为test.c game.c game.h分别存储主函数游戏内调用的函数和函数的声明。1、game.h#pragma once #include stdio.h #include stdlib.h #include time.h #define ROW 9 #define COL 9 #define ROWS ROW 2 #define COLS COL 2 #define minenumber 10 //初始化棋盘 void initboard(char arr[ROWS][COLS], char c); //展示棋盘 void displayboard(char arr[ROWS][COLS]); //检查是否是雷 void check_mine(int x, int y, char mine[ROWS][COLS], char show[ROWS][COLS],int *win); //设置炸弹 void setmines(char mine[ROWS][COLS], int x, int y); //输入坐标并转换成数组的行列 void input(int*x,int*y); //扫雷循环 void minesweeper(int x, int y, char mine[ROWS][COLS], char show[ROWS][COLS]);在game.c中a. 包含了许多头文件。b. 定义了ROW COL这两个数作为游戏棋盘的行列大小定义了ROWS COLS这两个数作为mine show数组的行列大小定义了minenumber作为炸弹数量。c. 定义的许多函数暂时简单了解功能后面会介绍。2、test.cmain函数int main() { test(); return 0; }test函数我们在主函数main中用test函数包含代码。void test() { int n 1; do { menu(); printf(请选择: ); scanf(%d, n); if (n 1) { game(); } else if (n ! 0) { printf(输入错误请重新输入\n); } } while (n); printf(退出游戏\n); }menu函数我们通过test函数来判断游戏是否要进行并使用menu函数输出菜单。void menu() { printf(********************\n); printf(***** 1.play *****\n); printf(***** 0.exit *****\n); printf(********************\n); }每当一次游戏结束或程序第一次运行进行询问当输入1时进入game函数游戏主体进行游戏每当输入0时退出程序。通过do while循环实现。结果如下game函数void game() { srand((unsigned int)time(NULL)); char mine[ROWS][COLS]; char show[ROWS][COLS]; //初始化棋盘 initboard(mine, 0); initboard(show, *); //displayboard(mine); displayboard(show); int x 0, y 0, win 0; //输入坐标 input(x, y); //第一次检查不使用检查函数目的是为了在生成炸弹时不考虑第一次检查的位置防止第一次踩炸弹 //生成炸弹 setmines(mine, x, y); //displayboard(mine); minesweeper(x, y, mine, show); }a. 我们用srand和time函数设置种子。b. 创建数组mine和show然后使用initboard函数对两个数组进行初始化。使其全为 0 或 * 。注数组设置为字符数组可以输入字符 * c. 展示棋盘并进行第一次检查位置的输入。第一次输入我们不把它放进扫雷的主要循环中因为我们要根据第一次输入的坐标来设置炸弹。第一次检查一定不能是炸弹。d. 然后我们进入扫雷的主体运行与循环最重要e. 设置变量win统计已经检查的坐标数。3、game.cgame.c中存放了前面使用的函数。a. initboard对mine和show进行初始化参数为数组和要输入的字符0/*void initboard(char arr[ROWS][COLS], char c) { for (int i 0; i ROWS; i) { for (int j 0; j COLS; j) { arr[i][j] c; } } }两层遍历。b. displayboard对游戏棋盘进行展示参数为数组。void displayboard(char arr[ROWS][COLS]) { for (int i 1; i ROW 1; i) { printf(%d , ROW - i 1); for (int j 1; j COL 1; j) { printf(%c , arr[i][j]); } printf(\n); } printf(\n); printf( ); for (int i 1; i ROW 1; i) { printf(%d , i); } printf(\n); }每行输出前加上行标注意数组是从左上到右下从0扩大但坐标系中是从左下到右上所以需要进行转置。在全部输出完以后最后一行再添加列坐标注意前面加等量空格对齐。在基础展示上添加列坐标后展示结果如下c. check_mine检查当前位置是否为炸弹。若是则win设置为一个大值超出安全的坐标数若不是则已经检查数win加一。若当前坐标周围无炸弹则进行成片展开。 void check_mine(int x, int y, char mine[ROWS][COLS], char show[ROWS][COLS],int *win) { if (x 1 x ROW y 1 y COL show[x][y] *) //if语句进行边界判断防止检查棋盘外的坐标防止重复检查 { int count 0; if (mine[x][y] 1) //如果是炸弹将win调整为一个大值正常循环无法达到 { (*win) ROW * COL - minenumber 1; } else //如果不是炸弹对此坐标周围八格检查是否为炸弹并导入count { for (int i -1; i 1; i) { for (int j -1; j 1; j) { if (mine[x i][y j] 1) count; } } show[x][y] count 0; //使此坐标显示周围炸弹数 (*win); //检查过的坐标数加一 if (count 0) //如果四周无炸弹对周围八格进行递归检查 { //达成成片展开的效果 for (int i -1; i 1; i) { for (int j -1; j 1; j) { check_mine(x i, y j, mine, show, win); } } } } } } d. setmines设置炸弹炸弹位置不能是第一次选择的坐标。void setmines(char mine[ROWS][COLS], int x, int y) { int a, b,number; number minenumber; while (number 0) //循环直到未生成炸弹数为0 { a (rand() % 9) 1; //生成1~9随机数 b (rand() % 9) 1; if ((mine[a][b] ! 1 )(a!x||b!y)) //不能是第一次选择的坐标 { mine[a][b] 1; number--; } } }e. input输入坐标并进行转置转置为数组的坐标形式void input(int*x,int*y) { int a, b, c,a1,b1; printf(请输入要检查的位置行列); scanf(%d %d, a, b); a1 a; b1 b; c a; a ROW - b 1; //转置 b c; *x a; *y b; printf(\n); while ((a1 1 || a1 ROW || b1 1 || b1 COL)) //如果输入的数越界则重新输入 { printf(输入不规范请重新输入); scanf(%d %d, a, b); a1 a; b1 b; c a; a ROW - b 1; b c; *x a; *y b; printf(\n); } }f. minesweeper最关键进行不断输入坐标检查的循环直到所有安全坐标已经检查完winROW*COL-minenumber则成功。void minesweeper(int x, int y, char mine[ROWS][COLS], char show[ROWS][COLS]) { int win 0; check_mine(x, y, mine, show, win); //第一次因为已经有坐标不在循环里 displayboard(show); while (win ROW * COL - minenumber) //检查的循环 { input(x, y); check_mine(x, y, mine, show, win); //若是炸弹winwin ROW * COL - minenumber displayboard(show); //跳出循环 } if (win (ROW * COL - minenumber 1)) //死亡条件 { printf(你已经死亡,炸弹分布如下\n); displayboard(mine); } else if (win (ROW * COL - minenumber)) //成功条件 { printf(你赢了,炸弹分布如下\n); displayboard(mine); } }三、运行展示四、功能拓展可增加插旗功能在选择坐标时同时选择插旗或者检查。可增加时间功能在规定时间内完成游戏。还有很多功能可增加……此外若想更改游戏难度可以更改game.h中的ROW COL 和minenumber。