服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 用C语言实现扫雷小程序

用C语言实现扫雷小程序

2022-12-20 16:32一零 柒 C/C++

这篇文章主要为大家详细介绍了用C语言实现扫雷小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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
#ifndef __GAME_H__
#define __GAME__H__
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
 
#define row 12
#define col 12
#define COUNT 10//棋盘中雷的总数
extern char show_mine[row][col];//展示数组
extern char real_mine[row][col];//布雷数组
 
void muen();//菜单函数
void init_mine();//初始化数组函数
void set_mine();//布雷函数
int count_mine();//统计周围雷的个数
void print_player();//打印玩家棋盘
void print_mine();//打印设计者棋盘 
int  sweep_mine();//扫雷函数
void safe_mine();//避免第一次被雷炸死的函数
void open_mine(int x, int y);//展开函数
int count_show_mine(); ///判断玩家棋盘剩余未知区域的个数
 
#endif  //__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
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
#include"lei.h"
 
void game()
{
 
    int ret = 0;
    init_mine();//初始化玩家棋盘和设计者棋盘
    set_mine();//给设计者棋盘布雷
    print_mine();//打印设计者棋盘(可不打印)
    printf("\n");
    print_player();//打印玩家棋盘
 
    safe_mine();//避免第一次被炸死
 
    if (count_show_mine() == COUNT)//一步就赢的情况
    {
        print_mine();
        printf("玩家赢!\n\n");
        return;
    }print_player();打印玩家棋盘
 
    while (1)//循环扫雷
    {
        int ret = sweep_mine();//扫雷,踩到雷返回1,没有踩到雷返回0
        if (count_show_mine() == COUNT)//若玩家棋盘的'*'个数为雷数时,扫雷完成,游戏胜利
        {
            print_mine();//打印设计者棋盘
            printf("玩家赢!\n\n");
 
            break;
        }
        if (ret)//判断是否踩到雷
        {
            printf("被雷炸死\n");
            print_mine();//打印设计者雷阵查看雷的分布
            break;
        }print_player();//打印玩家棋盘
    }
}
 
 
int main()
{
    srand((unsigned int)time(NULL));//产生随机数生成器
    int input = 0;
    muen();//菜单
    do
    {
        scanf_s("%d", &input);
        switch (input)
        {
        case 1:game();
            break;
        case 0:exit(1);//退出游戏
            break;
        default:
            printf("输入错误,重新输入\n");
            break;
        }
        muen();
        printf("contiue?\n");
    } while (1);//循环玩游戏
    system("pause");
    return 0;
}

接下来再依次实现主函数里面的各个函数块:

?
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#include"lei.h"
 
char show_mine[row][col] = { 0 };
char real_mine[row][col] = { 0 };
 
 
void muen()
{
    printf("*******************************\n");
    printf("*****1.play       0.exit*******\n");
    printf("*******************************\n");
}
 
 
void init_mine()//初始化两个棋盘
{
    int i = 0;
    int j = 0;
    for (int i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            show_mine[i][j] = '*';
            real_mine[i][j] = '0';
        }
    }
}
 
 
void print_player()//打印玩家棋盘
{
    int i = 0;
    int j = 0;
    printf("0  ");
    for (i = 1; i <row - 1; i++)
    {
        printf("%d ", i);//打印横标(0--10)
    }
    printf("\n");
    for (i = 1; i <row - 2; i++)//打印竖标(1--10)
    {
        printf("%d  ", i);
        for (j = 1; j < col - 1; j++)
        {
            printf("%c ", show_mine[i][j]);//玩家棋盘数组
        }
        printf("\n");
    }
    printf("10 ");//开始打印最后一行
    for (i = 1; i < row - 1; i++)
    {
        printf("%c ", show_mine[10][i]);
    }
    printf("\n");
}
 
 
void print_mine()//打印设计者棋盘
{
    int i = 0;
    int j = 0;
    printf("0  ");
    for (i = 1; i <row - 1; i++)
    {
        printf("%d ", i);//打印横标(0--10)
    }
    printf("\n");
    for (i = 1; i <row - 2; i++)//打印竖标(1--10)
    {
        printf("%d  ", i);
        for (j = 1; j < col - 1; j++)
        {
            printf("%c ", real_mine[i][j]);
        }
        printf("\n");
    }
    printf("10 ");//开始打印最后一行
    for (i = 1; i < row - 1; i++)
    {
        printf("%c ", real_mine[10][i]);
    }
    printf("\n");
}
 
void set_mine()//给设计者棋盘布雷
{
    int x = 0;
    int y = 0;
    int count = COUNT;//雷总数
    while (count)//雷布完后跳出循环
    {
        int x = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
        int y = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
        if (real_mine[x][y] == '0')//找不是雷的地方布雷
        {
            real_mine[x][y] = '1';
            count--;
        }
    }
}
 
 
int count_mine(int x, int y)//检测周围8个区域雷的个数
{
    int count = 0;
    if (real_mine[x - 1][y - 1] == '1')
        count++;
    if (real_mine[x - 1][y] == '1')
        count++;
    if (real_mine[x - 1][y + 1] == '1')
        count++;
    if (real_mine[x][y - 1] == '1')
        count++;
    if (real_mine[x][y + 1] == '1')
        count++;
    if (real_mine[x + 1][y - 1] == '1')
        count++;
    if (real_mine[x + 1][y] == '1')
        count++;
    if (real_mine[x + 1][y + 1] == '1')
        count++;
    return count;
}
 
void safe_mine()//避免第一次炸死
{
    int x = 0;
    int y = 0;
    char ch = 0;
    int count = 0;
    int ret = 1;
    printf("输入坐标扫雷\n");
    while (1)
    {
        scanf_s("%d%d", &x, &y);//只能输入1到10,输入错误重新输入
        if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输入坐标是否有误
        {
            if (real_mine[x][y] == '1')//第一次踩到雷后补救
            {
                real_mine[x][y] = '0';
                char ch = count_mine(x, y);
                show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值
                open_mine(x, y);
                while (ret)//在其余有空的地方设置一个雷
                {
                    int x = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
                    int y = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
                    if (real_mine[x][y] == '0')//找不是雷的地方布雷
                    {
                        real_mine[x][y] = '1';
                        ret--;
                        break;
                    }
                }break;//跳出此函数  
            }
            if (real_mine[x][y] == '0')
            {
                char ch = count_mine(x, y);
                show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值
                open_mine(x, y);
                break;
            }
        }
        else//坐标错误
        {
            printf("输入错误重新输入\n");
        }
    }
}
 
 
int sweep_mine()//扫雷函数,踩到雷返回1,没有踩到雷返回0
{
    int x = 0;
    int y = 0;
    int count = 0;
    printf("输入坐标扫雷\n");
    scanf_s("%d%d", &x, &y);//只能输入1到10
    if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输入坐标是否有误,输入错误重新输入
    {
        if (real_mine[x][y] == '0')//没踩到雷
        {
            char ch = count_mine(x, y);
            show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值
            open_mine(x, y);
            if (count_show_mine() == COUNT)//判断剩余未知区域的个数,个数为雷数时玩家赢
            {
                print_mine();
                printf("玩家赢!\n\n");
                return 0;
            }
        }
        else if (real_mine[x][y] == '1')//踩到雷
        {
            return 1;
        }
 
    }
    else
    {
        printf("输入错误重新输入\n");
    }
    return 0;//没踩到雷
}
 
void open_mine(int x, int y)//坐标周围展开函数
{
    if (real_mine[x - 1][y - 1] == '0')
    {
        show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x - 1][y] == '0')
    {
        show_mine[x - 1][y] = count_mine(x - 1, y) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x - 1][y + 1] == '0')
    {
        show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x][y - 1] == '0')
    {
        show_mine[x][y - 1] = count_mine(x, y - 1) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x][y + 1] == '0')
    {
        show_mine[x][y + 1] = count_mine(x, y + 1) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x + 1][y - 1] == '0')
    {
        show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x + 1][y] == '0')
    {
        show_mine[x + 1][y] = count_mine(x + 1, y) + '0';//显示该坐标周围雷数
    }
    if (real_mine[x + 1][y + 1] == '0')
    {
        show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';//显示该坐标周围雷数
    }
}
 
 
int count_show_mine()//判断剩余未知区域的个数,个数为雷数时玩家赢
{
    int count = 0;
    int i = 0;
    int j = 0;
    for (i = 1; i <= row - 2; i++)
    {
        for (j = 1; j <= col - 2; j++)
        {
            if (show_mine[i][j] == '*')
            {
                count++;
            }
        }
 
    }
    return count;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/xing2388117/article/details/79934821

延伸 · 阅读

精彩推荐