Ejemplo n.º 1
0
        public void GenRNGHitCandids()
        {
            CoordSet cs = new CoordSet();

            switch (ShipsRemaining.Min())
            {
            case 2:
                for (int i = 0; i < 100; i += 2)
                {
                    cs.Add(new CoordPair(i));
                }
                break;

            case 3:
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        cs.Add(new CoordPair(9 - i, j));
                    }
                }
                break;

            case 4:
                for (int i = 0; i < 4; i++)
                {
                    cs.Add(new CoordPair(i, i + 6));
                    cs.Add(new CoordPair(i + 6, i));
                }
                for (int i = 0; i < 8; i++)
                {
                    cs.Add(new CoordPair(i, i + 2));
                    cs.Add(new CoordPair(i + 2, i));
                }
                break;

            case 5:
                for (int i = 0; i < 10; i++)
                {
                    cs.Add(new CoordPair(i, i));
                }
                for (int i = 0; i < 5; i++)
                {
                    cs.Add(new CoordPair(i, i + 5));
                    cs.Add(new CoordPair(i + 5, i));
                }
                break;
            }

            cs.ExceptWith(AllMoves);
            RandomHitCandidates = cs;
        }
Ejemplo n.º 2
0
        public CoordSet GetOccupiedArea(int range)
        {
            CoordSet cs     = new CoordSet();
            int      firstX = Location.X - range;
            int      firstY = Location.Y - range;
            int      lastX  = Location.X + range + (Horizontal ? Length - 1 : 0);
            int      lastY  = Location.Y + range + (Horizontal ? 0 : Length - 1);

            for (int x = firstX; x <= lastX; x++)
            {
                for (int y = firstY; y <= lastY; y++)
                {
                    if (CoordPair.IsValidCoord(x, y))
                    {
                        cs.Add(new CoordPair(x, y));
                    }
                }
            }

            return(cs);
        }
Ejemplo n.º 3
0
        public void RandomFill(int seed, Difficulty diff)
        {
            if (Populated)
            {
                tiles = new PrimaryTile[10, 10];
            }
            Random   r = new Random(seed);
            CoordSet filled;
            int      i = 0;

            switch (diff)
            {
            case Difficulty.Easy:

                while (i < 5)
                {
                    Ship s = Ship.CreateRandom(r, ClassicShipLengths[i]);
                    if (TryAddShip(s))
                    {
                        i++;
                    }
                }
                break;

            case Difficulty.Medium:

                filled = new CoordSet();
                while (i < 5)
                {
                    Ship s = Ship.CreateRandom(r, ClassicShipLengths[i]);
                    if (filled.Overlaps(s.GetOccupiedArea(0)))
                    {
                        continue;
                    }

                    filled.Add(s.GetOccupiedArea(1));

                    TryAddShip(s);
                    i++;
                }
                break;

            case Difficulty.Hard:

                filled = new CoordSet();
                var border = new CoordSet();

                for (int j = 0; j < 10; j++)
                {
                    border.Add(new CoordPair(0, j));
                    border.Add(new CoordPair(j, 0));
                    border.Add(new CoordPair(9, j));
                    border.Add(new CoordPair(j, 9));
                }

                while (i < 5)
                {
                    Ship s        = Ship.CreateRandom(r, ClassicShipLengths[i]);
                    var  shipArea = s.GetOccupiedArea(0);

                    if (shipArea.Overlaps(filled))
                    {
                        continue;
                    }

                    var weakArea = new CoordSet(border);
                    weakArea.IntersectWith(shipArea);
                    if (r.NextDouble() < weakArea.Count * 0.4)
                    {
                        continue;
                    }

                    border.Add(s.GetOccupiedArea(1));
                    filled.Add(shipArea);

                    TryAddShip(s);
                    i++;
                }
                break;
            }
            Populated = true;
            BoardChanged?.Invoke(this, new EventArgs());
        }