Exemple #1
0
        public void movePiece(TetrisMoves tm, int count)
        {
            switch (tm)
            {
            case TetrisMoves.UP: moveUp(count);
                break;

            case TetrisMoves.DOWN: moveDown(count);
                break;

            case TetrisMoves.LEFT: moveLeft(count);
                break;

            case TetrisMoves.RIGHT: moveRight(count);
                break;

            case TetrisMoves.ROTATELEFT: rotateLeft(count);
                break;

            case TetrisMoves.ROTATERIGHT: rotateRight(count);
                break;

            default:
                break;
            }
        }
Exemple #2
0
        private IEnumerable <TetrisMoves> MakePossibleSolutions(TetrisState state)
        {
            if (state.CurrentPiece == null)
            {
                yield break;
            }

            int crtPieceColumn = state.CurrentPiece.Position.Column;

            for (int rotations = 0; rotations < 4; rotations++)
            {
                TetrisMoves solution = MakeSolution(rotations, 0, 0);
                yield return(solution);

                for (int leftMoves = 1; leftMoves < crtPieceColumn + 2; leftMoves++)
                {
                    TetrisMoves solutionsLeft = MakeSolution(rotations, leftMoves, 0);
                    yield return(solutionsLeft);
                }

                for (int rightMoves = 1; rightMoves < state.Columns - crtPieceColumn; rightMoves++)
                {
                    TetrisMoves solutionsRight = MakeSolution(rotations, 0, rightMoves);
                    yield return(solutionsRight);
                }
            }
        }
Exemple #3
0
        public static void movePiece(List <TetrisData> points, TetrisMoves tm, int count)
        {
            switch (tm)
            {
            case TetrisMoves.UP: moveUp(points, count);
                break;

            case TetrisMoves.DOWN: moveDown(points, count);
                break;

            case TetrisMoves.LEFT: moveLeft(points, count);
                break;

            case TetrisMoves.RIGHT: moveRight(points, count);
                break;

            case TetrisMoves.ROTATELEFT: rotateLeft(points, count);
                break;

            case TetrisMoves.ROTATERIGHT: rotateRight(points, count);
                break;

            default:
                break;
            }
        }
Exemple #4
0
        public TetrisShapeDataOnly projectMove(TetrisMoves tm)
        {
            List <TetrisData> returnval = this.CloneData();

            movePiece(returnval, tm);
            TetrisShapeDataOnly tsdo = new TetrisShapeDataOnly();

            tsdo.points = returnval;
            return(tsdo);
        }
Exemple #5
0
        private TetrisState ComputeStateAfterMoves(TetrisState initialState, TetrisMoves moves)
        {
            TetrisState prevState  = initialState;
            TetrisState finalState = initialState;

            foreach (TetrisMove move in moves.Moves)
            {
                finalState = ComputeStateAfterOneMove(prevState, move);
                prevState  = finalState;
            }

            return(finalState);
        }
Exemple #6
0
        private TetrisMoves GetBestMoves(TetrisState state)
        {
            double      maxScore  = double.MinValue;
            TetrisMoves bestMoves = new TetrisMoves();

            foreach (TetrisMoves moves in MakePossibleSolutions(state))
            {
                TetrisState solutionState = ComputeStateAfterMoves(state, moves);
                double      score         = ScoreComputer.ComputeScore(solutionState);
                //Debug.WriteLine($"{moves} {score}");

                if (score > maxScore)
                {
                    bestMoves = moves;
                    maxScore  = score;
                }
            }

            return(bestMoves);
        }
Exemple #7
0
        private void ExecuteSolverCommands()
        {
            while (true)
            {
                Thread.Sleep(600 - 100 * (GameState.Speed - 4));
                TetrisMoves moves = Solver.Solve(GameState);

                foreach (TetrisMove move in moves.Moves)
                {
                    switch (move)
                    {
                    case TetrisMove.MoveLeft:
                        ExecuteCommand((state) => Engine.MovePieceLeft(GameState));
                        break;

                    case TetrisMove.MoveRight:
                        ExecuteCommand((state) => Engine.MovePieceRight(GameState));
                        break;

                    case TetrisMove.MoveDown:
                        ExecuteCommand((state) => Engine.MovePieceDown(GameState));
                        break;

                    case TetrisMove.MoveAllTheWayDown:
                        ExecuteCommand((state) => Engine.MovePieceAllTheWayDown(GameState));
                        break;

                    case TetrisMove.Rotate:
                        ExecuteCommand((state) => Engine.RotatePiece(GameState));
                        break;

                    default:
                        throw new Exception($"Unknown move: {move}");
                    }

                    Thread.Sleep(Math.Max(0, 150 - 30 * (GameState.Speed - 4)));
                }
            }
        }
Exemple #8
0
        private TetrisMoves MakeSolution(int rotations, int leftMoves, int rightMoves)
        {
            TetrisMoves solution = new TetrisMoves();

            for (int i = 0; i < rotations; i++)
            {
                solution.Moves.Add(TetrisMove.Rotate);
            }

            for (int i = 0; i < leftMoves; i++)
            {
                solution.Moves.Add(TetrisMove.MoveLeft);
            }

            for (int i = 0; i < rightMoves; i++)
            {
                solution.Moves.Add(TetrisMove.MoveRight);
            }

            solution.Moves.Add(TetrisMove.MoveAllTheWayDown);

            return(solution);
        }
Exemple #9
0
 public void movePiece(TetrisMoves tm)
 {
     movePiece(tm, 1);
 }
Exemple #10
0
 public static void movePiece(List <TetrisData> points, TetrisMoves tm)
 {
     movePiece(points, tm, 1);
 }