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)
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 DefinePlayerWhoPlaysFirst()
var firstIsFirst = _random.Next(2) == 0;
GamePlayer1 = GamePlayer2;
Console.WriteLine("The right of the first move is determined randomly.");
Console.WriteLine("{0}, you go first.", GamePlayer1.Name);
Console.WriteLine("The second player is {0}.", GamePlayer2.Name);
private PlayerState CreatePlayerState(IPlayer currentPlayer)
PlayerState playerState = new PlayerState();
if (currentPlayer == GamePlayer1)
playerState.MyCards.AddRange(_player1Cards);
playerState.OtherCards.AddRange(_player2Cards);
playerState.MyCards.AddRange(_player2Cards);
playerState.OtherCards.AddRange(_player1Cards);
private void ShowGameCards()
ShowPlayerCards(GamePlayer1, _player1Cards);
ShowPlayerCards(GamePlayer2, _player2Cards);
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(bool answer)
var newPack = new PackOfCards();
var player1State = new PlayerState();
var player2State = new PlayerState();
private bool IsContinueGame(IPlayer player, PackOfCards somePack)
Console.WriteLine("{0}, do you want to take a card? ", player.Name);
bool answer = player.MakeDecision(CreatePlayerState(player));
Console.WriteLine("The answer of " + player.Name + ": " + (answer ? "YES" : "NO"));
Console.WriteLine(player.Name + " is taking a new card");
var cards = player == GamePlayer1 ? player1Cards : player2Cards;
cards.Add(somePack.TakeCard());
DefinePlayerWhoPlaysFirst();
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);