using System.Collections.Generic;
using System.Threading.Tasks;
public enum CardSuit { Diamonds, Hearts, Spades, Clubs };
public enum CardRank { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Knave, Queen, King };
bool MakeDecision(PlayerState playerState);
public CardSuit Suit { get; private set; }
public CardRank Rank { get; private set; }
public int Point { get; private set; }
public PlayingCard(CardRank rank, CardSuit suit)
private static string GetSuitString(CardSuit cardSuit)
string suitDisplay = " ";
if (cardSuit == CardSuit.Hearts) suitDisplay = "\u2665";
else if (cardSuit == CardSuit.Diamonds) suitDisplay = "\u2666";
else if (cardSuit == CardSuit.Spades) suitDisplay = "\u2660";
else if (cardSuit == CardSuit.Clubs) suitDisplay = "\u2663";
private static string GetRankString(CardRank cardRank)
string rankDisplay = " ";
public override string ToString()
return "[" + GetRankString(Rank) + GetSuitString(Suit) + "]";
private List<CardSuit> _suits = new List<CardSuit>
private List<CardRank> _ranks = new List<CardRank>
private List<PlayingCard> _cards = new List<PlayingCard>(52);
foreach (CardSuit suit in _suits)
foreach (CardRank rank in _ranks)
_cards.Add(new PlayingCard(rank, suit));
public PlayingCard TakeCard()
var card = _cards.Last();
Random rnd = new Random();
for (int i = _cards.Count - 1; i > 0; i--)
public class SimpleComputer : IPlayer
private static readonly List<string> _names = new List<string>
"Имя 1", "Name X", "Test name"
if (string.IsNullOrEmpty(_name))
var randomIndex = new Random().Next(3);
_name = _names[randomIndex];
public bool MakeDecision(PlayerState playerState)
if (playerState.MyCards.Count == 0) return true;
sumPoint += playerState.MyCards.Sum(p => p.Point);
return ((21 - sumPoint > playerState.MyCards.Average(p => p.Point)));
public class ConsolePlayer : IPlayer
if (string.IsNullOrEmpty(_name))
_name = Console.ReadLine();
public bool MakeDecision(PlayerState playerState)
string decision = Console.ReadLine();
return (decision == "Yes");
private List<PlayingCard> _myCards = new List<PlayingCard>();
private List<PlayingCard> _otherCards = new List<PlayingCard>();
public List<PlayingCard> MyCards
public List<PlayingCard> OtherCards
get { return _otherCards; }
public override string ToString()
return string.Join(", ", (MyCards.Select(c => c.ToString())));
private Random _random = new Random();
public IPlayer GamePlayer1 { get; private set; }
public IPlayer GamePlayer2 { get; private set; }
public Game(IPlayer player1, IPlayer player2)
private void Greeting(IPlayer GamePlayer1, IPlayer GamePlayer2)
Console.WriteLine("What's your name player_1?");
Console.WriteLine("Hello, {0}", GamePlayer1.Name);
Console.WriteLine("What's your name player_2?");
Console.WriteLine("Hello, {0}", GamePlayer2.Name);
Console.WriteLine("Let's start!");
private void ShowWhoPlaysFirst(IPlayer firstPlayer, IPlayer secondPlayer)
Console.WriteLine("The right of the first move is determined randomly.");
Console.WriteLine("{0}, you go first.", firstPlayer.Name);
Console.WriteLine("The second player is {0}.", secondPlayer.Name);
private bool DefinePlayerByOutParameter(out IPlayer firstPlayer, out IPlayer secondPlayer)
firstPlayer = GamePlayer1;
secondPlayer = GamePlayer2;
var firstIsFirst = _random.Next(2) == 0;
firstPlayer = GamePlayer2;
secondPlayer = GamePlayer1;
private PlayerState CreatePlayerState(List<PlayingCard> currentPlayerCards, List<PlayingCard> otherPlayerCards)
PlayerState playerState = new PlayerState();
playerState.MyCards.AddRange(_player1Cards);
playerState.OtherCards.AddRange(_player2Cards);
private void ShowGameCards(bool firstIsFirst)
ShowPlayerCards(GamePlayer1, _player1Cards);
ShowPlayerCards(GamePlayer2, _player2Cards);
ShowPlayerCards(GamePlayer2, _player2Cards);
ShowPlayerCards(GamePlayer1, _player1Cards);
private void ShowPlayerCards(IPlayer player, List<PlayingCard> playerCards )
Console.Write(player.Name + ": ");
foreach (var pc in playerCards)
Console.Write(string.Join(" ", pc.ToString()));
private void OfferToContinueGame(IPlayer firstPlayer, IPlayer secondPlayer)
var newPack = new PackOfCards();
var playerState = new PlayerState();
Console.WriteLine("State:" + playerState);
_player1Cards.Add(newPack.TakeCard());
Console.WriteLine("{0}, do you want to take a card? ", firstPlayer.Name);
Console.WriteLine(firstPlayer.MakeDecision(playerState));
playerState.MyCards.Add(newPack.TakeCard());
Console.Write("{0}, your cards are: ", firstPlayer.Name);
foreach (var mc in playerState.MyCards)
Console.Write(mc.ToString() + " ");
Console.Write("Other cards are:");
foreach (var mc in playerState.OtherCards)
Console.Write(mc.ToString() + " ");
Console.WriteLine("State:" + playerState.OtherCards);
_player2Cards.Add(newPack.TakeCard());
Console.WriteLine("{0}, do you want to take a card? ", secondPlayer.Name);
Console.WriteLine(secondPlayer.MakeDecision(playerState));
playerState.OtherCards.Add(newPack.TakeCard());
Console.Write("{0}, your cards are: ", secondPlayer.Name);
foreach (var mc in playerState.OtherCards)
Console.Write(mc.ToString() + " ");
Console.Write("Other cards are:");
foreach (var mc in playerState.MyCards)
Console.Write(mc.ToString() + " ");
IPlayer firstPlayer = null;
IPlayer secondPlayer = null;
DefinePlayerByOutParameter(out firstPlayer, out secondPlayer);
ShowWhoPlaysFirst(firstPlayer, secondPlayer);
OfferToContinueGame(firstPlayer, secondPlayer);
private List<PlayingCard> _player1Cards = new List<PlayingCard>();
private List<PlayingCard> _player2Cards = new List<PlayingCard>();
public static void Main(string[] args)
var player1 = new ConsolePlayer();
var player2 = new SimpleComputer();
var testGame = new Game(player1, player2);