今天来写一个小项目-怎么实现简易版扫雷,大家都玩过扫雷吧,在写扫雷这个小项目之前我是不会玩扫雷的,O(∩_∩)O哈哈~,之后才有了玩的想法。现在我们来看一下如何实现吧。
首先,我们要玩扫雷要有一个简单的游戏菜单供用户选择,这就需要一个菜单函数menu( )。
其次,要有两个数组,一个用来隐藏的显示雷的数组,另一个就是真正显示界面的数组。数组定义好后要进行初始化啊,显示雷的数组用 0 初始化,真正显示数组用 * 初始化。效果如下图
然后,给雷数组设置雷,要随机生成雷,最后就可以玩游戏了。
代码:
先在头文件里定义一下所需要的的函数
#define ROW 10 #define COL 10 #define MINE_COUNT 98 //设置雷 void set_mine(char mine[ROW + 2][COL + 2], int row, int col); void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count); //显示 void display_board1(char mine[ROW + 2][COL + 2], int row, int col);//用于调试时显示雷分布 void display_board(char board[ROW + 2][COL + 2], int row, int col); void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y); //统计雷个数 int get_mine_count(char board[ROW + 2][COL + 2], int x, int y); //玩游戏 void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2]);
接下来是我们扫雷游戏的测试函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<time.h> #include<string.h> #include<stdlib.h> #include "扫雷.h" int menu(void) { int choose; printf("********************\n"); printf(" 0.退出 \n"); printf(" 1.玩游戏 \n"); printf("********************\n"); printf("choose:"); scanf("%d", &choose); return choose; } int chance_mine(void) { int number = 0; printf("请选择雷数:"); scanf("%d", &number); return number; } void game() { int ret = 0; int x = 0, y = 0; int num = 0; char mine[ROW + 2][COL + 2]; //定义两数组显示雷数组 char board[ROW + 2][COL + 2]; //自定义选择雷的数量chance_mine() //初始化两个数组 memset(mine, '0', (ROW + 2)*(COL + 2)*(sizeof mine[0][0])); memset(board, '*', (ROW + 2)*(COL + 2)*(sizeof board[0][0])); //init_mine(mine,board); //显示雷数组,界面数组 //display_board(board, ROW + 2, COL + 2); //设置雷 set_mine(mine, ROW + 2, COL + 2); display_board1(mine, ROW + 2, COL + 2);//测雷 display_board(board, ROW + 2, COL + 2); //玩游戏 play_mine(mine, board); get_mine_count(mine, x, y); } int main() { int choose = 0; srand((unsigned int)time(NULL)); do{ choose = menu(); switch (choose) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误\n"); break; } } while (choose); system("pause"); return 0; }
最后就是扫雷中各个部分如何去实现了,其中各个函数实现如下:
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 10 #define COL 10 #define MINE_COUNT 98 #include<stdio.h> #include<time.h> #include<string.h> #include<stdlib.h> #include "扫雷.h" //显示雷阵,看不见雷 void display_board(char board[ROW + 2][COL + 2], int row, int col) { printf("-------------\n"); int i = 0, j = 0; printf(" "); for (i = 1; i < col - 1; i++)//打印1-10的heng标 { printf("%d ", i); } printf("\n\n"); for (i = 1; i < row - 1; i++)//打印1-10的shu标 { printf("%-1d ", i); for (j = 1; j < col - 1; j++) { printf("%c ", board[i][j]); } printf("\n"); printf("\n"); //改成------------- } } void display_board1(char mine[ROW + 2][COL + 2], int row, int col) { int i = 0, j = 0; printf(" "); for (i = 1; i < col - 1; i++)//打印1-10的heng标 { printf("%d ", i); } printf("\n\n"); for (i = 1; i < row - 1; i++)//打印1-10的shu标 { printf("%-1d ", i); for (j = 1; j < col - 1; j++) { printf("%c ", mine[i][j]); } printf("\n"); printf("\n"); } } void set_mine(char mine[ROW + 2][COL + 2], int row, int col) { int count = MINE_COUNT; while(count) { int x = 0, y = 0; x = (rand() % (row - 2)) + 1;//随机数生成,范围在(0--9)+1 即(1--10) y = (rand() % (col - 2)) + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count) { while (count) { int x = 0, y = 0; x = (rand() % (ROW)) + 1;//随机数生成,范围在(0--9)+1 即(1--10) y = (rand() % (COL)) + 1; if (mine[x][y] = '0') { mine[x][y] = '1'; count--; } } } //统计雷个数 int get_mine_count(char mine[ROW + 2][COL + 2], int x, int y) { int count = 0; count = (mine[x - 1][y - 1] - '0') + (mine[x - 1][y] - '0') + (mine[x - 1][y + 1] - '0') + (mine[x][y - 1] - '0') + (mine[x][y + 1] - '0') + (mine[x + 1][y - 1] - '0') + (mine[x + 1][y] - '0') + (mine[x + 1][y + 1] - '0'); return count; } //展开雷 void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y) { int i = 0, j = 0; for (i = (x - 1); i <= (x + 1); i++) { for (j = (y - 1); j <= (y + 1); j++) { if (mine[i][j] == '0') { board[i][j] = get_mine_count(mine, i, j) + '0'; } if (board[i][j] == '0') { board[i][j] = ' '; } } } } //判断雷是否找完 int is_win(char board[ROW + 2][COL + 2]) { int i = 0, j = 0; int c = 0; for (i = 1; i <= ROW; i++) { for (j = 1; j <= COL; j++) { if (board[i][j] != '*') { c++; } } } return c; } //玩游戏 void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2]) { int first = 0; int x = 0, y = 0; int leicount = 0; while (1) { //输入坐标 printf("请输入坐标:"); scanf("%d%d", &x, &y); //坐标合法性 if ((1 <= x && x <= 10) && (1 <= y && y <= 10)) { first++; if (mine[x][y] == '1') { if (first == 1) { reset_mine(mine, x, y, 1); display_board(mine, ROW + 2, COL + 2); int ret = 0; ret = get_mine_count(mine, x, y); board[x][y] = ret + '0'; //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII display_board(board, ROW + 2, COL + 2); //display_board1(mine, ROW + 2, COL + 2);//测雷 } else if (mine[x][y] == '1') { printf("你踩雷了\n"); //set_mine(board, x, y); display_board(mine, ROW + 2, COL + 2); break; } } else { int ret = 0; ret = get_mine_count(mine, x, y); board[x][y] = ret + '0'; //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII if (ret == 0) { expand_mine(mine, board, x, y); } display_board(board, ROW + 2, COL + 2); } } else { printf("输入坐标错误,请重新输入\n"); } if (is_win(board) == ROW * COL - MINE_COUNT) { printf("雷全部找出\n"); display_board(mine, ROW + 2, COL + 2); break; } } }在写这个扫雷的过程中,我发现了我的很多问题,很多细节及知识点都不会,人丑还是多看书吧。