实现代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define COLS 11 #define ROWS 11 #define COL 9 #define ROW 9 #define Mine 10 //初始化方格 void InitBoard(char arr[ROWS][COLS],char c,int row,int col); //打印方格内容 void Print(char arr[ROWS][COLS],int row, int col); //安置地雷 void SetMine(char arr[ROWS][COLS]); //得到给定位置旁边的地雷数量 int ReachNumber(char arr[ROWS][COLS]); //找地雷位置 void FindMine(char arr[ROWS][COLS]);
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { printf("*************************************\n"); printf("***** 1.play ******* 0.exit *****\n"); printf("*************************************\n"); } void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBoard(mine,'0',ROWS,COLS); InitBoard(show, '*',ROWS,COLS); Print(show, ROW, COL); SetMine(mine); FindMine(mine, show); } int main() { srand((unsigned int)time(NULL)); int input=0; while (1) { do { menu(); scanf("%d", &input); switch (input) { case 1: printf("游戏开始\n"); game(); break; case 0: printf("游戏结束\n"); break; default: break; } } while (input); return 0; } }
1.界面设置:
与三子棋设计思路相同,需要用到do while循环来实现先打印菜单的效果.
int main() { srand((unsigned int)time(NULL)); int input=0; while (1) { do { menu(); scanf("%d", &input); switch (input) { case 1: printf("游戏开始\n"); game(); break; case 0: printf("游戏结束\n"); break; default: break; } } while (input); return 0; } }
2.实现的函数:
在game函数内部存在多个实现游戏的函数
2.1初始化方格内容:
void InitBoard(char arr[ROWS][COLS], char c, int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { arr[i][j] = c; } } }
由于扫雷游戏需要用到两个不同的字符数组,因此初始化函数要根据传入的参数不同而初始化的内容不同来区分两个数组,此次实现的大小为9*9的方格,但因为ReachNumber函数可能存在越界问题,因此要实现11*11的方格,但后续真正操作的方格只有中间的9*9.
2.2打印方格内容:
void Print(char arr[ROWS][COLS], int row, int col) { for (int j = 0; j <= COL; j++) { if (j == 0) printf(" "); else printf("%d ", j); } printf("\n"); for (int i = 1; i <= ROW; i++) { printf("%d ", i); for (int j = 1; j <= COL; j++) { printf("%c", arr[i][j]); printf("|"); } printf("\n"); printf("--------------------\n"); } }
打印函数需要遍历数组然后依次打印,需要注意的是保证游戏界面的整洁性,因此可以适当的打印空格以及横线等符号来使打印界面变得美观.
2.3安置地雷:
void SetMine(char arr[ROWS][COLS]) { int z = 0; while (z < Mine) { int x = 0; int y = 0; x = rand() % ROW + 1; y = rand() % COL + 1; if (arr[x][y] == '0') { arr[x][y] = '1'; z++; } } }
在安置地雷方面由于此次实现的是初阶难度,因此在9*9方格内需要安置10个地雷,地雷的设置要保证随机性且同一位置放过一次后不能再次放入,利用rand函数可实现,在数组最初无内容时放置的是字符0,在放过地雷之后就会变为字符1.
2.4:得到给定位置旁边的地雷数量:
int ReachNumber(char arr[ROWS][COLS], int x, int y) { return arr[x][y - 1] + arr[x][y + 1] + arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x + 1][y] + arr[x + 1][y - 1] + arr[x + 1][y + 1] - 8 * '0' ; }
如果一个位置是地雷,那么这个位置放入的是字符1,反之则是字符0,则让选定位置旁的8个位置相加后减去8*字符0,得到的就是地雷的数量.
2.5排除地雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS]) { int MINE = 0; int c = 0; int x = 0; int y = 0; while (MINE<ROW*COL-Mine) { printf("请输入坐标->:"); scanf_s("%d", &x); scanf_s("%d", &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '0') { c = ReachNumber(mine, x, y); show[x][y] = c + '0'; Print(show, ROW, COL); MINE++; } else { printf("你被炸死了\n"); Print(mine, ROW, COL); break; } } else { printf("坐标非法,请重新输入\n"); } } if (MINE == Mine) printf("恭喜你排雷成功\n"); }
总共10个地雷,利用while循环来实现重复排雷,直到除了地雷之外的位置都被排除,如果排到地雷,则同样游戏结束.
游戏截图:
结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!