> 文档中心 > C语言实战项目【3】简易扫雷

C语言实战项目【3】简易扫雷

在学习C语言的二维数组之后,我们就有能力做一个简单的扫雷游戏

还是老规矩,分析思路

目录

1.目录

2.持续游戏

3.制作棋盘

4.埋雷

5.排雷

6.打印棋盘

7.全部代码


1.目录

最开始要给玩家选择是进入游戏还是退出游戏,所以给一个目录,这里我做出来的是这样的

2.持续游戏

制作一个持续进行游戏,这里我用dowhile来实现,具体代码如下

int input;do{menu();scanf("%d",&input);switch (input){case 1:{game();break;}case 0:{printf("退出游戏\n");break;}default:{printf("输入错误,请重新输入\n");break;}}} while (input);

这样就可以让用户自己选择是继续游戏还是退出游戏

3.制作棋盘

制作棋盘,对于棋盘我选择用二维是数组来解决,这里我们需要设置两个棋盘,一个是埋雷的棋盘,一个是用户排雷的棋盘,然后为了美观给棋盘排雷的棋盘初始化为'*',为了方便,给埋雷的棋盘初始化成'0'具体初始化代码如下

void Init(char arr[ROWS][COLS], int  rows, int cols, char set){for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){arr[i][j] = set;}}}

这里的set是为了初始化两个棋盘的时候更加方便,所以我就封装成了一个初始化函数

4.埋雷

埋雷我们需要给对应的埋雷棋盘的对应位置把'0'更改成成'1',这样设计是为了方便我们进行是否有类判断的时候更加方便,在进行埋雷之前要对对应的棋盘进行初始化,这里我还是用随机数的函数来设置雷,如果不知道设置随机数函数的,可以看我之前的文章猜数字C语言实战项目【猜数字】埋雷具体代码如下

void set_mine(char arr[ROWS][COLS], int row, int col){int x = 0;int y = 0;for (int i = 1; i <= EASY_COUNT; i++){while(1){x = rand() % 9 + 1;//1-9y = rand() % 9 + 1;if (arr[x][y] == '0'){arr[x][y] = '1';break;}}}}

5.排雷

埋雷之后需要玩家进行排雷,这里我把判胜负的代码直接放到这里面了,如果想的话,也可以重新封装成一个函数来调用,这里排雷需要让玩家输入,然后判断胜负,循环知道雷排完,或者踩到雷为止,玩家每次输入一次之后,我们需要对排雷的棋盘进行打印,让玩家知道自己的操作是否踩到雷和附近是否有雷,这里我们用加减法来判断玩家排雷处有多少雷,这里就和前面关联起来了,我们设置'0'和'1‘,九宫格相减的结果就是附近具体的雷数,具体代码如下

void find_mine(char arr[ROWS][COLS], char mine[ROWS][COLS] ,int row, int  col){int x = 0,y = 0,sum=0,n;while (1){static int count = 0;if (count == ROW * COL - EASY_COUNT){printf("you win");break;}else{printf("请输入:>\n");scanf("%d %d", &x, &y);if (arr[x][y] == '1'){printf("你输了\n");print_board(arr, ROW, COL);break;}else{sum = 0;for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){sum = sum + arr[x + i][y + j];}}n = sum - 9 * '0';mine[x][y] = '0' + n;print_board(mine, ROW, COL);}count++;}

6.打印棋盘

这里我们可以把打印棋盘封装成一个函数,给上面的代码进行调用,也就是我上面的printf_board函数,具体代码如下

void print_board(char arr[ROWS][COLS], int row, int col){int i, j;printf("_____________扫雷_____________\n");for (i = 0; i <= row; i++){printf(" %d ",i);}printf("\n");for (i = 1; i <= row; i++){printf(" %d ", i);for (j = 1; j <= col; j++){printf(" %c ",arr[i][j]);}printf("\n");}printf("———————————————\n");}

到这里,扫雷的全部功能就已经实现了,剩下的就是用代码来执行了

7.全部代码

全部代码在这里

//game.h#define _CRT_SECURE_NO_WARNINGS#pragma once#include#include#include#include#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void Init(char arr[ROWS][COLS],int  rows, int cols, char set);void print_board(char arr[ROWS][COLS], int row , int col);void set_mine(char arr[ROWS][COLS], int row, int col);void find_mine(char arr[ROWS][COLS],char mine[ROWS][COLS] ,int row,int  col);//test.c#include"game.h"void menu(){printf("*****************************\n");printf("************1.play ********\n");printf("***********0.exit**********\n");printf("*****************************\n");}void game(){srand((unsigned int)time(NULL));char arr[ROWS][COLS];char mine[ROWS][COLS];Init(arr, ROWS, COLS, '0');Init(mine, ROWS, COLS, '*');set_mine(arr, ROW, COL);print_board(mine, ROW, COL);find_mine(arr,mine, ROW, COL);print_board(mine, ROW, COL);}int main(){int input;do{menu();scanf("%d",&input);switch (input){case 1:{game();break;}case 0:{printf("退出游戏\n");break;}default:{printf("输入错误,请重新输入\n");break;}}} while (input);return 0;}//game.c#include"game.h"void Init(char arr[ROWS][COLS], int  rows, int cols, char set){for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){arr[i][j] = set;}}}void print_board(char arr[ROWS][COLS], int row, int col){int i, j;printf("_____________扫雷_____________\n");for (i = 0; i <= row; i++){printf(" %d ",i);}printf("\n");for (i = 1; i <= row; i++){printf(" %d ", i);for (j = 1; j <= col; j++){printf(" %c ",arr[i][j]);}printf("\n");}printf("———————————————\n");}void set_mine(char arr[ROWS][COLS], int row, int col){int x = 0;int y = 0;for (int i = 1; i \n");scanf("%d %d", &x, &y);if (arr[x][y] == '1'){printf("你输了\n");print_board(arr, ROW, COL);break;}else{sum = 0;for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){sum = sum + arr[x + i][y + j];}}n = sum - 9 * '0';mine[x][y] = '0' + n;print_board(mine, ROW, COL);}count++;}}}

快去试试吧