//Metoda pri zasahu lode kontroluje vedlejsi policka private void LogikaPocitace() { if (Policko == HerniPrvek.Lod) { //odkryvani policek smerem do prava if (smerDoPrava) { AktualniPozice = new Pozice(AktualniPozice.X + 1, AktualniPozice.Y); //pokud je hadana pozice odkryta, odkryva do leva if (!seznamPozic.Contains(AktualniPozice) && VelikostZasazeneLode > 0) { while (!seznamPozic.Contains(AktualniPozice)) { AktualniPozice = new Pozice(AktualniPozice.X - 1, AktualniPozice.Y); } smerDoPrava = false; //zmeni smer odkryvani do leva } } else { //odkryvani policek do leva AktualniPozice = new Pozice(AktualniPozice.X - 1, AktualniPozice.Y); } } else if ((Policko == HerniPrvek.Voda) && (VelikostZasazeneLode > 0)) { smerDoPrava = false; do { AktualniPozice = new Pozice(AktualniPozice.X - 1, AktualniPozice.Y); }while (!seznamPozic.Contains(AktualniPozice)); } }
/// <summary> /// Metoda pro vykresleni pozic ktere zadal pocitac /// </summary> public override void Hraje() { //nastaveni smeru odkryvani if (!Logika) { smerDoPrava = true; } if (Logika) { LogikaPocitace(); } else { pozice = hadanaPozice.Next(0, seznamPozic.Count); AktualniPozice = seznamPozic[pozice]; } bool stisknutaKlavesa = false; Console.SetCursorPosition(herniPlocha.SirkaX + 35, 5); Console.WriteLine("Počítač zadal: " + herniPlocha.legenda[AktualniPozice.X] + " , " + herniPlocha.legenda[AktualniPozice.Y]); Console.SetCursorPosition(herniPlocha.SirkaX + 35, 8); Console.WriteLine("<<< Stiskni Mezerník >>>"); Console.SetCursorPosition(herniPlocha.SirkaX + 35, 13); Console.Write("Nápověda"); Console.SetCursorPosition(herniPlocha.SirkaX + 35, 14); Console.Write("======================"); Console.SetCursorPosition(herniPlocha.SirkaX + 35, 15); Console.Write("Hru ukončíš [ESC] "); while (!stisknutaKlavesa) { klavesa = Console.ReadKey(true); if (klavesa.Key == ConsoleKey.Escape) { UkonceniHry = true; stisknutaKlavesa = true; } else if (klavesa.Key == ConsoleKey.Spacebar) //Hra pokracuje pri stisku mezerniku { OdkryjPolicko(AktualniPozice.X, AktualniPozice.Y); seznamPozic.Remove(AktualniPozice); stisknutaKlavesa = true; } } }
/// <summary> /// Metoda RozmistiLode, rozmisti lode na herni plochu /// </summary> public void RozmistiLode() { aktualniLod = new Random(); aktualniPozice = new Random(); bool vyhledava = true; while (vyhledava) { int vybranaPozice = aktualniPozice.Next(0, seznamPozic.Count); //Vygeneruje volnou pozici int vybranaLod = aktualniLod.Next(0, seznamTypLodi.Count); //Vygeneruje lod ktera se ma umistit na herni plochu Pozice pomPozice = seznamPozic[vybranaPozice]; switch (seznamTypLodi[vybranaLod]) //Podle vybrane lodi ji vykresli na hraci plochu { case Lode.bitevniLod: UmistiLod(Lode.bitevniLod, pomPozice); break; case Lode.kriznik: UmistiLod(Lode.kriznik, pomPozice); break; case Lode.letadlovaLod: UmistiLod(Lode.letadlovaLod, pomPozice); break; case Lode.ponorka: UmistiLod(Lode.ponorka, pomPozice); break; case Lode.torpedoborec: UmistiLod(Lode.torpedoborec, pomPozice); break; } //Je-li seznam lodi prazdny ukonci rozmistovani lodi if (seznamTypLodi.Count == 0) { vyhledava = false; } } }
/// <summary> /// Metoda slouzi k umisteni lode na herni plochu /// </summary> /// <param name="aktualniLod">Umisti predanou lod</param> /// <param name="pomPozice">Umisteni na predane pozice</param> private void UmistiLod(Lode aktualniLod, Pozice pomPozice) { for (int i = 0; i < seznamLodi.Count; i++) { if (seznamLodi[i].TypLode == aktualniLod) { if (!seznamLodi[i].Rozmistena) { //Kontrola zda je pozice volna if (VolnaPozice(seznamLodi[i].VelikostLode, pomPozice)) { for (int x = 0; x < seznamLodi[i].VelikostLode; x++) { herniPrvek[pomPozice.X + x, pomPozice.Y] = HerniPrvek.Lod; seznamLodi[i][x] = new Pozice(pomPozice.X + x, pomPozice.Y); //ulozi do indexeru pozici lode } seznamPozic.Remove(pomPozice); //Vymaze pozici ze seznamu seznamTypLodi.Remove(seznamLodi[i].TypLode); //Vymaze lod ze seznamu seznamLodi[i].Rozmistena = true; } } } } }
/// <summary> /// Metoda VolnaPozice zkontroluje zda je pozice volna /// </summary> /// <param name="velLode">Udava velikost umistovane lode</param> /// <param name="pomomocnaPozice">Slouzi ke kontrole vedlejsich pozic</param> /// <returns>Vraci true pokud je pozice volna a kdyz je pozice obsazena tak vraci false</returns> private bool VolnaPozice(int velLode, Pozice pomomocnaPozice) { prazdnaPozice = false; int pomX, pomY; //kontroluje zda se pozice vyskytuje na pozici na zacatku v rohu a v rohu na x = 0 if ((pomomocnaPozice.X == 0 && pomomocnaPozice.Y == 0) || (pomomocnaPozice.X == 0 && pomomocnaPozice.Y == (vyska - 1))) { //kontrola pozice na zacatku v rohu if (pomomocnaPozice.Y == 0) { for (int y = 0; y < 2; y++) { for (int x = 0; x < velLode + 1; x++) { if (herniPrvek[pomomocnaPozice.X + x, pomomocnaPozice.Y + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } //Kontrola pozice v rohu na hore, na zacatku else if (pomomocnaPozice.Y == (vyska - 1)) { pomY = pomomocnaPozice.Y - 1; for (int y = 0; y < 2; y++) { for (int x = 0; x < velLode + 1; x++) { if (herniPrvek[pomomocnaPozice.X + x, pomY + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } } //Kontrola pozice dole na kraji a nahore na kraji if ((pomomocnaPozice.Y == 0 && pomomocnaPozice.X > 0) && (pomomocnaPozice.X + velLode) <= (sirka - 1) || (pomomocnaPozice.X > 0 && pomomocnaPozice.Y == (vyska - 1)) && (pomomocnaPozice.X + velLode) <= (sirka - 1)) { if (pomomocnaPozice.Y == 0) { pomX = pomomocnaPozice.X - 1; for (int y = 0; y < 2; y++) { for (int x = 0; x < velLode + 2; x++) { if (herniPrvek[pomX + x, pomomocnaPozice.Y + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } else if (pomomocnaPozice.Y == (vyska - 1)) { pomX = pomomocnaPozice.X - 1; pomY = pomomocnaPozice.Y - 1; for (int y = 0; y < 2; y++) { for (int x = 0; x < velLode + 2; x++) { if (herniPrvek[pomX + x, pomY + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } } //Kontroluje pozice v prostoru v poli if (pomomocnaPozice.X != 0 && pomomocnaPozice.Y != 0 && (pomomocnaPozice.X + velLode) <= (sirka - 1) && pomomocnaPozice.Y != (vyska - 1)) { pomX = pomomocnaPozice.X - 1; pomY = pomomocnaPozice.Y - 1; for (int y = 0; y < 3; y++) { for (int x = 0; x < velLode + 2; x++) { if (herniPrvek[pomX + x, pomY + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } //Kontrola pozice na kraji if (pomomocnaPozice.X == 0 && pomomocnaPozice.Y != 0 && pomomocnaPozice.Y < (vyska - 1)) { pomY = pomomocnaPozice.Y - 1; for (int y = 0; y < 3; y++) { for (int x = 0; x < velLode + 1; x++) { if (herniPrvek[pomomocnaPozice.X + x, pomY + y] == HerniPrvek.Voda) { prazdnaPozice = true; } else { prazdnaPozice = false; break; } } if (prazdnaPozice == false) { break; } } } return(prazdnaPozice); //vraci true jestli je pozice volna A false kdyz je pozice obsazena }