2016-06-30 7 views
-2

私はC#の新機能ですが、何か挑戦的なプログラムを試してみることにしました。私はOne Row Nimのゲームをプログラムすることに決めました。このゲームでは、コンピュータが常に勝つコンピュータと対戦します。私は自分のコードを完成させ、 "すべてのコードパスが値を返すわけではない"というエラーを受けています。私はこれが何を意味するのか知っていると思うが、どうして私がそれを得ているのか分からない。(C#)メッセージパスが「すべてのコードパスが値を返すのではない」というメッセージが表示されるのはなぜですか?

using System; 
    namespace OneRowNimThing { 
    class NimSetup { 
     static string OneRowNim(int count, int turn, int prevPlayerInput) { 
     int playerInput, CPUInput, newCount; 

     if (turn == 0) { 
      if (count <= 0) { 
       return "You Lose!"; 
      } 
      else { 
       Console.WriteLine("It is now your turn."); 
       Console.WriteLine("Would you like to take 1, 2, or 3 pieces?"); 
       playerInput = Convert.ToInt32(Console.ReadLine()); 
       if (playerInput >= 4) { 
        Console.WriteLine("{0} is not a valid input.", playerInput); 
        OneRowNim(count, turn, prevPlayerInput); 
       } 
       else if (playerInput < 1) { 
        Console.WriteLine("{0} is not a valid input.", playerInput); 
        OneRowNim(count, turn, prevPlayerInput); 
       } 
       else { 
        newCount = count - playerInput; 
        Console.WriteLine("You have taken {0} pieces, there are {1} pieces remaining.", playerInput, newCount); 
        OneRowNim(newCount, 1, playerInput); 
       } 
      } 
     } 

     if (turn == 1) { 
      if (count <= 0) { 
       return "You Win!"; 
      } 
      else { 
       Console.WriteLine("It is now the computer's turn."); 
       CPUInput = 4 - prevPlayerInput; 
       newCount = count - CPUInput; 
       Console.WriteLine("The computer took {0} pieces. There are {1} pieces remaining.", CPUInput, newCount); 
       OneRowNim(newCount, 0, prevPlayerInput); 
      } 
     } 
    } 
    static void Main(string[] args) { 
     OneRowNim(12, 0, 0); 
    } 
    } 
} 

あなたはニム作品が、それは基本的にあなたが山の外に駒を取るするゲームだか、そして最後の勝利を取る誰でもわからない場合。

+2

else節の「返品」はどこですか? –

+0

多分、あなたは 'OneRowNim(newCount、1、playerInput)return 'を使う必要があります。' – Hamed

+0

'OneRowNim'の再帰呼び出しの前に' return'を追加するのが簡単ですが、 、 おもう。 –

答えて

2

メソッドシグネチャは、文字列を返すことを示します。

しかし、if-elseの場合は、フローが常に文字列を返すとは限りません。

  1. ターン== 0、> 0をカウントし、ノーリターン

  2. ターン== 1、> 0をカウントし、ノーリターン

  3. ターン> 1、ノーリターン

メソッドから何かが返されることを確認してください。

0

else構成にreturnの文がありません。あなたはそれぞれのelse節からの値を返す必要があります。

return statementは、ビューのその点から、以外の場合があるので、そのターンは、任意の32ビットの整数とすることができると考え、それが表示され、戻ってコールを行うメソッド

0

コンパイラに制御する方法の実行を終了します0または1です。これらの場合、リターンパスはありません。

0

returnステートメントにヒットしないOneRowNimメソッドのパスが存在することを「すべてのコードパスが値を返すわけではありません」という意味です。 Tommyはどのコードパスで正しいのですか?

修正点は、再帰呼び出しが返されていることを確認することです。基本的に:

if (playerInput >= 4) 
{ 
    Console.WriteLine("{0} is not a valid input.", playerInput); 
    return OneRowNim(count, turn, prevPlayerInput); 
} 

はまた、私は、これはあなたが尋ねたものではないですけど、C#の変数は、文字列をインライン解決するクールな方法があります。

Console.WriteLine($"{playerInput} is not a valid input."); 

かなりきちんと。

0

リターンを追加します。そうでなければifの部分(カウント< = 0)を両方の場所で使用します。 以下のコードを既存のコードに置き換えてください。

if (turn == 0) { 
     if (count <= 0) { 
      return "You Lose!"; 
     } 
     else { 
      Console.WriteLine("It is now your turn."); 
      Console.WriteLine("Would you like to take 1, 2, or 3 pieces?"); 
      playerInput = Convert.ToInt32(Console.ReadLine()); 
      if (playerInput >= 4) { 
       Console.WriteLine("{0} is not a valid input.", playerInput); 
       OneRowNim(count, turn, prevPlayerInput); 
      } 
      else if (playerInput < 1) { 
       Console.WriteLine("{0} is not a valid input.", playerInput); 
       OneRowNim(count, turn, prevPlayerInput); 
      } 
      else { 
       newCount = count - playerInput; 
       Console.WriteLine("You have taken {0} pieces, there are {1} pieces remaining.", playerInput, newCount); 
       OneRowNim(newCount, 1, playerInput); 
      } 
      return ""; 
     } 
    } 

    if (turn == 1) { 
     if (count <= 0) { 
      return "You Win!"; 
     } 
     else { 
      Console.WriteLine("It is now the computer's turn."); 
      CPUInput = 4 - prevPlayerInput; 
      newCount = count - CPUInput; 
      Console.WriteLine("The computer took {0} pieces. There are {1} pieces remaining.", CPUInput, newCount); 
      OneRowNim(newCount, 0, prevPlayerInput); 
     } 
     return ""; 
    } 

関連する問題