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); } } }
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); }
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)); }
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); }
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); }
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); }
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); } }
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); } }
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); }
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); }
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); }
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); } } }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }
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)); }
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); }
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."); }
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); } } }