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"
private Random _random = new Random(DateTime.Now.TimeOfDay.Milliseconds);
if (string.IsNullOrEmpty(_name))
var randomIndex = _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();
decision = decision.ToUpper();
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()));
Console.Write("\t" + "SUM: " + CountPoints(player));
private void OfferToContinueGame()
var newPack = new PackOfCards();
if (answer1 && CountPoints(GamePlayer1) <= 20)
answer1 = IsContinueGame(GamePlayer1, newPack);
if (answer2 && CountPoints(GamePlayer2) <= 20)
answer2 = IsContinueGame(GamePlayer2, newPack);
while ((answer1 && (CountPoints(GamePlayer1) <= 20)) || (answer2 && (CountPoints(GamePlayer2) <= 20)));
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());
private int CountPoints(IPlayer currentPlayer)
if (currentPlayer == GamePlayer1)
sumPoints = _player1Cards.Sum(p => p.Point);
sumPoints = _player2Cards.Sum(p => p.Point);
public IPlayer DefineWinner()
int player1Sum = _player1Cards.Sum(p => p.Point);
int player2Sum = _player2Cards.Sum(p => p.Point);
if (player1Sum > 21 && player2Sum <= 21)
else if (player2Sum > 21 && player1Sum <= 21)
else if (player1Sum > 21 && player2Sum > 21)
else if (player1Sum > player2Sum && (player1Sum <= 21))
else if (player2Sum > player1Sum && player2Sum <= 21)
private void ShowGameResult()
IPlayer winner = DefineWinner();
Console.WriteLine(("There is no winner in this game. Try again").ToUpper());
Console.WriteLine((winner.Name + " is a winner! Congrats!").ToUpper());
DefinePlayerWhoPlaysFirst();
Console.Write(new string('=', 30));
Console.WriteLine("\n" + "THE GAME IS OVER!" + "\n");
Console.WriteLine(new string('=', 30));
private List<PlayingCard> _player1Cards = new List<PlayingCard>();
private List<PlayingCard> _player2Cards = new List<PlayingCard>();
public static void Main(string[] args)
var player1 = new SimpleComputer();
var player2 = new SimpleComputer();
var testGame = new Game(player1, player2);