我是靠谱客的博主 暴躁大雁,这篇文章主要介绍C++基于EasyX实现简单扫雷游戏,现在分享给大家,希望可以做个参考。

本文实例为大家分享了C++ EasyX实现简单扫雷游戏的具体代码,供大家参考,具体内容如下

【实现代码】

复制代码
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
#include <cmath> #include <time.h> #include <easyx.h> #include <conio.h> using namespace std; #define Size 500 //定义窗口大小 #define SquareSize 50 //定义格子大小 #define BackGroundColor LIGHTGRAY //定义背景颜色 const int N = Size / SquareSize; //设置地图大小为N * N const int Num = N * N / 5; //设置总地雷数 int num = Num, all = N * N - Num; //剩余地雷数和未格子访问数 int Map[N + 10][N + 10]; //地图表示(i, j)旁边的地雷数目,等于-1表示该位置为地雷 bool vis[N + 10][N + 10]; //标记是否(i, j)被访问 bool vis_lm[N + 10][N + 10]; //标记(i, j)是否被标记为地雷 int dx[] = { 0, 0, 1, -1, 1, -1, 1, -1 }; int dy[] = { 1, -1, 0, 0, 1, -1, -1, 1 }; void Init() { initgraph(Size, Size); setbkcolor(BackGroundColor); settextcolor(YELLOW); settextstyle(25, 0, _T("宋体")); cleardevice(); } void BuildGameMap() { //构建地图 srand((unsigned int)time(NULL)); //产生随机数 for (int i = 1; i <= Num; ++i) { int x = rand() % N + 1, y = rand() % N + 1; while (Map[x][y] == -1) { x = rand() % N + 1, y = rand() % N + 1; } Map[x][y] = -1; } //计算每个格子旁边的地雷数目 for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { if (Map[i][j] == -1) continue; for (int k = 0; k < 8; ++k) { if (Map[i + dx[k]][j + dy[k]] == -1) ++Map[i][j]; } } } } void InitGameGraph() { //地图初始化 memset(Map, 0, sizeof(Map)); memset(vis, false, sizeof(vis)); memset(vis_lm, false, sizeof(vis_lm)); num = Num, all = N * N - Num; BuildGameMap(); cleardevice(); //清屏 setfillcolor(WHITE); for (int i = 0; i <= Size; i += SquareSize) { line(i, 0, i, Size); } for (int i = 0; i <= Size; i += SquareSize) { line(0, i, Size, i); } } int Translate_X(int x) { //左边变换 return x * SquareSize + SquareSize / 2; } void GameOver(bool tag) { RECT r = { 0, 0, Size - 1, Size - 1 }; if (tag) { drawtext(_T("Win"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } else { //游戏失败画出所有地雷 setfillcolor(RED); for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { if (Map[i][j] == -1) { if (vis_lm[i][j]) continue; //该地雷已被玩家标记,跳过 outtextxy(Translate_X(i - 1), Translate_X(j - 1), 'X'); //否则显示出来 } else if (vis_lm[i][j]) { //玩家标记了错误的地雷,标红 fillcircle(Translate_X(i - 1), Translate_X(j - 1), SquareSize / 2 - 10); } } } drawtext(_T("Failed"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } } void Help() { //调试函数(其实是挂) for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { if (Map[i][j] == -1) { outtextxy(Translate_X(i - 1), Translate_X(j - 1), 'X'); } } } } void StartGame() { Init(); while (true) { InitGameGraph(); //Help(); bool IF_WIN = true; while (all || num) { //胜利条件是所有非地雷格子均被访问且所有地雷均被标记 MOUSEMSG msg = GetMouseMsg(); //获取用户鼠标信息 int x = ceil(msg.x * 1.0 / SquareSize * 1.0), y = ceil(msg.y * 1.0 / SquareSize * 1.0); if (vis[x][y]) continue; //该格已被访问,跳过 if (msg.mkLButton) { //鼠标左键按下 if (Map[x][y] == -1) { //如果是地雷那么游戏结束 IF_WIN = false; break; } outtextxy(Translate_X(x - 1), Translate_X(y - 1), Map[x][y] + '0'); --all; vis[x][y] = true; } else if (msg.mkRButton) { //鼠标右键按下 if (!vis_lm[x][y]) { //如果该格子已被标记,消除标记 vis_lm[x][y] = true; if (Map[x][y] == -1) --num; solidcircle(Translate_X(x - 1), Translate_X(y - 1), SquareSize / 2 - 10); } else if (vis_lm[x][y]) { //否则标记 vis_lm[x][y] = false; if (Map[x][y] == -1) ++num; clearrectangle((x - 1) * SquareSize + 1, (y - 1) * SquareSize + 1, x * SquareSize - 1, y * SquareSize - 1); } } } GameOver(IF_WIN); int t = _getch(); } } int main() { StartGame(); return 0; }

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

最后

以上就是暴躁大雁最近收集整理的关于C++基于EasyX实现简单扫雷游戏的全部内容,更多相关C++基于EasyX实现简单扫雷游戏内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部