整理一下以前学习时找到的程序。
一、游戏框架
1、游戏地图初始化
通过随机生成数组,得到固定雷个数,然后判断九宫格里 8 个位置雷的个数,得到该位置的数字,然后以特定图片代替
2、游戏流程
对应数字
作用:0 1 2 3 4 5 6 7 8 雷 加密 标记
操作:0 1 2 3 4 5 6 7 8 -1 +-20 +-30
结果:0 1 2 3 4 5 6 7 8 -1 19-28 >30
生成地图时,把所有图片代表的数字进行加密(即 +20),左键点击翻开进行解密(即 -20),这时候就需要判断点开结果;标记和取消标记同理(即在加密的结果下 ±30)
二、游戏代码及素材(链接在最后)
程序需要用到 <graphics.h>,需要安装 EasyX,下载直接安装即可。
网址:https://easyx.cn/
/*
文件名称:源.cpp
文件描述:实现扫雷游戏
编译环境:vs2017
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <graphics.h>
#pragma comment(lib,"winmm.lib")
#define ROW 10 //行数
#define COL 10 //列数
#define NUM 10 //雷的个数
#define SIZE 50 //一张图片的大小
int map[ROW+2][COL+2]; //范围扩大 //全局变量自动初始化为0
IMAGE img[12]; //0-8 雷 标记 加密
int win;
HWND hwnd;
//游戏初始化
void GameInit()
{
//初始化窗口
initgraph(ROW * 50, COL * 50); //ROW COL
//加载图片
loadimage(&img[0], L"./res/0.jpg", SIZE, SIZE);
loadimage(&img[1], L"./res/1.jpg", SIZE, SIZE);
loadimage(&img[2], L"./res/2.jpg", SIZE, SIZE);
loadimage(&img[3], L"./res/3.jpg", SIZE, SIZE);
loadimage(&img[4], L"./res/4.jpg", SIZE, SIZE);
loadimage(&img[5], L"./res/5.jpg", SIZE, SIZE);
loadimage(&img[6], L"./res/6.jpg", SIZE, SIZE);
loadimage(&img[7], L"./res/7.jpg", SIZE, SIZE);
loadimage(&img[8], L"./res/8.jpg", SIZE, SIZE); //0-8
loadimage(&img[9], L"./res/9.jpg", SIZE, SIZE); //雷
loadimage(&img[10], L"./res/10.jpg", SIZE, SIZE); //加密
loadimage(&img[11], L"./res/11.jpg", SIZE, SIZE); //标记
//声音 路径:./res/music.mp3(这是相对路径,可以改为绝对路径)
//mciSendString(L"open ./res/music.mp3 alias BGM", 0, 0, 0);
//mciSendString(L"play BGM",0, 0, 0);
//随机数种子
srand((unsigned int)time(NULL));
//初始化数组为0
for (int i = 0; i < ROW+2; i++)
{
for (int j = 0; j < COL+2; j++)
{
map[i][j] = 0;
}
}
//随机放置一些雷,-1代表雷 多少个雷
for (int i = 0; i < NUM; ) //10次
{
//rand()&50 //0-49
//rand()%10 //0-9
int r = rand() % ROW + 1; //随机得到行 //1-10
int c = rand() % COL + 1; //随机得到列 //1-10
//可能重复得不到十个
if (map[r][c] == 0) //0
{
map[r][c] = -1;
i++;
}
}
//遍历所有数组的元素//根据雷的分布 填充数组数据 辅助区
for (int i = 1; i <= ROW; i++)
{
for (int j = 1; j <= COL; j++)
{
//遍历九宫格
if (map[i][j] != -1)
{
for (int m = i - 1; m <= i + 1; m++)
{
for (int n = j - 1; n <= j + 1; n++)
{
//视频 源码 素材
if (map[m][n] == -1)
map[i][j]++;
}
}
}
}
}
//先给数组加密
for (int i = 1; i <= ROW; i++)
{
for (int j = 1; j <= COL; j++)
{
map[i][j] += 20;
}
}
win = 0; //点开一个格子 win+1 ROW*COL(格子总数)-win点开的=雷的数量
hwnd = GetHWnd();
}
//游戏的绘制
void GameDraw()
{
/*
0 1 2 3 4 5 6 7 8 -1 +-20 +-30
0 1 2 3 4 5 6 7 8 雷 加密 标记
0 1 2 3 4 5 6 7 8 -1 19-28 >30
*/
//打印数组 贴图
for (int i = 1; i <= ROW; i++)
{
for (int j = 1; j <= COL; j++)
{
//printf("%3d", map[i][j]);
if (map[i][j] >= 0 && map[i][j] <= 8) //0-8
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[map[i][j]]);
else if (map[i][j] == -1)
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[9]); //雷
else if (map[i][j] >= 19 && map[i][j] <= 28)
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[10]); //加密
else if (map[i][j] >= 30)
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[11]); //标记
}
}
}
int PlayGame() //int 返回值 判断点到雷
{
MOUSEMSG msg = { 0 };
int n;
while (1)
{
msg = GetMouseMsg(); //msg接受鼠标信息
switch (msg.uMsg)
{
case WM_LBUTTONDOWN: //左键 翻牌
n = map[msg.x / SIZE + 1][msg.y / SIZE + 1];
//19-28
if (n >= 19 && n <= 28) //翻开
{
map[msg.x / SIZE + 1][msg.y / SIZE + 1] -= 20;
win++;
}
return map[msg.x / SIZE + 1][msg.y / SIZE + 1];
break;
case WM_RBUTTONDOWN: //右键 标记
n = map[msg.x / SIZE + 1][msg.y / SIZE + 1];
if (n >= 19 && n <= 28)
{
map[msg.x / SIZE + 1][msg.y / SIZE + 1] += 30;
}
if (n >= 30)
{
map[msg.x / SIZE + 1][msg.y / SIZE + 1] -= 30;
}
return map[msg.x / SIZE + 1][msg.y / SIZE + 1];
break;
}
}
}
//主函数
int main()
{
while (1)
{
GameInit();
while (1)
{
GameDraw();
//输了
if (PlayGame() == -1)
{
GameDraw();
MessageBox(hwnd, L"你输了!", L"", MB_OK);
break;
}
//赢了
if (ROW*COL - win == NUM)
{
MessageBox(hwnd, L"太棒了!", L"", MB_OK);
break;
}
}
if (MessageBox(hwnd, L"再来一局??", L"", MB_RETRYCANCEL) == IDCANCEL)
break;
}
return 0;
}
三、游戏界面
四、百度网盘
本人用 VS 创建的文件,生成的项目很繁杂,可以看下结构,提取其中的源代码和素材即可。
链接:https://pan.baidu.com/s/1H31-gMDqArJLLf_DsSaEeA
提取码:prgf