我是靠谱客的博主 笨笨小土豆,这篇文章主要介绍【C语言扫雷游戏】【C语言扫雷游戏】,现在分享给大家,希望可以做个参考。

【C语言扫雷游戏】

扫雷游戏介绍

在这里插入图片描述

*区域埋藏着一定数量的雷,这里我们以10颗雷为例。排查雷的时候,我们输入坐标,若该坐标处有雷,我们就会被炸死,游戏结束。若该坐标处没有雷,该坐标处将显示以它为中心,四周的雷的数量之和

游戏逻辑的测试test.c

·界面实现

进入游戏,选择玩游戏或者退出,我们用do…while()语句实现

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main() { int input = 0; do { menu(); printf("请输入您的选择:>n"); scanf("%d", &input); switch (input) { case 1: printf("n-------扫雷游戏--------n"); game(); break; case 0: printf("退出n"); break; default: printf("输入错误,请重新输入!n"); break; } } while (input); return 0; }

main()函数中调用的menu函数和game函数,需要我们一一实现

·menu函数的实现

复制代码
1
2
3
4
5
6
7
void menu() { printf("*************欢迎来到扫雷游戏***************n"); printf("************** 1.play ******************n"); printf("************** 0.exit ******************n"); }

·game函数的实现

game函数的实现,是该扫雷游戏的整个实现的逻辑

a.游戏棋盘的创建

我们需要两个二维数组,一个数组用来布置雷区,一个数组用来存储排查雷的信息

布置雷区,除了外面一层的横纵坐标外,0表示不是雷,1表示是雷
在这里插入图片描述
排查雷的信息,若排查的坐标不是雷,则显示该坐标四周的雷的数量
在这里插入图片描述

因为数组2为了保持神秘感,用*遮掩,所以数组2应为char型,为了保证两个数组统一,数组1也为char型。

对于中间的坐标,计算它四周的雷的数量,只需要计算以它为中心的九宫格的雷的数量就行。而对于边缘的坐标,它的四周并没有完整的九宫格,所以创建数组时,需要行加两行,列加两列。比如99的布雷区,我们需要1111的数组。而布雷时,只需要布在9*9的区域上

在这里插入图片描述

复制代码
1
2
3
4
//创建两个数组,一个储存布雷的信息,一个储存排雷的信息 char mine[Rows][Cols]; char show[Rows][Cols];

b.初始化棋盘

将数组mine中的元素初始化为字符0
将数组show中的元素初始化为字符*

复制代码
1
2
3
4
//初始化数组 InitBoard(mine, Rows, Cols, '0');//布雷的数组初始化为字符0 InitBoard(show, Rows, Cols, '*');//排雷的数组初始化为字符*

c.打印一下初始化的结果

复制代码
1
2
3
DisplayBoard(mine, Row, Col); DisplayBoard(show, Row, Col);

以上打印无误后,开始布雷

d.布雷

复制代码
1
2
3
4
//布雷count个 SetMine(mine, Row, Col); DisplayBoard(mine, Row, Col);//打印一下布雷情况

布雷的区域在9*9的数组中,打印检测无误后,开始排雷

f.排雷

复制代码
1
2
FindMine(mine, show, Row, Col);

游戏中函数的定义(实现)game.c

1.初始化数组

布雷数组mine初始化为字符0.
排雷数组show初始化为字符*

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//初始化数组 void InitBoard(char board[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++) { board[i][j] = set; } } }

2.打印数组

数组的横纵坐标打印。数组元素由1-9的横纵坐标内容访问

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void DisplayBoard(char board[Rows][Cols], int row, int col) { int i = 0; int j = 0; for (j = 0; j <= col; j++) { printf("%d ", j);//打印坐标列 } printf("n"); for (i = 1; i <= row; i++) { printf("%d ", i);//打印坐标行 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("n"); } }

3.布置雷区

利用rand()函数随机生成坐标,不过在使用rand函数之前,需要在main函数中使用srand函数制作随机生成器

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SetMine(char board[Rows][Cols], int row, int col) { int t = count; while (t)//布置count颗雷 { int x = rand() % row + 1;//1-9 int y = rand() % col + 1;//1-9 //判断该区域是否已经布置过雷 if (board[x][y] == '0') { board[x][y] = '1'; t--; } } }

4.扫雷

输入一个需要排查的坐标,若以该坐标作为下标的数组mine中存放的是字符‘1’则被炸死,否则,需要计算以该坐标为中心四周的雷的个数。需要一个函数get_count(mine, x, y)用来计算四周雷的个数

get_count(mine, x, y)函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//统计雷的数量 int get_count(char mine[Rows][Cols], int x, int y) { char sum = '0'; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { sum += mine[x + i][y + j]; } } return sum - 10 * '0'; }

小tips:字符减去字符0,得到该字符对应的整型数字。数字加上字符0得到该数字对应的字符

在雷没有全部排完之前,需要继续排雷,所以while循环,循环条件为除雷以后的安全坐标的个数,随着排雷工作的进行,越发接近循环条件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//扫雷 void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) { int x = 0; int y = 0; int lei = (row * col - count);//统计已经排查了的不是雷的坐标数量 while (lei) { printf("请输入排查的坐标:>n"); scanf("%d %d", &x, &y); //判断坐标的合法性 if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '1') { printf("你被炸死了n"); DisplayBoard(mine, Row, Col); break; } else { //不是雷的情况,统计以其为中心的九宫格周围有多少个雷,并将雷的数目放入同坐标下的show数组中 lei--;//排查掉一个坐标 int n=get_count(mine, x, y); show[x][y] = n+'0';//数字n转化为字符n DisplayBoard(show, Row, Col); } } else { printf("坐标不合法,请重新输入!n"); } } if (lei == 0) { printf("恭喜你!排雷成功!n"); DisplayBoard(show, Row, Col); } }

源码:

test.c

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#define _CRT_SECURE_NO_WARNINGS 1 //游戏逻辑的测试 #include "game.h" void menu() { printf("*************欢迎来到扫雷游戏***************n"); printf("************** 1.play ******************n"); printf("************** 0.exit ******************n"); } void game() { //创建两个数组,一个储存布雷的信息,一个储存排雷的信息 char mine[Rows][Cols]; char show[Rows][Cols]; //初始化数组 InitBoard(mine, Rows, Cols, '0');//布雷的数组初始化为字符0 InitBoard(show, Rows, Cols, '*');//排雷的数组初始化为字符* //打印一下初始化的结果 //DisplayBoard(mine, Row, Col); //printf("-------------------------------------n"); DisplayBoard(show, Row, Col); printf("------扫雷-----n"); //布雷count个 SetMine(mine, Row, Col); DisplayBoard(mine, Row, Col);//打印一下布雷情况 //扫雷 FindMine(mine, show, Row, Col); } int main() { int input = 0; srand((unsigned int)time(NULL));//为rand提供一个随机生成器 do { menu(); printf("请输入您的选择:>n"); scanf("%d", &input); switch (input) { case 1: printf("n-------扫雷游戏--------n"); game(); break; case 0: printf("退出n"); break; default: printf("输入错误,请重新输入!n"); break; } } while (input); return 0; }

game.h

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#pragma once //符号的定义 //函数的声明 //头文件的使用 #include<stdio.h> //9*9的数组存放雷的布局和排雷的信息 #define Row 9 #define Col 9 //将数组多加两行两列,相当于在9*9的数组外再加一层,方便处理边角处不能形成九宫格的区域 #define Rows Row+2 #define Cols Col+2 //雷的数量 #define count 10 //初始化数组 void InitBoard(char board[Rows][Cols], int row, int col, char set); //打印初始化的结果 void DisplayBoard(char board[Rows][Cols], int row, int col); //布置雷区 //0不是雷,1是雷 void SetMine(char board[Rows][Cols], int row, int col); //扫雷 void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);

game.c

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#define _CRT_SECURE_NO_WARNINGS 1 //函数的定义(实现) #include "game.h" //初始化数组 void InitBoard(char board[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++) { board[i][j] = set; } } } //打印一下初始化的结果 void DisplayBoard(char board[Rows][Cols], int row, int col) { int i = 0; int j = 0; for (j = 0; j <= col; j++) { printf("%d ", j);//打印坐标列 } printf("n"); for (i = 1; i <= row; i++) { printf("%d ", i);//打印坐标行 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("n"); } } //布置雷区 void SetMine(char board[Rows][Cols], int row, int col) { int t = count; while (t)//布置count颗雷 { int x = rand() % row + 1;//1-9 int y = rand() % col + 1;//1-9 //判断该区域是否已经布置过雷 if (board[x][y] == '0') { board[x][y] = '1'; t--; } } } //统计雷的数量 int get_count(char mine[Rows][Cols], int x, int y) { char sum = '0'; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { sum += mine[x + i][y + j]; } } return sum - 10 * '0'; } //扫雷 void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) { int x = 0; int y = 0; int lei = (row * col - count);//统计已经排查了的不是雷的坐标数量 while (lei) { printf("请输入排查的坐标:>n"); scanf("%d %d", &x, &y); //判断坐标的合法性 if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '1') { printf("你被炸死了n"); DisplayBoard(mine, Row, Col); break; } else { //不是雷的情况,统计以其为中心的九宫格周围有多少个雷,并将雷的数目放入同坐标下的show数组中 lei--;//排查掉一个坐标 int n=get_count(mine, x, y); show[x][y] = n+'0';//数字n转化为字符n DisplayBoard(show, Row, Col); } } else { printf("坐标不合法,请重新输入!n"); } } if (lei == 0) { printf("恭喜你!排雷成功!n"); DisplayBoard(show, Row, Col); } }

源码的载入使用(编译器VS2019)
在这里插入图片描述

总结

排雷游戏的游戏设计逻辑和上一篇三子棋类似,大家可以参考着看。排雷游戏涉及的知识二维数组、函数、循环。从创建雷区,到布雷、排雷,整个过程比较清晰,具体的函数实现也有比较巧妙的地方,比如,初始化两个数组时,多传入一个参数set,以便将两个数组的内容初始化为不同的值。

有错误或者需要改进的地方请大家在评论区畅所欲言,感谢关注,后期还会有很多C语言的小游戏和大家见面~

最后

以上就是笨笨小土豆最近收集整理的关于【C语言扫雷游戏】【C语言扫雷游戏】的全部内容,更多相关【C语言扫雷游戏】【C语言扫雷游戏】内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部