#include <graphics.h>//图形库头文件
#include <time.h>//时间头文件
using namespace std;
const int N = 50;//正方形的边长
const int M = 10;//单边各格子数目
int win=0;
//初始化游戏
//绘图环境(窗口)
//加载图片
void InitGame();//初始化游戏
void DrawMap(int map[][M + 2], IMAGE img[]);//加载图片
int MouseMessage(int map[][M + 2]);//鼠标消息
void swap(int map[][M + 2], int x, int y);//点到0以后,翻开一片
HWND hWnd;//窗口句柄
int main()
{
InitGame();//初始化游戏
while (1)
{
if (MessageBox(hWnd, L"再玩一局吗?", L"提示", MB_YESNO) == IDNO)//再玩一局
{
break;
}
}
system("pause");
return 0;
}
void InitGame()//初始化游戏
{
initgraph(500, 500, NULL);//创建窗口
int map[M + 2][M + 2] = { 0 };
int m, n, i, j;
srand((unsigned)time(NULL));//随机种子
for (n = 0; n < M;)//埋雷,循环多少次就生成多少个雷
{
i = rand() % M + 1;//随机数的范围1-M
j = rand() % M + 1;
if (map[i][j] == 0)//埋雷
{
map[i][j] = -1;//-1代表雷
n++;//埋雷的数目,不浪费生成雷的个数
}
}
for (i = 1; i <= M; i++)//埋数字
{
for (j = 1; j <= M; j++)//遍历二维数组
{
if (map[i][j] != -1)//判断是不是雷
{
for (m = i - 1; m <= i + 1; m++)//雷的周围
{
for (n = j - 1; n <= j + 1; n++)//遍历雷周围的9个位置
{
if (map[i][j] == -1)//判断如果是雷
{
map[i][j]++;//个数加一
}
}
}
}
}
}
IMAGE img[12];//图片数组类型
loadimage(&img[0], L"0.jpg", N, N);//读取图片素材
loadimage(&img[1], L"1.jpg", N, N);
loadimage(&img[2], L"2.jpg", N, N);
loadimage(&img[3], L"3.jpg", N, N);
loadimage(&img[4], L"4.jpg", N, N);
loadimage(&img[5], L"5.jpg", N, N);
loadimage(&img[6], L"6.jpg", N, N);
loadimage(&img[7], L"7.jpg", N, N);
loadimage(&img[8], L"8.jpg", N, N);
loadimage(&img[9], L"雷.jpg", N, N);
loadimage(&img[10], L"地图.jpg", N, N);
loadimage(&img[11], L"标记.jpg", N, N);
hWnd = GetHWnd();//窗口置前
win = 0;//重置游戏
while (1)
{
DrawMap(map, img);
if (MouseMessage(map) == 9)//点到炸弹,结束游戏
{
DrawMap(map,img);
MessageBox(hWnd, L"炸弹来了", L"提示", MB_OK);
return;
}
if (win == N*M - M)//赢了
{
DrawMap(map, img);
MessageBox(hWnd, L"恭喜你", L"提示", MB_OK);
return;
}
}
}
void DrawMap(int map[][M + 2], IMAGE img[])//加载图片
{
for (int i = 1; i <= M; i++)
{
for (int j = 1; j <= M; j++)//遍历二维数组
{
if (map[i][j] >= 20)
{
putimage((i - 1)*N, (j - 1)*N, &img[11]);//标记
continue;//退出当前循环,马上进入下一次循环
}
switch (map[i][j])//判断和加载数字和雷图片
{
case 9:
putimage((i - 1)*N, (j - 1)*N, &img[9]);//雷图片
break;
case 10:
putimage((i - 1)*N, (j - 1)*N, &img[0]);
break;
case 11:
putimage((i - 1)*N, (j - 1)*N, &img[1]);
break;
case 12:
putimage((i - 1)*N, (j - 1)*N, &img[2]);
break;
case 13:
putimage((i - 1)*N, (j - 1)*N, &img[3]);
break;
case 14:
putimage((i - 1)*N, (j - 1)*N, &img[4]);
break;
case 15:
putimage((i - 1)*N, (j - 1)*N, &img[5]);
break;
case 16:
putimage((i - 1)*N, (j - 1)*N, &img[6]);
break;
case 17:
putimage((i - 1)*N, (j - 1)*N, &img[7]);
break;
case 18:
putimage((i - 1)*N, (j - 1)*N, &img[8]);
break;
default:
putimage((i - 1)*N, (j - 1)*N, &img[10]);//封面图片
break;
}
}
}
}
int MouseMessage(int map[][M + 2])//鼠标消息
{
MOUSEMSG m;//鼠标消息结构体
while (1)
{
m = GetMouseMsg();//获取一个鼠标消息
switch (m.uMsg)//获取当前鼠标消息
{
case WM_LBUTTONDOWN://鼠标左键点击,m.x m.y 50-100 /50 =1
if (map[m.x / N + 1][m.y / N + 1] > 9)//鼠标点左边转换成数组坐标,表示已经翻开
{
continue;
}
else if (map[m.x / N + 1][m.y / N + 1] == 0)//翻开为0的情况
{
swap(map, m.x / N + 1, m.y / N + 1);
}
else
{
map[m.x / N + 1][m.y / N + 1] += 10;//翻开为数字的情况
win++;//翻开计数
}
return map[m.x / N + 1][m.y / N + 1];
break;
case WM_RBUTTONDOWN://鼠标右键点击,标记和取消标记
if (map[m.x / N + 1][m.y / N + 1] < 9)
{
map[m.x / N + 1][m.y / N + 1] += 30;//标记
}
else if (map[m.x / N + 1][m.y / N + 1] > 20)
{
map[m.x / N + 1][m.y / N + 1] -= 30;//取消标记
}
else//已经翻开情况
{
continue;
}
return 0;
break;
}
}
}
void swap(int map[][M + 2], int x, int y)//点到0以后,翻开一片
{
map[x][y] = 10;
win++;//翻开计数
int i, j;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)//点击点周围的点
{
if (i >= 1 && i <= M&&j >= 1 && j <= M)//是否越界
{
if (map[i][j] <= 9)//是否翻开,没有翻开
{
if (map[i][j] == 0)//周围的数为0
{
swap(map, i, j);//调用自己函数
}
else
{
map[i][j] += 10;//不为0,翻开
win++;//翻开计数
}
}
}
}
}
}
扫雷
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...