我最近发现了winBGIm库,并且发现学习代码非常有用,因此我开始创建一些东西以进行一些练习,但是我被程序所困扰。

该程序应显示一个小球和两个接近球自身的矩形,并且玩家只需按键盘上的按钮即可上下移动球。最初,我主要编写了所有内容以使其快速运行,但是由于这太糟糕了,我将程序分为功能。

首先,即使所有的东西都在一起,getch函数似乎也不起作用,因为尽管它应该擦除kbhit函数的输入缓冲区,但它却使球根本无法移动,而仅仅kbhit函数起作用了,但是很麻烦即使您停止按某个键,球仍继续上升。我在另一个纯文本程序中使用了相同的过程,但效果很好,所以我不知道问题出在哪里。

第二个也是最重要的问题是,在将程序拆分为功能后,它变成了静态的,因为将使图形移动的主循环在第一次迭代的末尾停止。仅当我在循环结束时删除cleardevice函数并且在initwindow函数中禁用了双重缓冲后,它才能重新开始工作,但是我无法理解这些东西之间的关系。

最后,当我设置新的背景色时,如果它不是0(黑色),则窗口将保持完全黑色。

我希望有一个人可以帮助我。

最好的问候,贾科莫。

#include <graphics.h>
#include <time.h>
#include <stdio.h>

int rettangoli(int b);
void bird(int x_default, int y_default);

void bird();

int main() {
    int a=640;
    int b=480;
    int x_default=150;
    int y_default=400;
    int verifica=0;
    srand(time(NULL));
    initwindow(a, b, "BGI", 0, 0, true, true);
    setbkcolor(0);
    while(1) {
        bird(x_default, y_default);
        verifica=rettangoli(b);
        if(verifica==1) {
            outtextxy(0, 0, "HAI PERSO");
            outtextxy(0,20, "PREMERE UN TASTO PER CONTINUARE");
            break;
        }
        delay(50);
        while(kbhit()) {
            getch();
        }
        swapbuffers();
        cleardevice();
    }
    delay(350);
    getch();
    closegraph();
    return 0;
}

void bird(int x_default, int y_default) {
    static int x_pos=x_default;
    static int y_pos=y_default;
    if(kbhit()) {
        if(y_pos-16>0)
            y_pos=y_pos-5;
        circle(x_pos, y_pos, 16);
        setfillstyle(SOLID_FILL, YELLOW);
        floodfill(x_pos, y_pos, 15);
    }
    else {
        while(y_pos<400)
            y_pos=y_pos+15;
        circle(x_pos, y_pos, 16);
        setfillstyle(SOLID_FILL, YELLOW);
        floodfill(x_pos, y_pos, 15);
    }
    return;
}

int rettangoli(int b) {
    static int x_rett=615;
    int verifica=0;
    int contatore;
    int altezza;
    if(x_rett==615)
        altezza=rand()%(b-60)+1;
    rectangle(x_rett, 0, x_rett+25, altezza);
    rectangle(x_rett, altezza+60, x_rett+25, 480);
    setfillstyle(SOLID_FILL, GREEN);
    floodfill(x_rett+1, 1, 15);
    floodfill(x_rett+1, 479, 15);
    for(contatore=0;contatore<altezza && x_rett>100;contatore++) {
        if(getpixel(x_rett-1, contatore)!=getbkcolor())
            verifica=1;
    }
    for(contatore=altezza+60;contatore<b && x_rett>100;contatore++) {
        if(getpixel(x_rett-1, contatore)!=getbkcolor())
            verifica=1;
    }
    for(contatore=0;contatore<15;contatore++) {
        if(getpixel(contatore, altezza)!=getbkcolor())
            verifica=1;
    }
    for(contatore=0;contatore<15;contatore++) {
        if(getpixel(contatore, altezza+60)!=getbkcolor())
            verifica=1;
    }
    x_rett=x_rett-5;
    printf("%i", x_rett);
    return verifica;
}

最佳答案

没关系,我自己解决了这个问题。 Windows 8 x64与Codeblocks-EP之间存在不兼容性问题,我认为winBGIm与x64系统之间存在普遍的不兼容性。

我使用Vmware Player和Windows XP x86创建了一个虚拟机,现在一切正常。

关于c - 陷入C与winBGIm编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21883762/

10-10 02:03