public ChessGame(string id, string player1, string player2, string actualStateTx)
        {
            Type = GameTypes.ChessGame;
            try
            {
                Id = new Guid(id);
            }
            catch (Exception ex)
            {
                log.Error("Chess Game - Wrong format of GUID. New one will be created!", ex);
                Id = Guid.NewGuid();
            }
            ActualStateTxId  = actualStateTx;
            GameHistoryTxIds = new List <string>();
            GameHistory      = new List <ChessGameDto>();
            Bets             = new Dictionary <string, Bet>();
            Players          = new Dictionary <string, ChessPlayer>();
            Player1Address   = player1;
            Player2Address   = player2;
            ChessPlayer pl1 = (ChessPlayer)PlayersFactory.GetPlayer(PlayerTypes.ChessPlayer, player1, string.Empty, string.Empty, string.Empty, 0.0);

            pl1.FigureType = FigureTypes.White;
            ChessPlayer pl2 = (ChessPlayer)PlayersFactory.GetPlayer(PlayerTypes.ChessPlayer, player2, string.Empty, string.Empty, string.Empty, 0.0);

            pl2.FigureType = FigureTypes.Black;
            Players.TryAdd(player1, pl1);
            Players.TryAdd(player2, pl2);
        }
        public void Initialize(ICollection <PlayerInfo> inputs, GameRestriction restriction)
        {
            if (inputs.Count < restriction.MinPlayers ||
                inputs.Count > restriction.MaxPlayers)
            {
                throw new ArgumentException("Players count does not meet minimum or maximum requirement", nameof(inputs));
            }

            Restriction = restriction;

            _basket = new Basket(Restriction.MinWeight, Restriction.MaxWeight);
            Players = new List <GenericPlayer <IGuessStrategy> >(inputs.Count);

            _finilizerThread = new Thread(FinalizeProc);
            _finalizeEvent   = new ManualResetEvent(false);
            _state           = new GameState();

            PlayersFactory.PreparePlayersType(restriction);

            foreach (var input in inputs)
            {
                var newPlayer = PlayersFactory.GetPlayer(input.Name, input.PlayerType);
                Players.Add(newPlayer);
                newPlayer.OnNumberGuessed += OnNumberGuessedHandler;
            }

            // All cheaters are subscribed to all players guess events
            foreach (var player in Players)
            {
                var cheaterPlayer = player as GenericCheaterPlayer;
                cheaterPlayer?.SubscribeToOtherPlayersGuesses(Players);
            }

            _initialized = true;
        }