试图在没有SDL(PERCED)崩溃C的情况下运行过程运行



好吧,所以我对编程非常陌生,所以我认为作为我的第一个真正的编程挑战,我会做一个国际象棋程序来教授空缺。在我的游戏循环中,我拥有所需的一切,除了在游戏循环中的某个时候我想停止从用户那里输入,并在绘制屏幕并继续循环之前等待处理该信息。但是,当我这样做时,如果用户等待很长时间输入(〜8秒)(顺便说一句,现在在控制台输入中输入的输入,那将稍后更改),那么游戏就会崩溃,我得到了标准的Ubuntu"您是否要强迫退出或等待"消息"。我想阻止此消息弹出,但我不知道如何。

这是我的代码btw:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "SDL2/SDL.h"
void drawBoard(SDL_Renderer *renderer)
{}
void drawPieces(char fen[100])
{}
int processEvents(SDL_Window *window)
{}

我省略了这些功能,因为长度且不重要(如果您想让我稍后再放置它们)

void next_move(char firstmove[10], char response[10])
{
    int cont = 0;
    char move[6];
    printf("%sn>>", firstmove);
    while(cont == 0)
    {
        scanf("%s", move);
        if(strcmp(move, response) == 0)
            cont = 1;
        else
            printf("Incorrect.n%sn>>", firstmove);
    }
}
void caro_kann()
{
    printf("YOU HAVE SELECTED The Caro Kann Opening ( main line )n");
    next_move("1. e4", "c6");
    next_move("2. d4", "d5");
    next_move("3. Nc6", "dxe4");
    next_move("4. Nxe4", "Bf5");
    next_move("5. Ng3", "Bg6");
    next_move("6. h4", "h6");
    next_move("7. Nf3", "Nd7");
    printf("successn");
}
int main()
{
    int done = 0;
    SDL_Event event;
    SDL_Window *window;
    SDL_Renderer *renderer;
    //initialize everything
    SDL_Init(SDL_INIT_VIDEO);
    //setting up the window
    window = SDL_CreateWindow("PlatoChess ALPHA 1.0", 
                           SDL_WINDOWPOS_UNDEFINED,
                           SDL_WINDOWPOS_UNDEFINED,
                           800,
                           800,
                           0);
    //Setting up the renderer
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    //setting up the program loop
    while(!done)
    {
        if(processEvents(window) == 1)
            done = 1;
        caro_kann();
        drawBoard(renderer);
        SDL_Delay(10); //to cap the FPS
    }
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();
    return 0;
}

任何帮助将不胜感激!

首先,"您想强制戒烟或等待"不是崩溃)。这意味着您的程序没有处理事件(这是真的 - 您正在阻止scanf,而无需做任何事情)。即使您在等待某些事情发生,您仍然应该处理窗口事件并在必要时进行更新显示,否则用户无法关闭您的程序,如果它被另一个程序掩盖(或只是最小化),其显示将是完全错误的。

基本上,您不应阻止等待输入。您的选择是(完全基于我的意见来通过上升难度进行排序):

  • 更改输入方案(例如,使用SDL为您提供的键盘事件而不是stdin

  • 当输入可用时,从stdin读取非阻止读取

  • 使用单独的输入线程(需要同步)

最新更新