End while while循环

问题描述:

我写了一个小型Shotgun应用程序,然而,当AI(称为Genius),用户或两者都被拍摄时,需要停止游戏的代码段,我无法工作。我究竟做错了什么?我觉得我通过增加大量不同的布尔值返回来使得我的代码过度复杂,其中一些是通过的,而另一些则不是。End while while循环

在测试中,无论用户移动(称为“字符串移动”)等于“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中列出的条件之一。当你在调试器中执行该例程时会发生什么? –

+0

只有当用户输入为“f”时,while循环才会结束 –

要设置在几个不同的地方done,无论是在开关情况下,一些执行分支,并呼吁ENDLOOP时。来自EndLoop的作业将覆盖以前的任务,因此请设置“您设置的一个地方”done

在TestMoves中使用EndLoop设置done不会产生任何影响,因为您在调用EndLoop后立即返回一个硬编码值。

我建议你在调试器中通过EndLoop。如果它使您更容易查看发生的情况,则可以考虑在控制台上输入EndLoop的输入参数,以及在最终选择的情况下输出参数。

+0

所以我编辑了我的代码,同样的东西仍在工作。我拿出了很多回报。 –

+0

您是否添加了Console.WriteLine()来帮助您可视化程序流,或者在调试器中逐步了解您为什么没有看到您期望的行为? –

geniusMove将始终为空字符串,因为您没有将调用结果存储到Genius方法。

无论结果存储在geniusMove变量或引用传递它

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

geniusMove = Genius(geniusMove, move, geniusAmmo, done);