/// <summary> /// Vrací všechny platné tahy pro zadanou pozici a pro zadaného hráče. /// </summary> public static List<Tah> VratPlatneTahy(Pozice pole, Manazer.StavPole hrac, HraciDeska hraciDeska) { if(hraciDeska.Hrac(pole) == hrac) return VratPlatneTahy(pole.Radek, pole.Sloupec, hrac, hraciDeska); return new List<Tah>(); }
/// <summary> /// Statická funkce převádějící stringové souřadnice do objektu Pozice /// </summary> public static Pozice StringNaSouradnice(string souradnice) { Pozice pole; int radek, sloupec; radek = Int32.Parse(souradnice.Remove(0, 1)) - 1; sloupec = (int)Enum.Parse(typeof(Prikazy.Souradnice), souradnice.Remove(1)); pole = new Pozice(radek, sloupec); return pole; }
/// <summary> /// Zvýrazní políčko, přes které zrovna přejedeme myší. /// </summary> private void Platno_MouseMove(object sender, MouseEventArgs e) { if(ManazerHry.KonecHry) return; Pozice HoverPozice = VratPoziciNaHraciDesce(e.X, e.Y); if(HoverPozice != null) { if(HraciDeska.Rohova(HoverPozice.Radek, HoverPozice.Sloupec)) return; // Status.Text = HoverPozice.ToString(); } if(HoverPozice != MouseHoverPozice) { MouseHoverPozice = HoverPozice; Platno.Invalidate(); } }
/// <summary> /// Hlavní metoda, která zajišťuje dění poté, co se klikne na hrací desku. /// </summary> private void Platno_MouseClick(object sender, MouseEventArgs e) { // Jestliže není hra spuštěna, nebudeme na kliknutí vůbec reagovat if (ManazerHry.KonecHry || ManazerHry.DvaPocitace) return; // Jestli jen potvrzujeme vícenásobný skok, skočíme if(e.Button == MouseButtons.Left && VicenasobnySkok) { VicenasobnySkok = false; ProvedTah(); } Pozice Pozice = VratPoziciNaHraciDesce(e.X, e.Y); // Jestliže jsme klikli mimo desku, jen resetujeme všechny uložené věci // Anebo ne if(Pozice == null || HraciDeska.Rohova(Pozice.Radek, Pozice.Sloupec)) { /*AktivniPozice = null; PresunKamene = false;*/ AktualizujGUI(); return; } // Pokud už máme nastavené obránce, můžeme vytvářet normální tahy if (ManazerHry.NastaveniObranci) { // Už jsme klikli na kámen, se kterým budeme táhnout? if (PresunKamene) { // Pokud jsme vybrali kámen a pak klikli na další kámen, // dáme jako výchozí kámen ten druhý. if(Manazer.Deska.Hrac(Pozice) == ManazerHry.hracNaTahu) { PresunKamene = true; NactenePozice.Clear(); NactenePozice.Add((Pozice) Pozice.Clone()); AktivniPozice = Pozice; AktualizujGUI(); return; } // Provádíme jednoduchý skok či tah? // Nebo je na tahu útočník, který stejně skákat nemůže? if(e.Button == MouseButtons.Left || ManazerHry.hracNaTahu == Manazer.StavPole.utok) { if(!VicenasobnySkok) NactenePozice.Add((Pozice) Pozice.Clone()); ProvedTah(); } // Provádíme vícenásobný skok? else if(e.Button == MouseButtons.Right) { VicenasobnySkok = true; NactenePozice.Add((Pozice) Pozice.Clone()); } } // Jestliže nemáme vybraný žádný kámen, pokusíme se nějaký vybrat else { if(Manazer.Deska.Hrac(Pozice) == ManazerHry.hracNaTahu) { PresunKamene = true; NactenePozice.Clear(); NactenePozice.Add((Pozice) Pozice.Clone()); AktivniPozice = Pozice; } } } // Pokud nejsou nastavení obránci, zkusíme je nastavit else { try { ManazerHry.NastavObrance(Pozice); ZobrazHraceNaRade(); if (ManazerHry.NastaveniObranci) if (ManazerHry.JePocitacNaTahu) ManazerHry.Tahni(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } AktualizujGUI(); }
private void ObnovaPoZpetVpredTazich() { NactenePozice.Clear(); AktivniPozice = null; AktualizujGUI(); AktualizujPanelHistorie(); PresunKamene = false; VicenasobnySkok = false; }
private void NastavPocatecniInformace() { ManazerHry.NastavObtiznost(); PocitaciHraj.Enabled = false; MouseHoverPozice = null; AktivniPozice = null; VicenasobnySkok = false; Status.Text = NazevHry; restartHryToolStripMenuItem.Enabled = true; uložitHruToolStripMenuItem.Enabled = true; prohoďHráčeToolStripMenuItem.Enabled = true; uložitHruToolStripMenuItem.Enabled = true; restartHryToolStripMenuItem.Enabled = true; přehrátToolStripMenuItem.Enabled = true; možnostiToolStripMenuItem.Enabled = true; if(Minimax.vlakno != null) Minimax.vlakno.Abort(); }
public Skoky(Pozice odkud, List<Skoky> skoky) { this.odkud = odkud; this.skoky = skoky; }
public void NastavObrance(Pozice Obrance) { if (PocetObrancu < 2) { if (Pevnost(Obrance.Radek, Obrance.Sloupec)) { if (Volne(Obrance.Radek, Obrance.Sloupec)) { NastavKamen(Obrance, Manazer.StavPole.obrana); PocetObrancu++; } else { throw new Exception("Obránci jsou na stejném místě"); } } else { throw new Exception("Obránci nejsou v pevnosti"); } } else { throw new Exception("Všichni obránci již byli nastaveni"); } }
/// <summary> /// Vrací všechny skoky jedné úrovně jednoho obránce. /// </summary> private static List<Tah> KamMuzeObranceSkocit(Pozice souradniceObrance, HraciDeska hraciDeska) { List<Tah> tahy; tahy = VratPlatneTahy(souradniceObrance, Manazer.StavPole.obrana, hraciDeska); tahy = OdstranObycejneTahy(tahy); return tahy; }
/// <summary> /// Nastaví obránce na hrací desku. /// </summary> /// <param name="s1">První obránce</param> /// <param name="s2">Druhý obránce</param> /*public void NastavObrance(string s1, string s2) { NastavObrance(Prikazy.StringNaSouradnice(s1)); NastavObrance(Prikazy.StringNaSouradnice(s2)); }*/ /// <summary> /// Nastaví obránce po jednom. /// </summary> /// <param name="Souradnice">Stringové souřadnice</param> public void NastavObrance(Pozice Souradnice) { if(!NastaveniObranci) { Deska.NastavObrance(Souradnice); Tah tah = new Tah(Souradnice); TahyZpet.Push(tah); } if (Deska.PocetObrancu == 2) { NastaveniObranci = true; hracNaTahu = Manazer.StavPole.utok; } }
public static Pozice Stred(Pozice pole1, Pozice pole2) { return new Pozice((pole1.Radek + pole2.Radek) / 2, (pole1.Sloupec + pole2.Sloupec) / 2); }
/// <summary> /// Jaký hráč stojí na pozici? /// </summary> /// <param name="pole">Souřadnice pole</param> /// <returns>Barva hráče</returns> public Manazer.StavPole Hrac(Pozice pole) { return Hrac(pole.Radek, pole.Sloupec); }
/// <summary> /// Provede tah na desce. /// </summary> private void Tahni(Pozice odkud, Pozice kam) { Tahni(odkud.Radek, odkud.Sloupec, kam.Radek, kam.Sloupec); }
/// <summary> /// Bez kontroly nastaví kámen na desku. /// </summary> /// <param name="pole">Souřadnice, kam chceme kámen položit</param> /// <param name="hrac">Barva hráče, který táhne</param> private void NastavKamen(Pozice pole, Manazer.StavPole hrac) { NastavKamen(pole.Radek, pole.Sloupec, hrac); }
/// <summary> /// Odebere kámen z desky, namísto něj vloží Hraci.volne. /// </summary> /// <param name="pole">Souřadnice pole</param> public void OdeberKamen(Pozice pole) { OdeberKamen(pole.Radek, pole.Sloupec); }
/// <summary> /// Provede tah /// </summary> private void ProvedTah() { Tah AktualniTah = new Tah(NactenePozice); ManazerHry.VratHraceNaTahu().AktualniTah = AktualniTah; try { ManazerHry.Tahni(); Status.Text = NazevHry; } catch(NeplatnyTah NT) { Status.Text = NT.Message; NactenePozice.Clear(); } catch(ObranceMusiSkakat OMS) { Status.Text = OMS.Message; MessageBox.Show(OMS.Message); } ZobrazHraceNaRade(); NactenePozice.Clear(); PresunKamene = false; AktivniPozice = null; }
/// <summary> /// Zvýrazní políčko, přes které se bude skákat /// </summary> private void VykresliPolickoSkoku(Graphics Platno, Pozice Pozice) { VykresliPolicko(Platno, Pozice.Radek, Pozice.Sloupec, Policka.skok); }
/// <summary> /// Vrací všechny (i násobné) skoky jednoho obránce. /// </summary> private static Skoky VsechnySkoky(Pozice souradniceObrance, HraciDeska hraciDeska) { List<Tah> obrancovySkoky; Skoky skok = new Skoky(); skok.odkud = souradniceObrance; skok.skoky = null; obrancovySkoky = KamMuzeObranceSkocit(souradniceObrance, hraciDeska); if(obrancovySkoky.Count != 0) { skok.skoky = new List<Skoky>(); foreach(Tah tah in obrancovySkoky) { HraciDeska novaHraciDeska; novaHraciDeska = hraciDeska.Copy(); // novaHraciDeska = (HraciDeska) hraciDeska.Clone(); novaHraciDeska.Tahni(tah); novaHraciDeska.OdstranPreskoceneKameny(tah); Skoky novySkok = new Skoky(tah.seznamTahu[1], null); novySkok.deska = novaHraciDeska; skok.skoky.Add(novySkok); } HelpSkoky(skok); } return skok; }