2017-07-20 19 views
-1

我正在C#做一個熱土豆遊戲。在代碼中,我試圖處理Game()方法中的異常,它會提示你將馬鈴薯傳遞給某人(通過他們的玩家號碼),這會阻止你輸入自己的玩家號碼(試圖將它傳遞給自己) 唯一的一點是,我有麻煩試圖處理該異常:不確定如何處理在熱土豆遊戲C中的異常#

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

namespace HotPotatoe 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      Console.Clear(); 
      Console.Write("How many players are there? (up to 4): "); 
      string PlayerCount = Console.ReadLine(); 
      string PlayerOne = null; 
      string PlayerTwo = null; 
      string PlayerThree = null; 
      string PlayerFour = null; 
      if (PlayerCount == "2") 
      { 
       Console.Write("Enter player 1's name: "); 
       PlayerOne = Console.ReadLine(); 
       Console.Write("Enter player 2's name: "); 
       PlayerTwo = Console.ReadLine(); 
       Random ran = new Random(); 
       int WhoStarts = ran.Next(1, 2); 
       Game(PlayerOne, PlayerTwo, PlayerThree, PlayerFour, WhoStarts); 
      } 
      else if (PlayerCount == "3") 
      { 
       Console.Write("Enter player 1's name: "); 
       PlayerOne = Console.ReadLine(); 
       Console.Write("Enter player 2's name: "); 
       PlayerTwo = Console.ReadLine(); 
       Console.Write("Enter player 3's name: "); 
       PlayerThree = Console.ReadLine(); 
       Random ran = new Random(); 
       int WhoStarts = ran.Next(1, 3); 
       Game(PlayerOne, PlayerTwo, PlayerThree, PlayerFour, WhoStarts); 
      } 
      else if (PlayerCount == "4") 
      { 
       Console.Write("Enter player 1's name: "); 
       PlayerOne = Console.ReadLine(); 
       Console.Write("Enter player 2's name: "); 
       PlayerTwo = Console.ReadLine(); 
       Console.Write("Enter player 3's name: "); 
       PlayerThree = Console.ReadLine(); 
       Console.Write("Enter player 4's name: "); 
       PlayerFour = Console.ReadLine(); 
       Random ran = new Random(); 
       int WhoStarts = ran.Next(1, 4); 

       Game(PlayerOne, 
        PlayerTwo, 
        PlayerThree, 
        PlayerFour, 
        WhoStarts); 
      } 
      else 
      { 
       Console.WriteLine("Not valid!"); 
       Console.ReadKey(); 
       Main(); 
      } 
     } 

     private static void Game 
      (string player1, 
      string player2, 
      string player3, 
      string player4, 
      int whoStarts)  
     { 
      Player Player1 = new Player(); 
      Player Player2 = new Player(); 
      Player Player3 = new Player(); 
      Player Player4 = new Player(); 
      Player1.Name = player1;   
      Player2.Name = player2; 
      Player3.Name = player3; 
      Player4.Name = player4; 
      Player1.Number = 1; 
      Player2.Number = 2; 
      Player3.Number = 3; 
      Player4.Number = 4; 
      Player1.IsOut = false; 
      Player2.IsOut = false; 
      if(Player3.Name == null) 
      { 
       Player3.IsOut = true; 
      } 
      else 
      { 
       Player3.IsOut = false; 
      } 
      if (Player4.Name == null) 
      { 
       Player4.IsOut = true; 
      } 
      else 
      { 
       Player3.IsOut = false; 
      } 
      switch (whoStarts) 
      { 
       case 1: 
        Player1.HasPotatoe = true; 
        break; 
       case 2: 
        Player2.HasPotatoe = true; 
        break; 
       case 3: 
        Player3.HasPotatoe = true; 
        break; 
       default:  
        Player4.HasPotatoe = true; 
        break; 
      } 
      List<Player> PlayingList = new List<Player> 
      { 
       Player1, 
       Player2 
      }; 
      if (Player3.IsOut == false) 
      { 
       PlayingList.Add(Player3); 
      } 
      if (Player4.IsOut == false) 
      { 
       PlayingList.Add(Player4); 
      } 
      Random rand = new Random(); 
      int NumOfRounds = rand.Next(1, 10); 
      do 
      { 
       foreach (Player p in PlayingList) 
       { 
        if (p.HasPotatoe == true) 
        { 
         Console.Write("Player {0} has the potatoe! Who do you want to pass it to? (by number): ", p.Number); 
         string input = Console.ReadLine(); 
         if (input == "1") 
         { 
          PlayingList[0].HasPotatoe = true; 
          NumOfRounds--; 
         } 
         else if (input == "2") 
         { 
          PlayingList[1].HasPotatoe = true; 
          NumOfRounds--; 
         } 
         else if (input == "3") 
         { 
          if (Player3.IsOut == true) 
          { 
           Console.WriteLine("That person isn't playing! Choose another player!"); 
           Console.ReadKey(); 
          } 
          else 
          { 
           PlayingList[2].HasPotatoe = true; 
           NumOfRounds--; 
          } 
         } 
         else if (input == "4") 
         { 
          if (Player4.IsOut == true) 
          { 
           Console.WriteLine("That person isn't playing! Choose another player!"); 
           Console.ReadKey(); 
          } 
          else 
          { 
           PlayingList[3].HasPotatoe = true; 
           NumOfRounds--; 
          } 
         } 
         else if(input == p.Number.ToString()) // this is the part i'm having trouble with................................ 
         { 
          Console.WriteLine("{0}", p.Number.ToString()); 
          Console.WriteLine("You can't pass it to yourself! -_- Choose someone else..." + p.Number.ToString()); 
          Console.ReadKey(); 
         } 
        } 
       } 
      } while (NumOfRounds != 0); 
      if(Player1.HasPotatoe == true) 
      { 
       Console.WriteLine("{0} is out! Play again!", Player1.Name); 
       Console.ReadKey(); 
       Main(); 
      } 
      else if(Player2.HasPotatoe == true) 
      { 
       Console.WriteLine("{0} is out! Play again!", Player2.Name); 
       Console.ReadKey(); 
       Main(); 
      } 
      else if (Player3.HasPotatoe == true) 
      { 
       Console.WriteLine("{0} is out! Play again!", Player3.Name); 
       Console.ReadKey(); 
       Main(); 
      } 
      else if (Player4.HasPotatoe == true) 
      { 
       Console.WriteLine("{0} is out! Play again!", Player4.Name); 
       Console.ReadKey(); 
       Main(); 
      } 
     } 
    }   

    class Player 
    { 
     public string Name { get; set; } 
     public int Number { get; set; } 
     public bool HasPotatoe { get; set; } 
     public bool IsOut { get; set; } 
    } 
} 

的特定部分錯誤所在:

Random rand = new Random(); 
      int NumOfRounds = rand.Next(1, 10); 
      do 
      { 
       foreach (Player p in PlayingList) 
       { 
        if (p.HasPotatoe == true) 
        { 
         Console.Write("Player {0} has the potatoe! Who do you want to pass it to? (by number): ", p.Number); 
         string input = Console.ReadLine(); 
         if (input == "1") 
         { 
          PlayingList[0].HasPotatoe = true; 
          NumOfRounds--; 
         } 
         else if (input == "2") 
         { 
          PlayingList[1].HasPotatoe = true; 
          NumOfRounds--; 
         } 
         else if (input == "3") 
         { 
          if (Player3.IsOut == true) 
          { 
           Console.WriteLine("That person isn't playing! Choose another player!"); 
           Console.ReadKey(); 
          } 
          else 
          { 
           PlayingList[2].HasPotatoe = true; 
           NumOfRounds--; 
          } 
         } 
         else if (input == "4") 
         { 
          if (Player4.IsOut == true) 
          { 
           Console.WriteLine("That person isn't playing! Choose another player!"); 
           Console.ReadKey(); 
          } 
          else 
          { 
           PlayingList[3].HasPotatoe = true; 
           NumOfRounds--; 
          } 
         } 
         else if(input == p.Number.ToString()) // this is where the problem is... 
         { 
          Console.WriteLine("{0}", p.Number.ToString()); 
          Console.WriteLine("You can't pass it to yourself! -_- Choose someone else..." + p.Number.ToString()); 
          Console.ReadKey(); 
         } 
        } 
       } 
      } while (NumOfRounds != 0); 

所以基本上我說:如果(輸入= = p.Number()。ToString())// p.Number()==玩家的號碼
然後拋出異常。但我不知道如何去做。我已經嘗試使用.ToString()方法將整數轉換爲字符串。但它似乎沒有改變任何東西。我也嘗試用Int32.Parse(輸入)方法將輸入轉換爲32位整數,但仍然沒有運氣。結果只是隨便做了一些事情。例如,如果我是第二個玩家,並且我提示將馬鈴薯傳給第二個玩家,那麼它只會向玩家2反覆播放馬鈴薯的控制檯寫信。我不知道如何做到這一點。有什麼建議麼?

+0

它不清楚你在問什麼。你在問如何拋出異常。 (一個真正的c#執行)或如何處理該異常。爲什麼你試圖解析int作爲這個 – pm100

+0

的一部分注意:你在這裏使用了很多重複的代碼,併爲播放器等固定了變量。想一想,並使用一般化的方式來簡化。如果「2」表示索引爲1,「3」表示索引爲2,那麼我相信您可以輕鬆地將其推廣。根據給定的玩家數量打印出玩家的數量等。 –

+0

這裏有太多的代碼。你需要提供一個好的[mcve]。是的,它必須**完整**。但它也必須**最少**。如在中,含有_no_代碼,這對於證明您所詢問的_specific_問題並非嚴格必要。我們不需要或不想看到程序中的所有代碼。 ... –

回答

0

拋出異常很簡單。

else if(input == p.Number.ToString()) 
    throw new Exception("You cant do that"); 

也許你的問題是創建你自己的例外,以便日後捕獲它們。做

public class BadPlayerException: Exception 
    { 
    } 

... 

throw new BadPlayerEcxeption(): 
+0

如何向控制檯添加錯誤消息?爲了讓用戶知道他正試圖把馬鈴薯傳遞給自己? –

+0

@AaronT。你不會爲此使用例外。簡單地輸出一條消息,說你不能傳遞給自己,然後重複循環? – john

+0

@AaronT。澄清:如果方法無法知道處理一組數據的正確方法,或者提供的數據將在稍後導致異常或不良行爲,則應使用異常。就你而言,你擁有所有需要的信息來處理方法中的問題。如果你真的想終止遊戲,只需在輸出你不能傳給你自己的消息之後調用'return'即可。 – john