2016-06-21 15 views
0

Okay, ich bin ziemlich neu in der Programmierung, also dachte ich, als meine erste echte Programmieraufgabe würde ich ein Schachprogramm machen, um Öffnungen zu lehren. In meiner Game-Game-Schleife habe ich alles, was ich brauche, außer an einem Punkt in der Spielschleife, den ich für die Eingabe des Benutzers anhalten möchte, und warte darauf, diese Informationen zu verarbeiten, bevor ich den Bildschirm zeichne und die Schleife fortsetze. Aber wenn ich das tue, wenn der Benutzer zu lange auf die Eingabe wartet (~ 8 Sekunden) (zwischendurch die Eingabe in der Konsoleneingabe, das wird sich später ändern), dann stürzt das Spiel ab und ich bekomme das Standard-Ubuntu "Willst du? erzwinge oder warte "Nachricht. Ich möchte diese Nachricht davon abhalten, aufzutauchen, aber ich weiß nicht wie.Versuch, einen Prozess ohne SDL (percieved) Absturz laufen zu lassen C

Hier ist mein Code 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) 
{} 

ich diese Funktionen aus verlasse, weil die lange und nicht super wichtig sind (wenn Sie wollen, dass ich sie später nach oben gestellt werden)

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; 
} 

Jede Hilfe wäre sehr willkommen!

Antwort

0

Als erstes, "wollen Sie aufhören oder warten" ist kein Absturz. Alles was es bedeutet ist, dass Ihr Programm keine Ereignisse verarbeitet (was wahr ist - Sie sind in einer blockierenden scanf und nichts tun). Selbst wenn Sie darauf warten, dass etwas passiert, sollten Sie Fensterereignisse trotzdem verarbeiten und die Anzeige ggf. aktualisieren. Andernfalls kann der Benutzer Ihr Programm nicht schließen und wenn es von einem anderen Programm überschattet wird (oder nur minimiert), wird seine Anzeige komplett falsch sein .

Grundsätzlich sollten Sie nicht auf Eingaben warten. Ihre Optionen sind (geordnet nach Schwierigkeit aufsteigend, basiert vollständig auf meiner Meinung nach):

  • Änderung Eingabeschema (zB Verwendung Tastaturereignisse, die SDL gibt Ihnen statt stdin)

  • führen nonblocking von stdin lesen, wenn Eingang verfügbar

  • Verwendung separater Eingang Gewinde (erfordert sync)