当点击到雷时所有雷出现
以及点击到雷时判断失败的两个函数无法同时出现。点击到雷后, 出现了所有雷,但判断失败的窗口不会出现,使用鼠标在雷的图片上滑动后才能让提示窗口出现,想问问原因,以及如何解决
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define size 50
#define N 7
static int lei = 0;
int cishu = 1;
double start, finish;
int flag;//判断输赢的标志
int row, col;
int map[N][N];
//定义图片数组保存图片
IMAGE img[12];
//找到九宫格内雷的数目
void game()
{
for (int i = 0;i < N;i++) //问题5:不初始化,导致无法复位,使得绘制时发生错误
{
for (int j = 0;j < N;j++)
{
map[i][j] = 0;
}
}
srand((unsigned)time(NULL));//利用time函数得到不同的随机数
for (int i = 0;i < N;i++)
{
row = rand() % N;//限制得到的随机数在map数组下标内
col = rand() % N;
if (map[row][col] == 9)//防止得到的随机数相同导致雷的的数目减少
i--;
map[row][col] = 9;
//printf("%d %d\n", row, col);
};
int m, n;
for (int i = 0;i < N;i++)
{
for (int j = 0;j < N;j++)
{
if (map[i][j] == 0)
{
for (m = i - 1;m <= i + 1;m++) //对九宫格外圈进行遍历
{
for (n = j - 1;n <= j + 1;n++)
{
if ((n >= 0 && n <= N - 1 && m >= 0 && m <= N - 1) && map[m][n] == 9)//防止越界
map[i][j] += 1;
}
}
}
}
}
//加载图片
for (int i = 0;i < 12;i++)
{
char file[50] = "";
sprintf(file, "./image/%d.jpg", i);
loadimage(&img[i], file, size, size);
}
//加密格子为鼠标点击做铺垫
for (int i = 0;i < N;i++)//加密错误 ,导致越界,使得空格消失
{
for (int j = 0;j < N;j++)
{
map[i][j] += 20;
}
}
}
//打开空格
void unfold(int row, int col) {
int m, n;
if (map[row][col] == 0)
{
for (m = row - 1;m <= row + 1;m++) //对九宫格外圈进行遍历
{
for (n = col - 1;n <= col + 1;n++)
{
if ((n >= 0 && n < N && m >= 0 && m < N) && (map[m][n] == 20 ||
map[m][n] != 29) && map[m][n] >= 8) {
map[m][n] -= 20;
flag++;
unfold(m, n);//利用递归展开除了雷的格子
}
}
}
}
}
//绘制界面
void GameDraw()
{
cleardevice();//清屏处理
for (int i = 0;i < N;i++)
{
for (int j = 0;j < N;j++)
{
if (map[i][j] == 9)
{
putimage(j * size, i * size, &img[9]);//绘制雷
}
else if (map[i][j] >= 0 && map[i][j] <= 8)
{
putimage(j * size, i * size, &img[map[i][j]]);//绘制数字
}
else if (map[i][j] >= 20 && map[i][j] <= 29)
{
putimage(j * size, i * size, &img[10]);//进行遮挡
}
else if (map[i][j] > 34) {
putimage(j * size, i * size, &img[11]);//右击添加旗帜执行
}
}
}
}
//鼠标操作
int MouseControl()
{
if (MouseHit())//判断有无鼠标消息
{
MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y坐标。
int row = msg.y / size;
int col = msg.x / size;
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (map[row][col] > 8) {
map[row][col] -= 20;
flag++;
unfold(row, col);
//Sleep(1000);
}
break;
case WM_RBUTTONDOWN:map[row][col] += 20;
break;
}
return map[row][col];
}
}
int MouseControl2()
{
if (MouseHit())//判断有无鼠标消息
{
MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y坐标。
int row = msg.y / size;
int col = msg.x / size;
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (map[row][col] > 8) {
map[row][col] -= 20;
flag++;
unfold(row, col);
//Sleep(1000);
}
break;
case WM_RBUTTONDOWN:map[row][col] += 20;
break;
}
return map[row][col];
}
}
//让雷出现
void Bomb()
{
if (MouseControl() == 9)
{
for (int i = 0;i < N;i++)
{
for (int j = 0;j < N;j++)
{
if (map[i][j] == 29) {
map[i][j] -= 20;
lei++;
}
}
}
}
}
//判断输赢
void judge()
{
static int newtime = 0, oldtime = 0, time = 0;
int x = 0;
if (MouseControl() == 9) {
printf("%d", lei);
if (lei == N-1)//当所有雷都出现时判断失败
{
lei = 0;
int isok = MessageBox(GetHWnd(), "You lose,next game?", "提示", MB_OKCANCEL);
if (IDOK == isok)
{
game();//重新进行炸弹的摆放
}
else
{
exit(123);
}
}
}
for (int i = 0;i < N;i++)
{
for (int j = 0;j < N;j++)//多次标记旗帜会导致判断胜负出现问题,所以更换了胜利判断条件
{
if (map[i][j] == 49) {
x++;
}
}
}
if (x == N)
{
finish = clock();
printf("%d", (int)(finish - start) / CLOCKS_PER_SEC);
int isok = MessageBox(GetHWnd(), "You win", "提示", MB_OKCANCEL);
//
if (IDOK == isok)
{
game();
flag = 0;//复位,开始第二局
}
else
{
exit(123);
}
x = 0;
}
}
int main()
{
cishu = 1;
initgraph(N * size, N * size, SHOWCONSOLE);
game();
//错误3:将扫描放入循环中导致重复加密使得旗帜图片覆盖无法消除
BeginBatchDraw();//解决卡顿利用缓冲区
start = clock();
while (1)
{
//show(map);
GameDraw();
FlushBatchDraw();
cishu++;
Bomb();
judge();
}
EndBatchDraw();
getchar();
return 0;
}