c - 尝试让进程在没有 SDL(感知到的)崩溃的情况下运行 C

标签 c input console sdl chess

好吧,我对编程还很陌生,所以我想作为我的第一个真正的编程挑战,我会制作一个国际象棋程序来教授开局。在我的游戏循环中,我拥有所需的一切,除了在游戏循环中的某个时刻我想停止以获取用户的输入,并等待处理该信息,然后再绘制屏幕并继续循环。然而,当我这样做时,如果用户等待很长时间才能输入(~8秒)(顺便说一句,现在控制台输入中的输入,稍后会改变),那么游戏就会崩溃,我会得到标准的ubuntu“你想吗?”强制退出或等待”消息。我想阻止此消息弹出,但我不知道如何做。

顺便说一句,这是我的代码:

#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("%s\n>>", firstmove);
    while(cont == 0)
    {
        scanf("%s", move);
        if(strcmp(move, response) == 0)
            cont = 1;
        else
            printf("Incorrect.\n%s\n>>", 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("success\n");
}

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)

  • 执行nonblocking当输入可用时从标准输入读取

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

关于c - 尝试让进程在没有 SDL(感知到的)崩溃的情况下运行 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37936466/

相关文章:

c - FILE* 和文件描述符读/写性能

ios - iPhone 应用程序的 C 代码链接错误

c - 一个包含很多功能的程序如何存储在一个文本段中?

php - 在带有搜索字段的查询中包含 <SELECT>

javascript - Phantomjs page.onConsoleMessage 不记录警告

command-line - 如果 "error"字符串出现在一行命令集中的控制台输出字符串中,如何启动进程和停止进程

c - 文本到二维字符数组

jquery - 使用输入框防止文本选择突出显示

用于构建多模块maven项目的windows脚本

javascript - 如何将 "multiple"属性添加到动态生成的输入文件?