Beispiel #1
0
        protected HitBoard SaveHit(IEnumerable <HitBoard> boards, Hit hit)
        {
            if (hit.target.Equals(this))
            {
                return(null);
            }

            HitBoard selectedBoard = null;

            if (
                (features.HasFlag(AiFeatures.RememberOwnShots) && hit.attacker.Equals(this)) ||
                (features.HasFlag(AiFeatures.RememberRivalShots) && !hit.attacker.Equals(this))
                )
            {
                selectedBoard = boards.Where(b => b.Owner.Equals(this) && b.Rival.Equals(hit.target)).First();
                selectedBoard.Set(hit.coords, HitValues[(int)hit.effect]);
            }

            return(selectedBoard);
        }
Beispiel #2
0
        private void DisplayHit(Hit hit)
        {
            var offset = hit.target.Id - 1;
            var top    = 0;
            var left   = offset * (Dim + 5);

            Console.SetCursorPosition(left + hit.coords.Col, top + hit.coords.Row);
            switch (hit.effect)
            {
            case ShotEffect.Hit:
                Console.Write(HIT);
                break;

            case ShotEffect.Kill:
                Console.Write(KILL);
                break;

            default:
                Console.Write(MISS);
                break;
            }
        }
Beispiel #3
0
        public void Play(bool visialize = true)
        {
            if (players.Count < 2)
            {
                throw new InvalidOperationException("Not enough players");
            }

            Console.CursorVisible = false;
            fleets.Clear();
            hitBoards.Clear();

            foreach (var player in players)
            {
                Board board = new Board(Dim);
                var   fleet = player.PlaceFleet(Armada, board);
                if (fleet == null)
                {
                    throw new InvalidOperationException(string.Format("Player #{0:d} failed to place fleet", player.Id));
                }
                fleets.Add(player.Id, fleet);

                //fleets.Add(player.Id, Fleet.fixed_0);

                foreach (var rival in players)
                {
                    hitBoards.Add(new HitBoard(player, rival, Dim));
                }
            }

            List <ICompetitor> kia = new List <ICompetitor>();
            int totalShots         = 0;

            while (true) // Infinite game loop
            {
                foreach (var activePlayer in players)
                {
                    while (!kia.Contains(activePlayer))
                    {
                        Debug.WriteLine("Active=" + activePlayer);
                        var availableHitBoards = hitBoards.Where(h => h.Owner.Equals(activePlayer) && !kia.Contains(h.Rival));
                        if (availableHitBoards.Count() == 1)
                        {
                            throw new GameOverException(activePlayer, totalShots);
                        }

                        var shot        = activePlayer.Shoot(availableHitBoards);
                        var rivalsFleet = fleets[shot.rival.Id];
                        var effect      = rivalsFleet.TakeShot(shot.coords);
                        var hit         = new Hit
                        {
                            attacker = activePlayer,
                            target   = shot.rival,
                            coords   = shot.coords,
                            effect   = effect,
                        };
                        Debug.WriteLine(hit);
                        //if (effect != ShotEffect.Miss)
                        //Console.WriteLine(hit);
                        totalShots++;
                        //Console.ReadKey();
                        if (visialize)
                        {
                            System.Threading.Thread.Sleep(100);
                            DisplayHit(hit);
                        }
                        foreach (var player in players)
                        {
                            var hitboard = hitBoards.Where(h => h.Owner.Equals(player) && !kia.Contains(h.Rival));
                            player.UpdateHits(hitboard, hit);
                        }
                        if (effect == ShotEffect.Kill && !rivalsFleet.IsAlive())
                        {
                            kia.Add(shot.rival);
                            Debug.WriteLine("{0}: GG", hit.target);
                        }
                        if (effect == ShotEffect.Miss)
                        {
                            break;
                        }
                    }
                }
            }
        }
Beispiel #4
0
 public abstract void UpdateHits(IEnumerable <HitBoard> boards, Hit hit);