예제 #1
0
        private async Task <dynamic> GameInfo(dynamic args, CancellationToken cancellation_token)
        {
            string             game_id = Request.Query["gameId"];
            QuantumChessEngine engine  = await WebAppManagers.DatabaseManager.RequestEngine(game_id);

            var response = new Model.InfoResponse();

            response.ActivePlayer = PlayerUtils.ToString(engine.ActivePlayer);
            response.GameState    = GameStateUtils.ToString(engine.GameState);
            response.Squares      = new Dictionary <String, Model.InfoResponse.SquareEncoded>();
            for (int i = 0; i < 64; i++)
            {
                Position     pos    = Position.FromIndex(i);
                QuantumPiece qpiece = engine.QuantumChessboard.GetQuantumPiece(pos);
                if (qpiece.Piece.HasValue)
                {
                    response.Squares[pos.ToString()] = new Model.InfoResponse.SquareEncoded()
                    {
                        Player      = PlayerUtils.ToString(qpiece.Piece.Value.Player),
                        Piece       = PieceTypeUtils.ToString(qpiece.Piece.Value.PieceType),
                        Probability = qpiece.Probability
                    };
                }
                else
                {
                    response.Squares[pos.ToString()] = null;
                }
            }

            response.LastMovePositions = engine.LastMovePositions.Select((pos) => pos.ToString().ToLower()).ToArray();

            return(Response.AsJson(response));
        }
예제 #2
0
        public static BsonDocument Serialize(Game game)
        {
            var document = new BsonDocument();

            document.Set("_id", new BsonObjectId(game.Id));
            document.Set("active_player", PlayerUtils.ToString(game.Engine.ActivePlayer));
            document.Set("game_state", GameStateUtils.ToString(game.Engine.QuantumChessboard.GameState));
            document.Set("creation_time", game.Engine.CreationTime);
            document.Set("last_modification_time", DateTime.Now);

            var bson_harmonics = new BsonArray();

            foreach (QuantumHarmonic harmonic in game.Engine.QuantumChessboard.Harmonics)
            {
                var bson_harmonic = new BsonDocument();
                bson_harmonic.Set("harmonic_state", GameStateUtils.ToString(harmonic.Board.GameState));
                bson_harmonic.Set("degeneracy", Convert.ToInt64(harmonic.Degeneracy));

                var bson_chessboard = new BsonArray();
                for (int i = 0; i < 64; i++)
                {
                    Piece?piece = harmonic.Board[i];
                    if (piece.HasValue)
                    {
                        var bson_piece = new BsonDocument();
                        bson_piece.Set("player", PlayerUtils.ToString(piece.Value.Player));
                        bson_piece.Set("piece", PieceTypeUtils.ToString(piece.Value.PieceType));
                        bson_chessboard.Add(bson_piece);
                    }
                    else
                    {
                        bson_chessboard.Add(BsonNull.Value);
                    }
                }

                bson_harmonic.Set("chessboard", bson_chessboard);
                bson_harmonics.Add(bson_harmonic);
            }
            document.Set("harmonics", bson_harmonics);

            var last_move_positions = new BsonArray();

            foreach (Position pos in game.Engine.LastMovePositions)
            {
                last_move_positions.Add(pos.ToString());
            }
            document.Set("last_move_positions", last_move_positions);

            return(document);
        }
예제 #3
0
        public static Game Deserialize(BsonDocument document)
        {
            ObjectId  id            = document["_id"].AsObjectId;
            Player    active_player = PlayerUtils.FromString(document["active_player"].AsString);
            GameState game_state    = GameStateUtils.FromString(document["game_state"].AsString);
            DateTime  creation_time = document["creation_time"].ToLocalTime();

            var harmonics = new List <QuantumHarmonic>();

            foreach (BsonValue bson_harmonic_val in document["harmonics"].AsBsonArray)
            {
                BsonDocument bson_harmonic   = bson_harmonic_val.AsBsonDocument;
                GameState    harmonic_state  = GameStateUtils.FromString(bson_harmonic["harmonic_state"].AsString);
                ulong        degeneracy      = Convert.ToUInt64(bson_harmonic["degeneracy"].AsInt64);
                BsonArray    bson_chessboard = bson_harmonic["chessboard"].AsBsonArray;
                var          chessboard      = Chessboard.EmptyChessboard(harmonic_state);
                for (int i = 0; i < 64; i++)
                {
                    BsonValue bson_square_val = bson_chessboard[i];
                    if (bson_square_val.IsBsonNull)
                    {
                        chessboard[i] = null;
                    }
                    else
                    {
                        BsonDocument bson_square   = bson_square_val.AsBsonDocument;
                        Player       square_player = PlayerUtils.FromString(bson_square["player"].AsString);
                        PieceType    square_piece  = PieceTypeUtils.FromString(bson_square["piece"].AsString);
                        chessboard[i] = new Piece(square_player, square_piece);
                    }
                }
                harmonics.Add(new QuantumHarmonic(chessboard, degeneracy));
            }
            var quantum_chessboard = new QuantumChessboard(harmonics, game_state);

            var last_move_positions = new List <Position>();

            foreach (BsonValue pos_val in document["last_move_positions"].AsBsonArray)
            {
                last_move_positions.Add(Position.Parse(pos_val.AsString));
            }

            var engine = new QuantumChessEngine(quantum_chessboard, active_player, creation_time, last_move_positions.ToArray());

            return(new Game(id, engine));
        }
예제 #4
0
        public void Draw(RenderWindow window, Hold hold)
        {
            if (hold.currentPiece != PieceType.Empty)
            {
                List <Vector2i> pieceToDraw = PieceTypeUtils.GetPieceTypeBlocks(hold.currentPiece);

                float xOffset = hold.currentPiece == PieceType.I ? 1.5f : hold.currentPiece == PieceType.O ? 1.5f : 2.0f;
                float yOffset = hold.currentPiece == PieceType.I ? 4.0f : 3.5f;

                foreach (Vector2i position in pieceToDraw)
                {
                    Sprite sprite = new Sprite();
                    sprite.Texture  = AssetPool.blockTextures[(int)hold.currentPiece];
                    sprite.Position = new Vector2f(
                        AssetPool.holdSprite.Position.X + AssetPool.blockSize.X * (xOffset + position.X),
                        AssetPool.holdSprite.Position.Y + AssetPool.blockSize.Y * (yOffset + position.Y));

                    window.Draw(sprite);
                }
            }
        }
예제 #5
0
        public void Draw(RenderWindow window, PieceQueue pieceQueue)
        {
            float yHeightModifier = 0;

            foreach (PieceType pieceType in pieceQueue.Get())
            {
                float xOffset = pieceType == PieceType.I ? 1.5f : pieceType == PieceType.O ? 1.5f : 2.0f;
                float yOffset = pieceType == PieceType.I ? 3.0f : 2.5f;

                foreach (Vector2i position in PieceTypeUtils.GetPieceTypeBlocks(pieceType))
                {
                    Sprite sprite = new Sprite();
                    sprite.Texture  = AssetPool.blockTextures[(int)pieceType];
                    sprite.Position = new Vector2f(
                        AssetPool.queueSprite.Position.X + AssetPool.blockSize.X * (position.X + xOffset),
                        AssetPool.queueSprite.Position.Y + AssetPool.blockSize.Y * (position.Y + yOffset) + yHeightModifier);

                    window.Draw(sprite);
                }

                yHeightModifier += AssetPool.blockSize.Y * 3;
            }
        }