好吧所以我对编程很陌生,所以我认为作为我的第一个真正的编程挑战,我会制作一个国际象棋程序来教授开放。在我的游戏循环中,我拥有我需要的一切,除了在游戏循环中的某个时刻我想停止来自用户的输入,并等待在绘制屏幕并继续循环之前处理该信息。但是,当我这样做时,如果用户等待很长时间输入(约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("%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;
}
非常感谢任何帮助!
答案 0 :(得分:0)
首先,&#34;你想强行退出或等待&#34;不是崩溃。这意味着你的程序没有处理事件(这是真的 - 你在阻塞scanf
并且什么都不做)。即使您正在等待某些事情发生,您仍然应该处理窗口事件并在必要时更新显示,否则用户无法关闭您的程序,如果它被另一个程序(或者只是最小化)遮盖了它的显示将完全错误。
基本上你不应该阻止等待输入。您的选择是(按升序难度排序,完全基于我的观点):
更改输入方案(例如,使用SDL为您提供的键盘事件而不是stdin
)
在输入可用时从stdin执行nonblocking读取
使用单独的输入线程(需要同步)