2017-02-03 3 views
0

2つの関数は、大文字小文字のステートメントから約200行です(そしてそれらは正しく動作します)ので、私はそれが何をしているのかを説明します。私は現在、チェッカーに似たゲームを作成しています。最初の関数がC言語で実行される場合にのみ、2番目の関数をキャンセルする方法はありますか?

機能1:ユーザーが有効な移動を入力したかどうかを確認します。彼らがしなかった場合、それは "無効な移動"を印刷します。

機能2:ボード上で移動したピースを更新し、新しい更新ボードを表示します。

main関数ではwhileループを実行したので、無効な移動を入力した場合は、再度入力を求められます。それはしますが、ボードはまだ更新されます。たとえば、ピース3が占有している場所にピース1を移動することを選択した場合、ボードは更新します。ピース1のスポットは、「無効な移動」を印刷しても空になります。私は機能1が何かを印刷した場合、機能2を止める方法を知らない。 ここに私がmain関数に入れたものがあります。

char pieceToMove, emptySpot; 
    int moveNumber = 0; 
    int piecesOnBoard = 15; 

    while (piecesOnBoard >= 1, ++moveNumber) { 
     //prompting user input 
     printf("%d. Enter your move:", moveNumber); 
     scanf(" %c %c", &pieceToMove, &emptySpot); 

     checkMoves(pieceToMove, emptySpot, all, the, pieces, ect); 
     updateBoard(all, the, pieces); 
    } 
+0

'チェックし、ユーザの入力であれば、有効な移動。彼らがしなかった場合、それは "無効な移動"を印刷します。この関数はあまりにも多くのことをしようとしています。単元責任原則についてお読みください。 –

答えて

2

機能1リターン・ブール値(1または0 - それぞれ、trueまたはfalse、Cで)と同等のものを持って、それが失敗した場合、関数1が成功したかどうかに依存します。関数2を実行するかどうかを決定する前に、その値をチェックします(またはしない)。

これを行う1つの方法は、boolean_tという便利なタイプを定義し、ヘッダファイルにkTruekFalseの値を定義することです。これらは、ボンネットの下にint値ですが、これは簡単にコードを読み取るようになります:あなたの実装ファイルで

boolean_t function_one(...); /* "..." are the arguments this function takes */ 

あなたのヘッダファイルで
typedef enum boolean { 
    kFalse = 0, 
    kTrue 
} boolean_t; 

、あなたの最初の関数function_one()boolean_tを返すことを宣言すると書いて、作業が成功するか失敗するかによって、kTrueまたはkFalseのいずれかを返します。

実装ファイルで再び0

、それはfunction_one()の戻り値がkTrueた場合にのみ実行されるようにfunction_two()への呼び出しを記述します。

if (function_one(...) == kTrue) { 
    function_two(); 
} 
else { 
    fprintf(stderr, "Error: Something went wrong...\n"); 
} 
+0

機能1を無効にしていますか? – Anymee

+0

編集内容を追加して、何をするかを提案します。 –

+0

'#include 'だけではないのはなぜですか? –

関連する問題