public virtual void Create(Gem.PropertyBag Properties) { CurrentAction = null; NextAction = null; this.Properties = Properties.Clone(); }
public Move GetBestMove(Gem[,] gems, int movesToLookAhead, List<Position> lockedOutPositions) { if (movesToLookAhead < 1) throw new Exception(); List<Move> possibleMoves = new List<Move>(); //for now simply return the first match (from the top left) we find for (int row = 0; row < 8; row++) { for (int column = 0; column < 8; column++) { Position position = new Position(row, column); if (lockedOutPositions.Contains(position)) continue; List<Direction> validDirections = new List<Direction>(); if (row > 0) validDirections.Add(Direction.Up); if (row < 7) validDirections.Add(Direction.Down); if (column > 0) validDirections.Add(Direction.Left); if (column < 7) validDirections.Add(Direction.Right); foreach (Direction direction in validDirections) { int newRow = row; int newColumn = column; switch (direction) { case Direction.Up: newRow = row - 1; break; case Direction.Down: newRow = row + 1; break; case Direction.Left: newColumn = column - 1; break; case Direction.Right: newColumn = column + 1; break; } Position newPosition = new Position(newRow, newColumn); if (lockedOutPositions.Contains(newPosition)) continue; Gem[,] newArray = (Gem[,])gems.Clone(); SwapSlots(newArray, row, column, newRow, newColumn); List<Position> involvedGems = MatchedGemsAt(newArray, new Position(newRow, newColumn)); if (involvedGems.Count >= 2) possibleMoves.Add(new Move(new Position(row, column), new Position(newRow, newColumn), involvedGems) { GuaranteedScore = involvedGems.Count * 100 }); } } } if (possibleMoves.Count == 0) return new Move(new Position(0, 0), new Position(0, 0)) {ValidMove = false}; Random rand = new Random(); return possibleMoves[rand.Next(possibleMoves.Count)]; }