2016-06-21 8 views
0

私はかなりプログラミングに新しいので、オープニングを教えるためにチェスプログラムを作成することになりました。私のゲームのゲームループの中には、ゲームループのある時点を除き、ユーザーからの入力を止めて、画面を描画してループを続ける前にその情報を処理するのを待っている以外、必要なものはすべてあります。しかし、私がそれをするとき、ユーザーが長い間(〜8秒)(コンソール入力の入力をbtwした後、それが変わる)を待つと、ゲームがクラッシュし、私は標準のubuntuを手に入れます。強制終了または待機 "メッセージを表示します。このメッセージはポップアップしないようにしたいと思いますが、どうしたらいいか分かりません。プロセスがSDL(衝突)クラッシュなしで実行しようとしているC

ここに私のコードは、ところでです:

#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

まず、「強制終了しますか待つか」はクラッシュではありません。つまり、あなたのプログラムはイベントを処理していないということです(これは真実です - あなたはブロックしていてscanfで何もしていません)。何かが起こるのを待っていても、ウィンドウイベントを処理し、必要に応じて表示を更新する必要があります。そうでなければ、ユーザーはプログラムを閉じることができず、別のプログラムによって隠されている場合(または最小化された場合) 。

基本的には、入力待ちをブロックしないでください。

  • 変更入力スキーム(SDLはなくstdinのあなたに与え例えば使用のキーボードイベント)

  • 時に標準入力からnonblocking読み取りを実行します。あなたのオプションは、(完全に私の意見に基づいて、難易度を昇順にソート)しています入力は、(同期が必要)

  • 使用別個の入力スレッド利用可能である

関連する問題