2017-07-20 7 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番プレイヤーで、2番プレイヤーにジャガイモを渡すと、プレイヤー2がポテトを何度も何度も持っていることがコンソールに書き込まれます。私はこの権利をどうやって行うのか分からない。助言がありますか?

+0

あなたは何を求めているのですか?あなたは例外をスローする方法を尋ねていますか? (実際のC#の実行)またはその例外を処理する方法なぜ – pm100

+0

の一部としてintを解析しようとしていますか?注:ここでは重複したコードを多く使用しています。プレイヤーには固定変数があります。少し考えてみましょう。 "2"が1のインデックスを意味し、 "3"が2のインデックスを意味する場合、私はあなたがそれを容易に一般化できると確信しています。与えられたプレイヤーの数に基づいてプレイヤーの数などを印刷するだけでなく、 –

+0

ここにコードが多すぎます。あなたは良い[mcve]を提供する必要があります。はい、**完全**である必要があります。しかし、それはまた**最小**でなければなりません。のように、_no_コードを含んでいますが、それはあなたが求めている_specific_問題を示すために厳密には必要ではありません。プログラム内のすべてのコードを参照する必要はありません。 ... –

答えて

0

例外をスローするのは簡単です。

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

多分、問題を後でキャッチするための独自の例外を作成することです。 Do

public class BadPlayerException: Exception 
    { 
    } 

... 

throw new BadPlayerEcxeption(): 
+0

エラーメッセージをコンソールにどのように追加しますか?自分にジャガイモを渡そうとしていることをユーザーに知らせるには? –

+0

@AaronT。これに対して例外は使用しません。あなたが自分に渡すことができないと言うメッセージを出力してループを繰り返すだけで何が問題になっていますか? – john

+0

@AaronT。明確にするには、メソッドがデータセットを処理する正しい方法を知らない場合や、提供されたデータが後で例外または悪い動作を引き起こす場合、例外を使用する必要があります。あなたの場合は、イン・メソッドで問題を処理するために必要なすべての情報があります。本当にゲームを終了したいのであれば、自分に渡すことのできないメッセージを出力してから 'return'を呼び出してください。 – john

関連する問題