2011-08-05 30 views
0

私は小さなショットガンのアプリを書いたのですが、AI(Geniusと呼ばれる)、ユーザー、またはその両方が撮影されたときにゲームを停止する必要があるコードセクションは、 。私は間違って何をしていますか?私は、いくつかは渡されていて、他のものはそうではない、別のブール値を持つリターンをたくさん追加することによって、自分のコードを1つ上に複雑にするように感じる。ループ中に終了する

今すぐテストすると、ユーザーの移動(文字列移動と呼ばれる)が「f」に等しい場合でもループは終了します。他のシナリオでは、ループを終了することはできません。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 


     public static void Main(string[] args) 
     { 
      Start("r"); 
     } 

     public static string Start(string move) 
     { 

      Console.Write("Welcome to the Shotgun App\nEnter s for single player and m for multiplayer: "); 
      string gameType = Console.ReadLine(); 

      if (gameType == "s") 
      { 

       Console.Write("Single Player Controls:\n r = reload\n s = shield\n f = fire\nYou start with 1 ammo\nReady to play?"); 
       Console.ReadLine(); 

       int ammo = 1; 
       int geniusAmmo = 1; 
       string geniusMove = ""; 
       bool done = false; 
       while (!done) 
       { 
        Console.Write("\nEnter your move: "); 
        move = Console.ReadLine(); 


        switch (move) 
        { 
         case "r": 
          Console.Write("\nYou have reloaded, press enter for Genius\n"); 

          ammo++; 
          Console.Write("Your ammo is " + ammo); 

          Console.ReadLine(); 
          Genius(geniusMove, move, geniusAmmo, done); 


          break; 
         case "s": 
          Console.Write("\nYou have shielded, press enter for Genius\n"); 

          Console.Write("Your ammo is " + ammo); 

          Console.ReadLine(); 
          Genius(geniusMove, move, geniusAmmo, done); 


          break; 
         case "f": 
          if (ammo != 0) 
          { 
           Console.Write("\nYou have fired, press enter for Genius\n"); 

           ammo--; 
           Console.Write("Your ammo is " + ammo); 

           Console.ReadLine(); 

           Genius(geniusMove, move, geniusAmmo, done); 

          } 
          else 
          { 
           Console.Write("You don't have enough ammo, try again"); 
           done = false; 
          } 
          break; 
         default: 
          Console.Write("\nInvalid move, try again\n"); 
          done = false; 
          break; 
        } 
        done = EndLoop(move, geniusMove, done); 
        Console.ReadLine(); 

       } 
       return move; 
      } 
      else 
      { 
       return move; 
      } 
     } 

     public static string Genius(string geniusMove, string move, int geniusAmmo, bool done) 
     { 
      Random RandomNumber = new Random(); 
      int x = RandomNumber.Next(0,3); 
      if (x == 0) 
      { 
       geniusMove = "f"; 
       geniusAmmo--; 
       Console.Write("Genius had decided to fire.\nGenius ammo is " + geniusAmmo + "\n"); 
       TestMoves(move, geniusMove); 
      } 
      else if (x == 1) 
      { 
       geniusMove = "r"; 
       geniusAmmo++; 
       Console.Write("Genius had decided to reload.\nGenius ammo is " + geniusAmmo + "\n"); 
       TestMoves(move, geniusMove); 
      } 
      else if (x == 2) 
      { 
       geniusMove = "s"; 
       Console.Write("Genius had decided to shield.\nGenius ammo is " + geniusAmmo + "\n"); 
       TestMoves(move, geniusMove); 
      } 

      return geniusMove; 

     } 


     public static void TestMoves(string move, string geniusMove) 
     { 
      bool done = false; 
      if (move == "s" && geniusMove == "f") 
      { 
       Console.Write("Nice shield, no one has died yet"); 


      } 
      else if (move == "f" && geniusMove == "f") 
      { 
       Console.Write("You both died! Good game!"); 


      } 
      else if (move == "r" && geniusMove == "f") 
      { 
       Console.Write("No shield!? You died! Good game!"); 


      } 
      else if (move == "f" && geniusMove == "s") 
      { 
       Console.Write("Genius is too good, no one has died yet"); 


      } 
      else if (move == "f" && geniusMove != "s") 
      { 
       Console.Write("Genius let his guard down! Good game!"); 


      } 
      else if (move != "f" && geniusMove != "f") 
      { 
       Console.Write("Keep playing it safe."); 


      } 
      else 
      { 


      } 

     } 

     static bool EndLoop(string move, string geniusMove, bool done) 
     { 
      done = false; 
      if (move == "s" && geniusMove == "f") 
      { 
       return false; 
      } 
      else if (move == "f" && geniusMove == "f") 
      { 
       return true; 
      } 
      else if (move != "s" && geniusMove == "f") 
      { 
       return true; 
      } 
      else if (move == "f" && geniusMove == "s") 
      { 
       return false; 
      } 
      else if (move == "f" && geniusMove != "s") 
      { 
       return true; 
      } 
      else if (move != "f" && geniusMove != "f") 
      { 
       return false; 
      } 
      else 
      { 
       return done; 
      } 
     } 
    } 
} 
+0

あなたはtrueを返しEndLoopので概説した条件の1ヒットした場合これが終了する必要があります。デバッガでそのルーチンを実行するとどうなりますか? –

+0

whileループは、ユーザー入力が "f"だった場合にデバッグ時にのみ終了します –

答えて

2

あなたはスイッチのケースでいくつかの実行枝の両方で、いくつかの異なる場所でdoneを設定し、EndLoopのを呼び出すときにしています。 EndLoopからの割り当ては以前の割り当てを上書きするので、The One Place You Setをdoneに設定します。

EndLoopをEndLoopに設定すると、EndLoopを呼び出した直後にハードコードされた値がすぐに返されるため、TestMovesでEndLoopを設定しても効果はありません。

私は、デバッガでEndLoopを実行することをお勧めします。何が起こっているのかを視覚化することが容易になる場合は、代わりにEndLoopの入力パラメータをコンソールに出力することを検討してください。

+0

私はコードを編集しましたが、同じことがまだ機能しています。私は1トンのリターンを取った。 –

+0

プログラムフローを視覚化するためにConsole.WriteLine()を追加しましたか、またはデバッガでステップバイステップを実行して、期待した動作が見られない理由を理解しましたか? –

1

geniusMoveは、Geniusメソッドの呼び出し結果を格納していないため、常に空の文字列になります。

geniusMove変数に結果を保存したり、参照することにより、それを渡すのどちらか

public static string Genius(ref string geniusMove, string move, int geniusAmmo, bool done) 

または

geniusMove = Genius(geniusMove, move, geniusAmmo, done); 
関連する問題