Пример #1
0
        public static MoveType[] MovesForPosition(Position position, int x)
        {
            var moves = new List<MoveType>();

            //position.Rotation
            if (position.Rotation > 0)
            {
                moves.AddRange(Enumerable.Repeat(MoveType.TurnRight, position.Rotation));
            }

            var offset = (position.Rotation == 1) ? (position.Type == PieceType.I) ? 2 : 1 : 0;
            var origenX = x + offset;

            var destinationX = position.X;

            if (origenX > destinationX)
            {
                //move left
                for(int i=0;i<origenX-destinationX;i++)
                    moves.Add(MoveType.Left);

            }
            else if (origenX < destinationX)
            {
                //move right
                for (int i = 0; i < destinationX - origenX; i++)
                    moves.Add(MoveType.Right);
            }
            else
            {
                moves.Add(MoveType.Down);
            }
            return moves.ToArray();
        }
Пример #2
0
        public static Position MinimumDamagePosition(PieceType type, int[] columns)
        {
            var result = new Position
            {
                Type = type,
                Rotation = 0,
                X = 0,
            };
            int minDammage = 1000;

            int rotationMax = 0;
            switch (type)
            {
                case PieceType.O:
                    rotationMax = 1;
                    break;
                case PieceType.I:
                case PieceType.Z:
                case PieceType.S:
                    rotationMax = 2;
                    break;
                case PieceType.J:
                case PieceType.L:
                case PieceType.T:
                    rotationMax = 4;
                    break;
            }

            int columnsSum = columns.Sum();
            for (int r = 0; r < rotationMax; r++)
            {
                for (int i = 0; i < columns.Length; i++)
                {
                    int[] columsAfter = columns.GetColomnsAfterWithHoles2(i, r, type);
                    if (columsAfter.Sum() <= columnsSum) break;

                    var damage = columsAfter.Sum() - columnsSum;
                    if (damage < minDammage)
                    {
                        minDammage = damage;
                        result.Rotation = r;
                        result.X = i;
                    }

                    if (damage == minDammage && columns[result.X] > columns[i])
                    {
                        result.X = i;
                    }
                }
            }
            return result;
        }