I'm trying to implement a simply poker game (pet project). Players can do two actions: fold or check. The basic scenario is quite simple: Two players start a game. First action do player1. He can fold or check. Afterwards player2 can fold or check. I want to write proper tests and juggle actions which can do players.
My prototype code which works looks like follow.
Player player1 = new Player(1);
Player player2 = new Player(2);
List<Player> players = new List<Player>() { player1, player2 };
Game hand = new Game();
hand.Players = players;
Thread game = new Thread(hand.WaitForPlayersAnswer);
game.Start();
Thread p1 = new Thread(player1.Check);
p1.Start();
Thread p2 = new Thread(player2.Fold);
p2.Start();
Player:
public class Player
{
private SemaphoreSlim _sem;
private int _i;
public Player(int i)
{
_i = i;
}
public void Check()
{
while (_sem == null)
{ }
Console.WriteLine(_i + ": Check");
_sem.Release();
}
public void Fold()
{
while (_sem == null)
{ }
Console.WriteLine(_i + ": Fold");
_sem.Release();
}
public void DoAction(SemaphoreSlim sem)
{
_sem = sem;
sem.Wait();
_sem = null;
}
}
Game:
public class Game
{
public List<Player> Players { get; set; }
public void WaitForPlayersAnswer()
{
var token = new SemaphoreSlim(0);
foreach (var player in Players)
{
player.DoAction(token);
}
}
}
I believe that it is a better way of achieving my goal. How can I do it better?