记录一下自己写扫雷的历程
v1.0 图形化界面,但无法自定义难度
1.背景:
在辛辛苦苦地准备毕业设计的时候~~
.
…
女朋友突然说:“我不想学了!我要玩游戏~”。
“那你就玩会儿吧”。
她撒着娇说:“我想玩扫雷,但是我电脑上没有,啷个办嘛?”
“那要不我给你写一个?但是我还要学…”
她未等我说完就兴奋地说:“好呀,我等着,我先去玩会儿植物大战僵尸了”。
.
…
旁边传来了 ‘僵尸吃掉了你的脑子’
…
我心里暗想“得抓紧写扫雷,不然我就…”
2.准备:
- 编程环境:c/c++ 、graphics.h(图形库)、 visual studio
- 扫雷图片素材:自己找图片作为素材
- 一个好的指导老师(博客,文章,视频等)
3.开始做
3.1 环境准备
visual studio 以及c++这些就不细说了,可自行百度。
graphics.h可以通过下载easyx这个库来得到。
网址链接(很快,340kb左右):https://www.easyx.cn/downloads/
下载好后,运行exe,在你所使用的对应的vs版本下点击安装,弹出“安装成功”即可。
3.2 在visual studio 2017下新建一个win32控制台应用程序。
文件->新建->项目->visualc+±>windows桌面->win32控制台应用程序
自己起一个名字。
3.3 开始撸代码(代码都很简单,细心看就好)
仅贴核心代码,完整代码请到CSDN下载(犒劳一下打工人吧)。
当然以下部分看懂了也写得出来。
3.3.1 游戏main函数部分
主体main函数部分还是比较简单的
int main()
{
//创建一个大小为ROW*COL的框
HWND hwnd = initgraph(ROW*SIZE, COL*SIZE, NULL);
//加载图片 img为IMAGE 类型的数组
loadimage(&img[0], L"./images/0.jpg", SIZE, SIZE);
//类似的自己写....
//游戏数据初始化
GameInit();
//游戏过程
while (1)
{
//游戏渲染
GameDraw();
//获取每一次点击的结果
if (PlayGame() == -1)
{
GameDraw();
MessageBox(hwnd, L"YOU LOSE", L"QAQ", MB_OK);
break;
}
//判定是否雷全部被排完
if (ROW*COL - NUM == count)
{
GameDraw();
MessageBox(hwnd, L"YOU WIN", L"^O^", MB_OK);
break;
}
}
//关掉窗口
closegraph();
return 0;
}
3.3.2 游戏初始化部分
//初始化函数
void GameInit()
{
//随机数初始化
for (int i = 0; i < NUM; )
{
int r = rand() % ROW;
int c = rand() % COL;
if (mp[r][c] != -1)
{
mp[r][c] = -1;
++i;
}
}
//计算每一个空白格周围雷的格数 遍历实现即可,注意边界
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
....
}
}
//简单加密 (就是未翻开时候的值)
for (int i = 0; i < ROW; ++i)
for (int j = 0; j < COL; ++j)
mp[i][j] += 20;
}
3.3.3 游戏渲染
//绘制函数 打印二维数组的所有元素
/*
-1 雷
0-8 正常格子
19-28 未被翻开
>=30 标记
*/
使用到的函数 putimage(x,y,IMAGE);
例如
putimage(i*SIZE, j*SIZE, &img[9]);
3.3.4 点击事件
其中如果点到的格子周围没有雷,那么可以将周围所有的格子都翻开。
很明显这是一个递归过程(OpenZero)
int PlayGame()
{
//定义一个鼠标消息
MOUSEMSG msg = { 0 };
int r, c;
while (1)
{
msg = GetMouseMsg();
//msg.x msg.y为鼠标坐标可以此来判断
switch (msg.uMsg)
{
case WM_LBUTTONDOWN://左键翻开图片
.....
case WM_RBUTTONDOWN://右键标记图片
....
}
}
}
4.完成
最终成果:
5.后续发展
将exe发给她后…
“还不错,我先去玩了~”
暗想:“终于搞完了,得抓紧做毕设了QAQ”
我又开始看论文了
…
…
…
没过多久,她又蹦跳着过来说“我觉得…”
我 :~~~
欢迎评论与指正!