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(); }
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; }