Beispiel #1
0
 private bool IsGoodTarget(CellPosition target, IGameField prediction)
 {
     return
         (OpponentFieldKnowledge.Contains(target) &&
          prediction[target] is IShipCell &&
          !OpponentFieldKnowledge[target].HasValue);
 }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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));
        }