private bool IsGoodTarget(CellPosition target, IGameField prediction) { return (OpponentFieldKnowledge.Contains(target) && prediction[target] is IShipCell && !OpponentFieldKnowledge[target].HasValue); }
protected IEnumerable <CellPosition> FindDamagedShip() { var damagedShip = OpponentFieldKnowledge.EnumeratePositions() .FirstOrDefault(position => OpponentFieldKnowledge[position] == true && position.AllNeighbours.Any(neighbour => OpponentFieldKnowledge.Contains(neighbour) && OpponentFieldKnowledge[neighbour] == null)); return(damagedShip == null ? Enumerable.Empty <CellPosition>() : OpponentFieldKnowledge.FindAllConnectedByEdgeCells(damagedShip, knowledge => knowledge == true)); }
protected bool CanPredictionBeReal(IGameField prediction) { if (prediction == null) { return(false); } return(( from position in OpponentFieldKnowledge.EnumeratePositions() let knowledge = OpponentFieldKnowledge[position] where knowledge.HasValue select prediction[position] is IShipCell == knowledge) .All(x => x)); }
protected IGameField GenerateNewPrediction() { var builder = new GameFieldBuilder(); foreach (var position in OpponentFieldKnowledge.EnumeratePositions()) { if (OpponentFieldKnowledge[position] == true) { builder.TryAddShipCell(position); } } var generator = new RandomFieldGenerator(builder); var damagedShip = FindDamagedShip().ToList(); if (damagedShip.Any()) { foreach (var cell in damagedShip) { builder.TryRemoveShipCell(cell); } var variants = new[] { 4, 3, 2, 1 }.SelectMany(x => new[] { new { Ship = (ShipType)x, Vertical = true }, new { Ship = (ShipType)x, Vertical = false } }).SelectMany(x => GenerateContinuesForDamagedShip(damagedShip, builder, x.Vertical, x.Ship)); foreach (var variant in variants) { builder.TryAddFullShip(variant.Item1, variant.Item2, variant.Item3); var prediction = generator.Generate(x => OpponentFieldKnowledge[x] != false); if (prediction != null) { return(prediction); } builder.TryRemoveFullShip(variant.Item1, variant.Item2, variant.Item3); } } return(generator.Generate(x => OpponentFieldKnowledge[x] != false)); }