Beispiel #1
0
        private List <IEnumerable <Polje> > DajNizoveSlobodnihPolja(int duljinaNiza, IEnumerable <int> vanjskiIndeks, IEnumerable <int> nutarnjiIndeks, Func <int, int, Polje> dohvatPolja)
        {
            List <IEnumerable <Polje> > nizovi = new List <IEnumerable <Polje> >();

            foreach (int i in vanjskiIndeks)
            {
                RedFiksneDuljine <Polje> red = new RedFiksneDuljine <Polje>(duljinaNiza);
                foreach (int j in nutarnjiIndeks)
                {
                    Polje polje = dohvatPolja(i, j);
                    if (polje == null)
                    {
                        red.Clear();
                    }
                    else
                    {
                        red.Enqueue(polje);
                        if (red.Count == duljinaNiza)
                        {
                            nizovi.Add(new List <Polje>(red));
                        }
                    }
                }
            }
            return(nizovi);
        }
 protected smjer OdrediSmjer(Polje prvo, Polje drugo)
 {
     if (prvo.Redak == drugo.Redak)
     {
         if (prvo.Stupac < drugo.Stupac)
         {
             return(smjer.desno);
         }
         else
         {
             return(smjer.lijevo);
         }
     }
     else
     {
         if (prvo.Redak < drugo.Redak)
         {
             return(smjer.dolje);
         }
         else
         {
             return(smjer.gore);
         }
     }
 }
Beispiel #3
0
        public rezultatGadjanja ObradiPogodak(int redak, int stupac)
        {
            // Ocekujemo numericke koordinate pogotka.
            // Zatim pitamo svaki brod da li je pogodjen/potopljen.
            // Ako je potopljen i zadnji brod, dojavljuje PORAZ :(

            Polje p = new Polje(redak, stupac);

            foreach (Brod b in this.brodovi)
            {
                rezultatGadjanja rezultat = b.ObradiPogodak(p);
                switch (rezultat)
                {
                case rezultatGadjanja.promasaj:
                    continue;     // provjeri iduci brod

                case rezultatGadjanja.pogodak:
                    // nasli smo nesretni brod, napusti petlju
                    return(rezultatGadjanja.pogodak);

                case rezultatGadjanja.potopljen:
                    EliminirajBrod(b);
                    return(this.brodovi.Any() ? rezultatGadjanja.potopljen : rezultatGadjanja.PORAZ);
                }
            }
            return(rezultatGadjanja.promasaj);
        }
Beispiel #4
0
 public Kružitelj(Mreža mreža, int duljinaBroda, Polje pogođenoPolje)
 {
     this.mreža        = mreža;
     this.duljinaBroda = duljinaBroda;
     this.tražilica    = new TražilicaNizovaPolja(mreža);
     pogođenaPolja.Add(pogođenoPolje);
 }
        virtual public Brod SagradiBrod(int duljina)
        {
            // Brodograditelj ima vlastitu Mrezu --> zna si sam pogledati slobodna polja

            IEnumerable <Polje> horizontalnaPolja = this.Mreza.DajHorizontalnaSlobodnaPolja(duljina);
            IEnumerable <Polje> vertikalnaPolja   = this.Mreza.DajVertikalnaSlobodnaPolja(duljina);

            List <Polje> poljaBroda = new List <Polje>();

            int brojPolja = horizontalnaPolja.Count() + vertikalnaPolja.Count();
            int izbor     = rand.Next(brojPolja);

            if (izbor >= horizontalnaPolja.Count())
            {
                Polje pocetno = vertikalnaPolja.ElementAt(izbor - horizontalnaPolja.Count());
                for (int i = pocetno.Redak; i < pocetno.Redak + duljina; i++)
                {
                    poljaBroda.Add(new Polje(i, pocetno.Stupac));
                }
            }
            else
            {
                Polje pocetno = horizontalnaPolja.ElementAt(izbor);
                for (int i = pocetno.Stupac; i < pocetno.Stupac + duljina; i++)
                {
                    poljaBroda.Add(new Polje(pocetno.Redak, i));
                }
            }

            return(new Brod(poljaBroda));
        }
Beispiel #6
0
        public IEnumerable <Polje> DajKandidateZaVertikalniBrod()
        {
            List <Polje> kandidati = new List <Polje>();
            var          slobodna  = mreža.DajSlobodnaPolja();

            for (int s = 0; s < mreža.Stupaca; ++s)
            {
                int brojačPolja = 0;
                for (int r = 0; r < mreža.Redaka; ++r)
                {
                    Polje p = new Polje(r, s);
                    if (slobodna.Contains(p))
                    {
                        ++brojačPolja;
                    }
                    else
                    {
                        brojačPolja = 0;
                    }

                    if (brojačPolja >= duljinaBroda)
                    {
                        for (int rr = r - duljinaBroda + 1; rr <= r; ++rr)
                        {
                            kandidati.Add(new Polje(rr, s));
                        }
                    }
                }
            }
            return(kandidati);
        }
Beispiel #7
0
        private void PromijeniTaktikuUKružno()
        {
            TaktikaGađanja = TaktikaGađanja.Kružno;
            Polje pogođeno = pucač.PogođenaPolja.First();

            pucač = new KružniPucač(mreža, pogođeno, duljineBrodova.First());
        }
        public override Polje SlijedecePolje()
        {
            // Stanja koja vode u ovaj objekt su:
            // A) drugi (i svaki slijedeci) pogodak broda

            Polje zadnjiPogodak = zap.trenutnaMeta.Last();

            return(PoljeZaSmjer(zap.pronadjeniSmjer, zadnjiPogodak));
        }
        private List <Polje> PoljaUNastavku(Polje polje, JesuLiUNizu jeLiUNizu)
        {
            List <Polje> polja = new List <Polje>();

            while ((polje = mreža.RaspoloživaPolja.FirstOrDefault(p => jeLiUNizu(p, polje))) != null)
            {
                polja.Add(polje);
            }
            return(polja);
        }
Beispiel #10
0
 public RezultatGađanja Gađaj(Polje polje)
 {
     foreach (Brod brod in brodovi)
     {
         var rezultat = brod.Gađaj(polje);
         if (rezultat != RezultatGađanja.Promašaj)
         {
             return(rezultat);
         }
     }
     return(RezultatGađanja.Promašaj);
 }
Beispiel #11
0
 public rezultatGadjanja ObradiPogodak(Polje p)
 {
     if (this.polja.Contains(p))
     {
         this.polja.Remove(p);
         return(this.polja.Count == 0 ? rezultatGadjanja.potopljen : rezultatGadjanja.pogodak);
     }
     else
     {
         return(rezultatGadjanja.promasaj);
     }
 }
Beispiel #12
0
 public Mreža(int redaka, int stupaca)
 {
     Stupaca = stupaca;
     Redaka  = redaka;
     for (int s = 0; s < Stupaca; ++s)
     {
         for (int r = 0; r < Redaka; ++r)
         {
             polja[s, r] = new Polje(s, r);
         }
     }
 }
        public TaktikaUnistavanjeRazmak(AITemplate.Zapovijedi zap, Mreza mreza, List <int> flota)
            : base(zap, mreza, flota)
        {
            //    ako smjer jos nije odredjen, racunamo ga iz pogodaka
            Polje prviPogodak   = zap.trenutnaMeta.First();
            Polje zadnjiPogodak = zap.trenutnaMeta.Last();

            if (zap.pronadjeniSmjer == smjer.nepoznato)
            {
                zap.pronadjeniSmjer = OdrediSmjer(prviPogodak, zadnjiPogodak);
            }
        }
Beispiel #14
0
 public RezultatGađanja Gađaj(Polje p)
 {
     foreach (Brod brod in brodovi)
     {
         RezultatGađanja rez = brod.Gađaj(p);
         if (rez != RezultatGađanja.Promašaj)
         {
             return(rez);
         }
     }
     return(RezultatGađanja.Promašaj);
 }
Beispiel #15
0
 public RezultatGađanja Gađaj(Polje p)
 {
     if (!Polja.Contains(p))
     {
         return(RezultatGađanja.Promašaj);
     }
     pogođenaPolja.Add(p);
     if (pogođenaPolja.Count() == Polja.Count())
     {
         return(RezultatGađanja.Potonuće);
     }
     return(RezultatGađanja.Pogodak);
 }
Beispiel #16
0
        public bool ImaDovoljnoMjestaDesno(Polje p, int duljina)
        {
            Boolean rezultat = true;

            for (int i = p.Stupac; i < p.Stupac + duljina; i++)
            {
                if (!polja.Contains <Polje>(new Polje(p.Redak, i)))
                {
                    rezultat = false;
                }
            }
            return(rezultat);
        }
Beispiel #17
0
 public Mreža(int redaka, int stupaca)
 {
     Redaka  = redaka;
     Stupaca = stupaca;
     polja   = new Polje[Redaka, Stupaca];
     for (int r = 0; r < redaka; ++r)
     {
         for (int s = 0; s < stupaca; ++s)
         {
             polja[r, s] = new Polje(r, s);
         }
     }
 }
Beispiel #18
0
        bool ImaDovoljnoPoljaIspod(Polje p, IEnumerable <Polje> slobodnaPolja, int duljinaBroda)
        {
            int redak  = p.Redak;
            int stupac = p.Stupac;

            for (int r = redak + 1; r < redak + duljinaBroda; ++r)
            {
                if (!slobodnaPolja.Contains(new Polje(r, stupac)))
                {
                    return(false);
                }
            }
            return(true);
        }
Beispiel #19
0
        bool ImaDovoljnoPoljaDesno(Polje p, IEnumerable <Polje> slobodnaPolja, int duljinaBroda)
        {
            int redak  = p.Redak;
            int stupac = p.Stupac;

            for (int s = stupac + 1; s < stupac + duljinaBroda; ++s)
            {
                if (!slobodnaPolja.Contains(new Polje(redak, s)))
                {
                    return(false);
                }
            }
            return(true);
        }
Beispiel #20
0
 public RezultatGađanja Gađaj(Polje p)
 {
     if (!Polja.Contains(p))
     {
         return(RezultatGađanja.Promašaj);
     }
     pogođenaPolja.Add(p);
     if (pogođenaPolja.Count() == Polja.Count())
     {
         OnProtivničkiBrodJePotopljen(); //event zovemo
         return(RezultatGađanja.Potonuće);
     }
     return(RezultatGađanja.Pogodak);
 }
Beispiel #21
0
        private IEnumerable <Polje> DajSlobodnaPoljaDolje(Polje polje)
        {
            List <Polje> rezultat = new List <Polje>();

            for (int r = polje.Redak + 1; r < Redaka; ++r)
            {
                if (polja[r, polje.Stupac] == null)
                {
                    break;
                }
                rezultat.Add(polja[r, polje.Stupac]);
            }
            return(rezultat);
        }
Beispiel #22
0
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return(false);
            }
            if (obj.GetType() != GetType())
            {
                return(false);
            }
            Polje p = (Polje)obj;

            return((p.Redak == Redak) && (p.Stupac == Stupac));
        }
Beispiel #23
0
        private IEnumerable <Polje> DajSlobodnaPoljaLijevo(Polje polje)
        {
            List <Polje> rezultat = new List <Polje>();

            for (int s = polje.Stupac - 1; s >= 0; --s)
            {
                if (polja[polje.Redak, s] == null)
                {
                    break;
                }
                rezultat.Add(polja[polje.Redak, s]);
            }
            return(rezultat);
        }
Beispiel #24
0
        private IEnumerable <Polje> DajSlobodnaPoljaDesno(Polje polje)
        {
            List <Polje> rezultat = new List <Polje>();

            for (int s = polje.Stupac + 1; s < Stupaca; ++s)
            {
                if (polja[polje.Redak, s] == null)
                {
                    break;
                }
                rezultat.Add(polja[polje.Redak, s]);
            }
            return(rezultat);
        }
Beispiel #25
0
        public static IEnumerable <Polje> Sortiraj(this IEnumerable <Polje> polja)
        {
            if (polja.Count() <= 1)
            {
                return(polja);
            }
            Polje prvo = polja.First();
            bool  uspravnoPoravnata  = polja.Skip(1).All(p => p.Stupac == prvo.Stupac);
            bool  vodoravnoPoravnata = polja.Skip(1).All(p => p.Redak == prvo.Redak);

            if (vodoravnoPoravnata == uspravnoPoravnata)
            {
                throw new ArgumentException();
            }
            return(polja.OrderBy(p => p.Redak + p.Stupac));
        }
Beispiel #26
0
        public IEnumerable <Polje> DajPoljaZaBrod(Smjer smjer, Polje početno, int duljinaBroda)
        {
            int          redak       = početno.Redak;
            int          stupac      = početno.Stupac;
            int          deltaRedak  = smjer == Smjer.Horizontalno ? 0 : 1;
            int          deltaStupac = smjer == Smjer.Vertikalno ? 0 : 1;
            List <Polje> polja       = new List <Polje>();

            for (int i = 0; i < duljinaBroda; ++i)
            {
                polja.Add(new Polje(redak, stupac));
                redak  += deltaRedak;
                stupac += deltaStupac;
            }
            return(polja);
        }
Beispiel #27
0
        public IEnumerable <Polje> DajPoljaZaBrod(Orijentacija smjer, Polje početno, int duljinaBroda)
        {
            int          redak       = početno.Redak;
            int          stupac      = početno.Stupac;
            int          deltaRedak  = smjer == Orijentacija.Horizontalno ? 0 : 1;
            int          deltaStupac = smjer == Orijentacija.Vertikalno ? 0 : 1;
            List <Polje> poljaZaBrod = new List <Polje>();

            for (int i = 0; i < duljinaBroda; ++i)
            {
                poljaZaBrod.Add(polja[redak, stupac]);
                EliminirajPolje(redak, stupac);
                redak  += deltaRedak;
                stupac += deltaStupac;
            }
            return(poljaZaBrod);
        }
        private List <Polje> PoljaUNizu(Polje polje, int najvišePolja, JesuLiUNizu jeLiUNizu)
        {
            List <Polje> polja = new List <Polje> {
                polje
            };

            while (--najvišePolja > 0)
            {
                polje = mreža.RaspoloživaPolja.FirstOrDefault(p => jeLiUNizu(p, polje));
                if (polje == null)
                {
                    break;
                }
                polja.Add(polje);
            }
            return(polja);
        }
        public IEnumerable <Polje> DajPoljaUNastavku(Polje polje, Smjer smjer)
        {
            switch (smjer)
            {
            case Smjer.Gore:
                return(PoljaUNastavku(polje, JeLiIznad));

            case Smjer.Desno:
                return(PoljaUNastavku(polje, JeLiDesno));

            case Smjer.Dolje:
                return(PoljaUNastavku(polje, JeLiDolje));

            case Smjer.Lijevo:
                return(PoljaUNastavku(polje, JeLiLijevo));
            }
            throw new ArgumentOutOfRangeException("Nepodržani smjer.");
        }
Beispiel #30
0
        public void Ukloni(IEnumerable <Polje> brodskaPolja)
        {
            brodskaPolja = brodskaPolja.Sortiraj();
            Polje prvo   = brodskaPolja.First();
            int   s1     = Math.Max(prvo.Stupac - 1, 0);
            int   r1     = Math.Max(prvo.Redak - 1, 0);
            Polje zadnje = brodskaPolja.Last();
            int   s2     = Math.Min(zadnje.Stupac + 2, mreža.Stupaca);
            int   r2     = Math.Min(zadnje.Redak + 2, mreža.Redaka);

            for (int s = s1; s < s2; ++s)
            {
                for (int r = r1; r < r2; ++r)
                {
                    mreža.UkloniPolje(s, r);
                }
            }
        }