using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public static class ErrorMessages
{
public const string ThatHandIsNotImplemented = "その手は実装されていません。";
}
public enum Hand
{
Rock = 0, // グー
Scissors, // チョキ
Paper // パー
}
public static class HandExtensions
{
public static string ToDisplayString(this Hand hand)
{
switch (hand)
{
case Hand.Rock:
return "グー";
case Hand.Scissors:
return "チョキ";
case Hand.Paper:
return "パー";
default:
throw new ArgumentOutOfRangeException(nameof(hand),ErrorMessages.ThatHandIsNotImplemented);
}
}
}
public class Player
{
public Player(string name, Hand hand)
{
this.Name = name;
this.Hand = Hand;
}
public string Name { get; } = string.Empty;
public Hand Hand { get; set; } = Hand.Rock;
public override string ToString()
{
return this.Name + ": " + this.Hand.ToDisplayString();
}
}
public class Program
{
public static void Main()
{
try
{
uint number = Program.GetPlayerNumber();
IEnumerable<Player> players = Program.MakePlayers(number);
Program.Janken(players.ToList());
}
catch (Exception ex)
{
Console.WriteLine("ゲームを継続できません。");
Console.WriteLine(ex.Message);
}
Console.WriteLine("Enterキーを押すと終了します。");
Console.ReadLine();
}
private static uint GetPlayerNumber()
{
uint number = 0;
while (number == 0)
{
Console.WriteLine("プレイヤーの人数を入力してください。: ");
string input = Console.ReadLine();
if (Regex.IsMatch(input, @"^[\d]+$"))
{
number = uint.Parse(input);
}
}
return number;
}
private static IEnumerable<Player> MakePlayers(uint number)
{
for (uint i = 0; i < number; i++)
{
// 最初はグー(初期値的な意味で)
yield return new Player($"プレイヤー{i + 1}", Hand.Rock);
}
}
private static void RemoveLosers(List<Player> players, Hand winnersHand)
{
players.RemoveAll(player => player.Hand != winnersHand);
}
private static void Janken(List<Player> players)
{
var random = new Random();
uint round = 1;
int playersCounter = players.Count();
// 最後の独りになるまで戦え……
while (playersCounter != 1)
{
Console.WriteLine();
Console.WriteLine($"第{round}回戦");
++round;
foreach (var player in players)
{
player.Hand = (Hand)random.Next(Enum.GetNames(typeof(Hand)).Length);
}
int rockPlayersCounter = 0;
int scissorsPlayersCounter = 0;
int paperPlayersCounter = 0;
foreach (var player in players)
{
Console.WriteLine(player.ToString());
switch (player.Hand)
{
case Hand.Rock:
++rockPlayersCounter;
break;
case Hand.Scissors:
++scissorsPlayersCounter;
break;
case Hand.Paper:
++paperPlayersCounter;
break;
default:
throw new ArgumentOutOfRangeException(nameof(player.Hand), ErrorMessages.ThatHandIsNotImplemented);
}
}
if ((rockPlayersCounter == playersCounter) ||
(scissorsPlayersCounter == playersCounter) ||
(paperPlayersCounter == playersCounter))
{
// あいこ
}
else
{
if (rockPlayersCounter == 0)
{
// グーがいなければ、チョキのプレイヤーだけ生き残り
RemoveLosers(players, Hand.Scissors);
}
else if (scissorsPlayersCounter == 0)
{
// チョキがいなければ、パーのプレイヤーだけ生き残り
RemoveLosers(players, Hand.Paper);
}
else if (paperPlayersCounter == 0)
{
// パーがいなければ、グーのプレイヤーだけ生き残り
RemoveLosers(players, Hand.Rock);
}
else
{
// あいこ
}
playersCounter = players.Count();
}
}
Console.WriteLine();
Console.WriteLine("勝者: " + players.First().Name);
}
}