public ValidPosition MakeTurn() { ValidPosition bestPosition = this; Predicate <Position> betterScore = p => p.Score > bestPosition.Score; for (int i = 0; i < 2 * COLUMN_COUNT - 1; ++i) { for (int j = 0; j < 2 * SHORT_COLUMN_LENGTH - 1; ++j) { var point = new RotationCenter(i, j); var position = PositionBuilder.Generate(this, point, true).MakeTurn().Build(); if (betterScore(position)) { bestPosition = position; } position = PositionBuilder.Generate(this, point, false).MakeTurn().Build(); if (betterScore(position)) { bestPosition = position; } } } return(bestPosition); }
public static PositionBuilder Generate(ValidPosition position, RotationCenter point, bool clockwise) { var shortColumns = position.ShortColumns; var longColumns = position.LongColumns; point.Rotate(clockwise, shortColumns, longColumns); return(new PositionBuilder(shortColumns, longColumns, position.Score)); }
public static ValidPosition Init() { var shortColumns = new int[COLUMN_COUNT, SHORT_COLUMN_LENGTH]; var longColumns = new int[COLUMN_COUNT, SHORT_COLUMN_LENGTH + 1]; RandomLayout(shortColumns, longColumns); var position = new ValidPosition(shortColumns, longColumns, 0); if (position.ClusterCenterCount != 0) { throw new InvalidOperationException("Initial position not valid"); } return(position); }
static void Main(string[] args) { var position = ValidPosition.Init(); Console.WriteLine(position); var nextPosition = position.MakeTurn(); while (nextPosition.Score > position.Score) { position = nextPosition; Console.ReadLine(); Console.WriteLine(position); nextPosition = position.MakeTurn(); } Console.WriteLine("The End"); Console.ReadLine(); }