fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5.  
  6. public static class ErrorMessages
  7. {
  8. public const string ThatHandIsNotImplemented = "その手は実装されていません。";
  9. }
  10.  
  11. public enum Hand
  12. {
  13. Rock = 0, // グー
  14. Scissors, // チョキ
  15. Paper // パー
  16. }
  17.  
  18. public static class HandExtensions
  19. {
  20. public static string ToDisplayString(this Hand hand)
  21. {
  22. switch (hand)
  23. {
  24. case Hand.Rock:
  25. return "グー";
  26. case Hand.Scissors:
  27. return "チョキ";
  28. case Hand.Paper:
  29. return "パー";
  30. default:
  31. throw new ArgumentOutOfRangeException(nameof(hand),ErrorMessages.ThatHandIsNotImplemented);
  32. }
  33. }
  34. }
  35.  
  36. public class Player
  37. {
  38. public Player(string name, Hand hand)
  39. {
  40. this.Name = name;
  41. this.Hand = Hand;
  42. }
  43.  
  44. public string Name { get; } = string.Empty;
  45.  
  46. public Hand Hand { get; set; } = Hand.Rock;
  47.  
  48. public override string ToString()
  49. {
  50. return this.Name + ": " + this.Hand.ToDisplayString();
  51. }
  52. }
  53.  
  54. public class Program
  55. {
  56. public static void Main()
  57. {
  58. try
  59. {
  60. uint number = Program.GetPlayerNumber();
  61.  
  62. IEnumerable<Player> players = Program.MakePlayers(number);
  63.  
  64. Program.Janken(players.ToList());
  65. }
  66. catch (Exception ex)
  67. {
  68. Console.WriteLine("ゲームを継続できません。");
  69. Console.WriteLine(ex.Message);
  70. }
  71.  
  72. Console.WriteLine("Enterキーを押すと終了します。");
  73. Console.ReadLine();
  74. }
  75.  
  76. private static uint GetPlayerNumber()
  77. {
  78. uint number = 0;
  79.  
  80. while (number == 0)
  81. {
  82. Console.WriteLine("プレイヤーの人数を入力してください。: ");
  83.  
  84. string input = Console.ReadLine();
  85. if (Regex.IsMatch(input, @"^[\d]+$"))
  86. {
  87. number = uint.Parse(input);
  88. }
  89. }
  90.  
  91. return number;
  92. }
  93.  
  94. private static IEnumerable<Player> MakePlayers(uint number)
  95. {
  96. for (uint i = 0; i < number; i++)
  97. {
  98. // 最初はグー(初期値的な意味で)
  99. yield return new Player($"プレイヤー{i + 1}", Hand.Rock);
  100. }
  101. }
  102.  
  103. private static void RemoveLosers(List<Player> players, Hand winnersHand)
  104. {
  105. players.RemoveAll(player => player.Hand != winnersHand);
  106. }
  107.  
  108. private static void Janken(List<Player> players)
  109. {
  110. var random = new Random();
  111.  
  112. uint round = 1;
  113.  
  114. int playersCounter = players.Count();
  115.  
  116. // 最後の独りになるまで戦え……
  117. while (playersCounter != 1)
  118. {
  119. Console.WriteLine();
  120. Console.WriteLine($"第{round}回戦");
  121. ++round;
  122.  
  123. foreach (var player in players)
  124. {
  125. player.Hand = (Hand)random.Next(Enum.GetNames(typeof(Hand)).Length);
  126. }
  127.  
  128. int rockPlayersCounter = 0;
  129. int scissorsPlayersCounter = 0;
  130. int paperPlayersCounter = 0;
  131.  
  132. foreach (var player in players)
  133. {
  134. Console.WriteLine(player.ToString());
  135.  
  136. switch (player.Hand)
  137. {
  138. case Hand.Rock:
  139. ++rockPlayersCounter;
  140. break;
  141. case Hand.Scissors:
  142. ++scissorsPlayersCounter;
  143. break;
  144. case Hand.Paper:
  145. ++paperPlayersCounter;
  146. break;
  147. default:
  148. throw new ArgumentOutOfRangeException(nameof(player.Hand), ErrorMessages.ThatHandIsNotImplemented);
  149. }
  150. }
  151.  
  152. if ((rockPlayersCounter == playersCounter) ||
  153. (scissorsPlayersCounter == playersCounter) ||
  154. (paperPlayersCounter == playersCounter))
  155. {
  156. // あいこ
  157. }
  158. else
  159. {
  160. if (rockPlayersCounter == 0)
  161. {
  162. // グーがいなければ、チョキのプレイヤーだけ生き残り
  163. RemoveLosers(players, Hand.Scissors);
  164. }
  165. else if (scissorsPlayersCounter == 0)
  166. {
  167. // チョキがいなければ、パーのプレイヤーだけ生き残り
  168. RemoveLosers(players, Hand.Paper);
  169. }
  170. else if (paperPlayersCounter == 0)
  171. {
  172. // パーがいなければ、グーのプレイヤーだけ生き残り
  173. RemoveLosers(players, Hand.Rock);
  174. }
  175. else
  176. {
  177. // あいこ
  178. }
  179.  
  180. playersCounter = players.Count();
  181. }
  182. }
  183.  
  184. Console.WriteLine();
  185. Console.WriteLine("勝者: " + players.First().Name);
  186. }
  187. }
Success #stdin #stdout 0.03s 134720KB
stdin
5
stdout
プレイヤーの人数を入力してください。: 

第1回戦
プレイヤー1: パー
プレイヤー2: パー
プレイヤー3: パー
プレイヤー4: チョキ
プレイヤー5: グー

第2回戦
プレイヤー1: パー
プレイヤー2: グー
プレイヤー3: パー
プレイヤー4: パー
プレイヤー5: パー

第3回戦
プレイヤー1: チョキ
プレイヤー3: パー
プレイヤー4: パー
プレイヤー5: パー

勝者: プレイヤー1
Enterキーを押すと終了します。