走自己的路,玩自己的扫雷

介绍

Windows10更新后,附件里的以前喜闻乐见的小游戏,比如蜘蛛纸牌,三维弹球,扫雷都消失了。这些游戏我记得从windows XP都开始存在了,b( ̄▽ ̄)d 好怀念!正好这次Windows开发课程有个左右,我和另外一个小组成员准备一起做个游戏,做什么好呢,来吧,做个扫雷玩吧。嘣(๑•̀ㅂ•́)و✧!

界面设计

由于使用的是Win32中的工具库,除了界面菜单部分,其他的界面都需要自己重绘,并且控制生命周期.所以程序结构就比较复杂,最后的成品如下:
扫雷界面

数字显示设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//画数字
void draw_num(HDC hdc, int x, int y, int num)
{
int i;
static HPEN hWhitePen = CreatePen(PS_SOLID, 3, RGB(255, 255, 255));
SelectObject(hdc, hWhitePen);
for (i = 0; i < 7; i++)
{
MoveToEx(hdc, x + sp[i][0], y + sp[i][1], NULL);
LineTo(hdc, x + ep[i][0], y + ep[i][1]);
}
static HPEN hRedPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
SelectObject(hdc, hRedPen);

for (i = 0; i < 7; i++)
{
if (light[num][i])
{
MoveToEx(hdc, x + sp[i][0], y + sp[i][1], NULL);
LineTo(hdc, x + ep[i][0], y + ep[i][1]);
}
}
}

地图生成算法设计

随机生成点,并且将周围的对地雷周围的格子权值加1.

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
//在整个雷盘布置num个雷,而且保证(px,py)点不能被放上雷
void setmine(int num, int px, int py)
{
int i;
int tx, ty;
srand((unsigned int)time(NULL));
for (i = 0; i < num; i++)
{
tx = rand() %COLUMNS;//随机数挑选纵坐标
ty = rand() % ROWS;//随机数挑选横坐标
if (ma[tx][ty] == 10 || (tx == px && ty == py))//如果这一点已经被布置过雷,或者是(px,py)点,那么就跳过,重新挑点
{
i--;
continue;
}
ma[tx][ty] = 10;
//将四周不是雷的点的数字加一
if (ty>0&&ma[tx][ty - 1] < 9)
{
ma[tx][ty - 1]++;
}
if (ty + 1<ROWS && ma[tx][ty + 1] < 9)
{
ma[tx][ty + 1]++;
}
if (tx + 1<COLUMNS && ma[tx + 1][ty] < 9)
{
ma[tx + 1][ty]++;
}
if (tx>0&&ma[tx - 1][ty] < 9)
{
ma[tx - 1][ty]++;
}
if (tx +1 <COLUMNS && ty+ 1 <ROWS && ma[tx + 1][ty + 1] < 9)
{
ma[tx + 1][ty + 1]++;
}
if (tx >0&& ty>0&&ma[tx - 1][ty - 1] < 9)
{
ma[tx - 1][ty - 1]++;
}
if (tx+1<COLUMNS && ty>0 && ma[tx + 1][ty - 1] < 9)
{
ma[tx + 1][ty - 1]++;
}
if (tx>0 && ty+1<ROWS && ma[tx - 1][ty + 1] < 9)
{
ma[tx - 1][ty + 1]++;
}
}
}

源代码

我的Github
https://github.com/chengsluo/Mine-Sweeper