示例#1
0
        public async Task <GameId> CreateSimulationAsync(
            SimulationParams parameters,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var players        = parameters.Players;
            var random         = parameters.Seed.ToRandom();
            var firstPlayerIdx = parameters.RandomFirstPlayer ? random.Next(players.Count) : 0;

            var newSimulation = new NewSimulation
                                (
                BoardType: parameters.BoardType,
                CreatedBy: parameters.CreatedBy,
                FirstPlayerIndex: firstPlayerIdx,
                Players: players,
                Seed: parameters.Seed,
                WinCondition: parameters.WinCondition
                                );

            return(await _store.SaveNewSimulationAsync(newSimulation, cancellationToken));
        }
示例#2
0
        public async Task <GameId> SaveNewSimulationAsync(
            NewSimulation newSimulation,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            GameId gameId;

            using (var connection = await _connectionFactory.CreateAndOpenAsync(cancellationToken))
                using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        int surrogateGameId = default;
                        int firstPlayerId   = default;

                        {
                            var commandText = @"
                            INSERT INTO
                                game (board_type, num_sequences_to_win, seed, version)
                            VALUES
                                (@boardType, @numSequencesToWin, @seed, @version)
                            RETURNING id, game_id;";

                            var parameters = new
                            {
                                boardType         = (int)newSimulation.BoardType,
                                numSequencesToWin = newSimulation.WinCondition,
                                seed    = newSimulation.Seed,
                                version = 1
                            };

                            var command = new CommandDefinition(
                                commandText,
                                parameters,
                                transaction,
                                cancellationToken: cancellationToken
                                );

                            var result = await connection.QuerySingleAsync <insert_into_game>(command);

                            surrogateGameId = result.id;
                            gameId          = result.game_id;
                        }

                        for (int i = 0; i < newSimulation.Players.Count; i++)
                        {
                            var commandText = @"
                            INSERT INTO
                                game_player (game_id, player_id, player_type)
                            VALUES
                                (@gameId, @playerId, @playerType::player_type)
                            RETURNING id;";

                            var player = newSimulation.Players[i];

                            var parameters = new
                            {
                                gameId     = surrogateGameId,
                                playerId   = player.BotType.ToString(),
                                playerType = PlayerType.Bot.ToString().ToLowerInvariant(),
                            };

                            var command = new CommandDefinition(
                                commandText,
                                parameters,
                                transaction,
                                cancellationToken: cancellationToken
                                );

                            var result = await connection.QuerySingleAsync <int>(command);

                            if (newSimulation.FirstPlayerIndex == i)
                            {
                                firstPlayerId = result;
                            }
                        }

                        {
                            var commandText = @"
                            UPDATE game
                               SET first_player_id = @firstPlayerId
                             WHERE id = @gameId;";

                            var parameters = new { firstPlayerId, gameId = surrogateGameId };

                            var command = new CommandDefinition(
                                commandText,
                                parameters,
                                transaction,
                                cancellationToken: cancellationToken
                                );

                            await connection.ExecuteAsync(command);
                        }

                        {
                            var commandText = @"
                            INSERT INTO
                                simulation (game_id, created_by)
                            VALUES
                                (@gameId, @createdBy);";

                            var parameters = new
                            {
                                gameId    = surrogateGameId,
                                createdBy = newSimulation.CreatedBy
                            };

                            var command = new CommandDefinition(
                                commandText,
                                parameters,
                                transaction,
                                cancellationToken: cancellationToken
                                );

                            await connection.ExecuteAsync(command);
                        }

                        await transaction.CommitAsync(cancellationToken);
                    }
                    catch
                    {
                        await transaction.RollbackAsync(cancellationToken);

                        throw;
                    }
                }

            return(gameId);
        }