希望本篇内容对有需要的小伙伴儿们有帮助哦!
目录
文件
简单的逻辑
对目标位置进行判定
game2.h
game2.c
test2.c
文件 简单的逻辑
打印菜单 -> 选择是否进入游戏 -> 初始化数组 -> 埋雷数组用字符零初始化 -> 排雷数组用 ' * ' 初始化 -> 随机埋雷 -> 打印排雷数组 -> 输入坐标进行排雷并对该位置进行判断
假如我们想要创建的是一个9×9的扫雷,我们需要存放雷,那么我们很容易便想到了用二维数组来实现,那么我们建立两个二维数组,一个用来存放雷,另一个用来排雷,并显示排雷的信息。本文中,我们用字符0来代表非雷,用字符1来代表雷,所以,我们需要建立char型的数组来存储。
好,那么在了解了基本信息后让我们来思考一个问题,在排位的过程中会不会出现什么问题?在扫雷中,点击你要排雷的位置后,如果该位置是雷,那么会被炸死,游戏结束;如果不是雷,它会显示周围雷的数量,好,在我们用代码实现该过程中,是雷——炸死——游戏结束这一过程很简单;“显示周围雷的数量”这一过程呢?会有什么问题吗?
显示周围雷的数量
假设我们按照一开始的思路建立了两个char[9][9]的数组。
那么请大家思考,当我们想要排查上图中红色区域时,是否能正确排查呢?答案是不能,请假来和我一起思考:如果该位置是雷那么很简单,如果不是雷它就需要对周围区域进行遍历,以此来显示周围数量,好,重点来啦!我们初始化的数组只有9行9列,当我们设置代码对目标位置进行遍历时,红色区域的外围是非法地带,即越界!那么怎么办呢,其实很简单,我们只要在创建的时候将其扩大一圈便可以了,即11×11的二维数组;但我们对数组初始化时只初始化9×9的区域。
对目标位置进行判定//雷——'1' // 非雷——'0' //排查雷 void mine_clearance(char mine[ROWS][COLS], char arr2[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//用来计算排查的区域,当非雷区域被排查完后便获得了胜利 while (win < row * col - MINENUMBER) { printf("请输入选择排查的坐标->"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾被炸死了n"); Printboard(mine, ROW, COL);//显示雷图令玩家明白 break;//已被炸死 跳出程序防止死循环 } else { int count = mines_num(mine, x, y);//计算周围雷的数量 arr2[x][y] = count + '0'; //count是整型,加上字符零后便可显示字符数字。 Printboard(arr2, ROW, COL); win++; } } else { printf("坐标非法,请重新输入->"); //我们要对玩家输入的坐标进行判断防止玩家出错 } } if (win == row * col - MINENUMBER) { printf("恭喜你!排雷成功!n"); Printboard(mine, ROW, COL); } }game2.h
#includegame2.c#include #include #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define MINENUMBER 20 //埋雷的数量 void menu(); //初始化 void initialize(char mine[ROWS][COLS], int row, int col, char set); //打印 void Printboard(char mine[ROWS][COLS], int row, int col); //埋雷 void Buriedmine(char mine[ROWS][COLS], int row, int col); //排查雷 void mine_clearance(char mine[ROWS][COLS],char arr2[ROWS][COLS], int row, int col);
#include"game2.h" //菜单 void menu() { printf("********************n"); printf("****** 1.play ******n"); printf("****** 0.exit ******n"); printf("********************n"); } //初始化 void initialize(char mine[ROWS][COLS], int row, int col, char set) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { mine[i][j] = set; } } } //打印 void Printboard(char mine[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf(" ----------- 扫雷 -----------n"); printf(" |"); for (j = 1; j <= col; j++) { printf("%2d ", j); } printf("n"); printf(" --|-------------------------n"); for (i = 1; i <= row; i++) { printf("%2d |", i ); for (j = 1; j <= col; j++) { printf(" %c ", mine[i][j]); } printf("n"); } } //埋雷 void Buriedmine(char mine[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = MINENUMBER; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //计算雷的数量 int mines_num(char mine[ROWS][COLS], int x, int y) { return (mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0'); } //雷——'1' // 非雷——'0' //排查雷 void mine_clearance(char mine[ROWS][COLS], char arr2[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while (win < row * col - MINENUMBER) { printf("请输入选择排查的坐标->"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾被炸死了n"); Printboard(mine, ROW, COL); break; } else { int count = mines_num(mine, x, y);//计算周围雷的数量 arr2[x][y] = count + '0'; Printboard(arr2, ROW, COL); win++; } } else { printf("坐标非法,请重新输入->"); } } if (win == row * col - MINENUMBER) { printf("恭喜你!排雷成功!n"); Printboard(mine, ROW, COL); } }test2.c
#include"game2.h" void game() { char mine[ROWS][COLS] = { 0 }; char demining[ROWS][COLS] = { 0 }; //初始化 initialize(mine, ROWS, COLS, '0'); initialize(demining, ROWS, COLS, '*'); //打印 //Printboard(demining, ROW, COL); //埋雷 Buriedmine(mine, ROW, COL); Printboard(mine, ROW, COL); //排查雷 mine_clearance(mine,demining, ROW, COL); } int main() { 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"); } } while (input); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)