玄冥教傻祖 2024-11-22 09:53 采纳率: 53.3%
浏览 19

为什么这五子棋代码在vs上能正常运行,但在devc++上背景全变成黑的了


#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<graphics.h>

int num = -1;  //-1表示白色棋子,1表示黑色棋子
int piece[15][15];
void draw_line()  //画棋盘线
{
    setlinecolor(BLACK);
    for (int x = 15; x <= 435; x += 30) //先画列 后画行,第一个for循环用x表示列,第二个for循环用y表示行,这样后面的坐标都能对应上
        line(x, 15, x, 435);
    for (int y = 15; y <= 435; y += 30)
        line(15, y, 435, y);

}

void draw_point()   //画五个点
{
    setfillcolor(BLACK);
    fillcircle(30 * 3 + 15, 30 * 3 + 15, 5);
    fillcircle(450 - (30 * 3 + 15), 30 * 3 + 15, 5);
    fillcircle(30 * 3 + 15, 450 - (30 * 3 + 15), 5);
    fillcircle(450 - (30 * 3 + 15), 450 - (30 * 3 + 15), 5);
    fillcircle(30 * 7 + 15, 30 * 7 + 15, 5);
}
void initpiece()
{                                                     //把所有空棋盘位置都初始化为0
    for (int i = 0; i < 15; i++)
        for (int j = 0; j < 15; j++)
            piece[i][j]=0;
}

int change_piece(int x, int y)
{
    if (piece[x][y] != 0)  //不等于0说明该地方已有棋子,返回0则在该地方不能再下棋
        return 0;
    else
        piece[x][y] = num;
    return 1;                     
}

void draw_piece(int m, int n)            //m和n代表第几个棋子的坐标
{

    if (num == -1)
        setfillcolor(WHITE);
    else if (num == 1)
        setfillcolor(BLACK);
    int x, y;                          //这里的x和y代表第几个棋子,即第几行第几列的棋子,从0,0开始   
    x = m / 30;
    y = n/ 30;
    if (change_piece(x, y) == 0)
        return;
    fillcircle(m-(m%30)+15, n-(n%30)+15, 13);
    num = num * -1;            
}

int check_five_piece(int x,int y)       //判断五子连成
{

    //if (x < 2 || y < 2 || x>12 || y>12)
        //return 0;
    if (piece[x][y] == piece[x - 1][y] && piece[x][y] == piece[x - 2][y] && piece[x][y] == piece[x + 1][y] && piece[x][y] == piece[x + 2][y])
        return 1;
    if (piece[x][y] == piece[x][y - 1] && piece[x][y] == piece[x][y - 2] && piece[x][y] == piece[x][y + 1] && piece[x][y] == piece[x][y+2])
        return 1;
    if (piece[x][y] == piece[x - 1][y - 1] && piece[x][y] == piece[x - 2][y - 2] && piece[x][y] == piece[x + 1][y + 1] && piece[x][y] == piece[x + 2][y + 2])
        return 1;
    if (piece[x][y] == piece[x - 1][y + 1] && piece[x][y] == piece[x - 2][y + 2] && piece[x][y] == piece[x + 1][y - 1] && piece[x][y] == piece[x + 2][y - 2])
        return 1;
    return 0;
}

int    check_heqi()
{
    for (int i = 0; i < 15; i++)
    {
        for (int j = 0; j < 15; j++)
        {
            if (piece[i][j] == 0)
                return 0;            //不是和棋
        }
    }
    return 2;//和棋
}

int check_over()
{
    for(int i = 0; i < 15; i++)
    {
        for (int j = 0; j < 15; j++)        //两个循环把棋盘遍历一遍,如果等于0,则继续循环,如果不等于0,则调用函数检查一下是否五子连成
        {
            if (piece[i][j] == 0)
                continue;
            if (check_five_piece(i, j) == 1)
                return 1;
        }
    }
    return check_heqi();
}

 int main()
{
    initgraph(450,450);

    IMAGE bcg;
    loadimage(&bcg, _T("background.jpg"),450,450);
    putimage(0, 0,&bcg);

    draw_line();
    draw_point();
    int game_over;
    //获取鼠标信息
    MOUSEMSG m;
    while (1)
    {
        m = GetMouseMsg();
        if (m.uMsg == WM_LBUTTONDOWN)
        {
            draw_piece(m.x, m.y);   //主函数已定义,即点击鼠标后获取该点的x和y坐标,并画棋子
        }
        game_over = check_over();
        if (game_over == 1)
        {
            settextcolor(RED);
            settextstyle(84, 40, _T("隶书"));
            setbkmode(TRANSPARENT);
            outtextxy(65, 200, _T("游戏结束"));
            system("pause");
            return 0;
        }
        else if(game_over == 2)
        {
            settextcolor(BLUE);
            settextstyle(84, 40, _T("隶书"));
            setbkmode(TRANSPARENT);
            outtextxy(65, 200, _T("该局和棋"));
            system("pause");
            return 0;
        }
    }
    return 0;
}



![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/757d1a5a5d064775b274f2ab4cbd0bcf.jpeg "#left")

img

  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-11-22 18:04
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 可能的原因分析
      • 图形库初始化差异
        • 在不同的开发环境(VS和Dev - C++)中,图形库(这里使用的是<graphics.h>)的初始化可能存在差异。虽然代码在VS上能正常运行,但Dev - C++可能在处理图形初始化和背景绘制时有不同的默认设置或者行为。
        • 例如,在Dev - C++中,可能对于加载背景图片(loadimage函数)的处理方式与VS不同。在这段代码中,通过loadimage(&bcg, _T("background.jpg"),450,450);加载背景图片,Dev - C++可能在处理图片的颜色模式或者显示模式上与VS有区别,导致背景显示为黑色。
      • 库版本差异
        • 两个开发环境可能使用了不同版本的图形库。如果<graphics.h>库在不同版本间有变化,可能会影响到背景的显示效果。例如,某个版本可能对图像的透明度或者颜色映射有不同的处理方式。
      • 编译选项差异
        • 编译选项也可能导致这种差异。VS和Dev - C++有各自不同的默认编译选项。例如,与图形显示相关的一些编译选项可能会影响到最终的显示效果。在Dev - C++中,可能存在某些编译选项没有正确设置,从而影响了背景的正确显示。
    2. 解决建议
      • 检查图形库设置
        • 在Dev - C++中,仔细检查<graphics.h>库的相关设置。确保库的安装正确并且配置与在VS中的使用方式尽可能一致。
      • 更新或调整库版本
        • 尝试更新<graphics.h>库到最新版本,看是否能够解决问题。如果不行,可以考虑寻找与VS中使用的库版本相匹配的版本并在Dev - C++中使用。
      • 检查编译选项
        • 对比VS和Dev - C++的编译选项,尤其是与图形显示、颜色处理等相关的选项。尝试调整Dev - C++中的编译选项,使其与在VS中的设置相似。例如,与颜色深度、图像格式支持等相关的编译选项。
    评论

报告相同问题?

问题事件

  • 创建了问题 11月22日