Morisummer.. 2022-10-01 19:59 采纳率: 92.5%
浏览 90
已结题

扫雷小游戏中图片加载问题

问题描述:现在这个程序运行第一次的时候可以正常玩,接着选择游戏时会出现数字1 2 以及空白图片加载不出来,但是3以上的数字图片可以正常加载,这个bug可以解决吗

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>
using namespace std;
#define ROW 10
#define COL 10
#define IMGW 40

void showmap(int map[ROW][COL]);
void initMap(int map[ROW][COL]);
void drawmap(int map[ROW][COL], IMAGE img[]);
void mouseEvent(int map[ROW][COL]);
void openNull(int map[ROW][COL], int row, int col);
void judge(int map[ROW][COL], int row, int col);
bool isOver = false;//点到雷的标记

int main()
{
    //创建图形窗口
    initgraph(COL*IMGW, ROW*IMGW, EX_SHOWCONSOLE);
    //设置随机数种子
    srand((unsigned)time(NULL));

    //定义游戏的地图
    int map[ROW][COL] = { 0 };
    //初始化数据
    initMap(map);
    //把数据转化为对应的图形
    IMAGE img[12];//定义图片数组
    //加载图片
    for (int i = 0; i < 12; i++)
    {
        char fileName[50] = { 0 };
        sprintf_s(fileName,"./images/%d.jpg", i);
        loadimage(img + i, fileName, IMGW, IMGW);
    }
    while (true)
    {
        mouseEvent(map);
        drawmap(map, img);
        if (isOver)
        {
            int ret = MessageBox(GetHWnd(), "你踩到雷了,是否再来一把?", "Hint", MB_OKCANCEL);
            if (ret == IDOK)
            {
                initMap(map);
                showmap(map);
                isOver = false;
            }
            else if(ret==IDCANCEL)
            {
                exit(666);
            }
        }
    }
    system("pause");
    return 0;
}

void showmap(int map[ROW][COL])
{
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            printf("%2d ", map[i][k]);
        }
        printf("\n");
    }
    printf("\n");
}
void initMap(int map[ROW][COL])
{
    memset(map, 0, ROW * COL * sizeof(map));
    //给地图随机10个埋雷,-1表示
    for (int i = 0; i < 10;)
    {
        int r = rand() % ROW;//[0,10)
        int c = rand() % COL;
        if (map[r][c] == 0)
        {
            map[r][c] = -1;
            i++;             //只有设置了雷,i才会自增
        }
    }

    //让雷所在的九宫格所有的格子的数值都加一,雷除外
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            if (map[i][k] == -1)
            {
                //遍历雷所在的九宫格
                for (int r = i - 1; r <= i + 1; r++)
                {
                    for (int c = k - 1; c <= k + 1; c++)
                    {
                        //防止数组越界
                        if ((r >= 0 && r < ROW && c >= 0 && c < COL) && map[r][c] != -1)
                        {
                            map[r][c]++;
                        }
                    }
                }
            }
        }
    }

    //把所有的格子用遮罩图盖起来,给每个格子加密,比如加上20
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            map[i][k] += 20;
        }
    }
}
void drawmap(int map[ROW][COL],IMAGE img[])
{
    //把数组里面的数据,转换成对应图片,贴图贴到图形窗口上
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            //空白格子和数字
            if (map[i][k] >= 0 && map[i][k] <= 8)
            {
                putimage(k * IMGW, i * IMGW, img + map[i][k]);
            }
            else if (map[i][k] == -1)
            {
                putimage(k * IMGW, i * IMGW, img + 9);
            }
            else if (map[i][k] >= 19 && map[i][k] <= 28)
            {
                putimage(k * IMGW, i * IMGW, img + 10);
            }
        }
    }

}
void mouseEvent(int map[ROW][COL])
{
    //定义消息的结构体(鼠标消息,按键消息,字符消息)
    ExMessage msg;
    //如果有消息就返回真,并且给msg设置值
    if (peekmessage(&msg, EX_MOUSE))
    {
        //把鼠标的坐标转成数组的下标
        int r = msg.y / IMGW;
        int c = msg.x/IMGW;
        if (msg.message == WM_LBUTTONDOWN)//左键按下
        {
            if (map[r][c] >= 19 && map[r][c] <= 28)
            {
                map[r][c] -= 20;
                openNull(map, r, c);
                judge(map, r, c);
                showmap(map);
            }
        }
    }
}
void openNull(int map[ROW][COL],int row,int col)
{
    //判断当前点击的是不是空白
    if (map[row][col] == 0)
    {
        for (int i = row-1; i <=row+1; i++)
        {
            for (int k = col - 1; k <= col + 1; k++)
            {
                if (map[i][k] >= 19 && map[i][k] <= 28)
                {
                    if (i >= 0 && i < ROW && k >= 0 && k < COL)
                    {
                        map[i][k] -= 20;
                        openNull(map, i, k);//递归
                    }
                }
            }
        }
    }
}
void judge(int map[ROW][COL],int row,int col)
{
    //如果点到了雷,就gameover,点到雷所有的雷的显示出来
    if (map[row][col] == -1)
    {
        for (int i = 0; i < ROW; i++)
        {
            for (int k = 0; k < COL; k++)
            {
                if (map[i][k] == 19)
                {
                    map[i][k] -= 20;
                }
            }
        }
        isOver = true;
    }
}


img

img

img

问题2:生成的exe文件怎么一个图片都加载不出来

img


图片文件
链接:https://pan.baidu.com/s/1gQSLctqskTV4ui_aSYr8SA?pwd=cqx8
提取码:cqx8

img


找到问题的根源了,sizeof后面写map就不行,写int就可以。
可以解答下吗

  • 写回答

1条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 已结题 10月4日
      • 修改了问题 10月1日
      • 修改了问题 10月1日
      • 修改了问题 10月1日
      • 展开全部

      悬赏问题

      • ¥15 Java的运用111111111111
      • ¥15 koa2 + ts 声明文件不生效
      • ¥15 Mac系统word显示此文档已被删除或当前无法访问.
      • ¥15 Unity用代码实现Tilemap
      • ¥15 怎么求广播地址以及网络地址?
      • ¥15 想知道unity如何实现物体贴地运动
      • ¥15 从A地到B地有多条路径可以到达,现要从A地到B地运物资问题
      • ¥30 用java设计小游戏扑克牌比大小,52张牌的图片选世界篮球明星图或其它都行
      • ¥15 ATM管理员功能代码及解释
      • ¥15 EasyExcel导出下载文件响应流为空