static void UstawStatkiAutomatycznie(Plansza plan, Flota flota) { while (flota.UstawioneC < 1) { try { int[] pola = WspolrzedneStatkuZAutomatu(4); flota.czteromasztowiec[flota.UstawioneC] = new Czteromasztowiec(); flota.czteromasztowiec[flota.UstawioneC].UstawStatek(plan.Plan[pola[0], pola[1]], plan.Plan[pola[2], pola[3]], plan); flota.UstawioneC++; } catch { } } while (flota.UstawioneT < 2) { try { int[] pola = WspolrzedneStatkuZAutomatu(3); flota.trzymasztowiec[flota.UstawioneT] = new Trzymasztowiec(); flota.trzymasztowiec[flota.UstawioneT].UstawStatek(plan.Plan[pola[0], pola[1]], plan.Plan[pola[2], pola[3]], plan); flota.UstawioneT++; } catch { } } while (flota.UstawioneD < 3) { try { int[] pola = WspolrzedneStatkuZAutomatu(2); flota.dwumasztowiec[flota.UstawioneD] = new Dwumasztowiec(); flota.dwumasztowiec[flota.UstawioneD].UstawStatek(plan.Plan[pola[0], pola[1]], plan.Plan[pola[2], pola[3]], plan); flota.UstawioneD++; } catch { } } while (flota.UstawioneJ < 4) { try { int[] pola = WspolrzedneStatkuZAutomatu(1); flota.jednomasztowiec[flota.UstawioneJ] = new Jednomasztowiec(); flota.jednomasztowiec[flota.UstawioneJ].UstawStatek(plan.Plan[pola[0], pola[1]], plan.Plan[pola[2], pola[3]], plan); flota.UstawioneJ++; } catch { } } }
static int[] KomputerPierwszyStrzal(Plansza planszaCel, Plansza planszaUkryta, List <Pole> wszystkiePola) { Random rnd = new Random(); int[] wspolrzedne = new int[3]; int strzal = 3; while (strzal == 3) { int index = rnd.Next(wszystkiePola.Count); wspolrzedne[0] = wszystkiePola[index].X; wspolrzedne[1] = wszystkiePola[index].Y; strzal = Strzelaj(planszaCel, planszaUkryta, wspolrzedne); } wspolrzedne[2] = strzal; return(wspolrzedne); }
static int Strzelaj(Plansza planszaCel, Plansza planszaUkryta, int[] wspolrzednePola) // 0 pudło. 1 Trafiony, 2 Zatopiony, 3 już strzelono w to miejsce { if ((wspolrzednePola[0] < 0 || wspolrzednePola[0] > 9) && (wspolrzednePola[1] < 0 || wspolrzednePola[1] > 9)) { Console.WriteLine("Strzał poza Planszę"); return(3); } if (planszaUkryta.SprawdzPole(wspolrzednePola[0], wspolrzednePola[1]) == '~') // jeśli nie strzelano jeszcze w to miejsce { if (planszaCel.SprawdzPole(wspolrzednePola[0], wspolrzednePola[1]) == '~') // pudło { planszaCel.Plan[wspolrzednePola[0], wspolrzednePola[1]].Status = 'o'; planszaUkryta.Plan[wspolrzednePola[0], wspolrzednePola[1]].Status = 'o'; Console.WriteLine($"Pudło! X: {wspolrzednePola[0]}, Y: {wspolrzednePola[1]}"); return(0); } else // trafienie { planszaCel.Plan[wspolrzednePola[0], wspolrzednePola[1]].Status = 'x'; planszaUkryta.Plan[wspolrzednePola[0], wspolrzednePola[1]].Status = 'x'; planszaCel.Plan[wspolrzednePola[0], wspolrzednePola[1]].Czesc.Trafiony = true; Console.WriteLine($"Trafiony! X: {wspolrzednePola[0]}, Y: {wspolrzednePola[1]}"); if (planszaCel.Plan[wspolrzednePola[0], wspolrzednePola[1]].Czesc.Statek.Zatopiony) { Console.WriteLine($"Zatopiony!!! X: {wspolrzednePola[0]}, Y: {wspolrzednePola[1]}"); foreach (var czesc in planszaCel.Plan[wspolrzednePola[0], wspolrzednePola[1]].Czesc.Statek.Czesc) { planszaCel.ZmienStatusSasiednichPol(czesc.Pole.X, czesc.Pole.Y); planszaUkryta.ZmienStatusSasiednichPol(czesc.Pole.X, czesc.Pole.Y); } return(2); } return(1); } } else { Console.WriteLine("Oddałeś już strzał w to pole lub zestrzeliłeś statek na sąsiednim polu. spróbuj jeszcze raz!"); return(3); } }
static bool StatekWPionie(int[] wspolrzedne, Plansza planszaUkryta) // szukaj sasiedniego pola do wsp. oznaczonego x { if (wspolrzedne[0] < 9 && planszaUkryta.Plan[wspolrzedne[0] + 1, wspolrzedne[1]].Status == 'x') { return(false); //poziom } if (wspolrzedne[0] > 0 && planszaUkryta.Plan[wspolrzedne[0] - 1, wspolrzedne[1]].Status == 'x') { return(false); } if (wspolrzedne[1] < 9 && planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] + 1].Status == 'x') { return(true); // pion } if (wspolrzedne[1] > 0 && planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] - 1].Status == 'x') { return(true); } return(true); // nigdy nie powinno zostać zwrócone }
static List <Pole> GetPotencjalneStrzalyKomputera(int[] wspolrzedne, Plansza planszaUkryta) { List <Pole> lista = new List <Pole>(); if (wspolrzedne[0] < 9 && planszaUkryta.Plan[wspolrzedne[0] + 1, wspolrzedne[1]].Status == '~') { lista.Add(planszaUkryta.Plan[wspolrzedne[0] + 1, wspolrzedne[1]]); } if (wspolrzedne[0] > 0 && planszaUkryta.Plan[wspolrzedne[0] - 1, wspolrzedne[1]].Status == '~') { lista.Add(planszaUkryta.Plan[wspolrzedne[0] - 1, wspolrzedne[1]]); } if (wspolrzedne[1] < 9 && planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] + 1].Status == '~') { lista.Add(planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] + 1]); } if (wspolrzedne[1] > 0 && planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] - 1].Status == '~') { lista.Add(planszaUkryta.Plan[wspolrzedne[0], wspolrzedne[1] - 1]); } return(lista); }
public void UstawStatek(Pole pocz, Pole kon, Plansza plan) { if (CzyMoznaUmiescic(pocz, kon, plan)) { for (int i = 0; i < Maszty; i++) { if (Kierunek == 'n') { plan.ZmienStatusPola(pocz.X, pocz.Y - i, Rodzaj); Czesc[i].Pole = plan.Plan[pocz.X, pocz.Y - i]; //przypisanie pola do cz statku plan.Plan[pocz.X, pocz.Y - i].Czesc = Czesc[i]; //przypisanie cz statku do pola } if (Kierunek == 's') { plan.ZmienStatusPola(pocz.X, pocz.Y + i, Rodzaj); Czesc[i].Pole = plan.Plan[pocz.X, pocz.Y + i]; //przypisanie pola do cz statku plan.Plan[pocz.X, pocz.Y + i].Czesc = Czesc[i]; //przypisanie cz statku do pola } if (Kierunek == 'e') { plan.ZmienStatusPola(pocz.X + i, pocz.Y, Rodzaj); Czesc[i].Pole = plan.Plan[pocz.X + i, pocz.Y]; //przypisanie pola do cz statku plan.Plan[pocz.X + i, pocz.Y].Czesc = Czesc[i]; //przypisanie cz statku do pola } if (Kierunek == 'w') { plan.ZmienStatusPola(pocz.X - i, pocz.Y, Rodzaj); Czesc[i].Pole = plan.Plan[pocz.X - i, pocz.Y]; //przypisanie pola do cz statku plan.Plan[pocz.X - i, pocz.Y].Czesc = Czesc[i]; //przypisanie cz statku do pola } } } else { throw new Exception("Nie można umieścić statku!"); } }
public CzescStatku(int x, int y, char rodzaj, Plansza poleNaPlanszy) { Pole = poleNaPlanszy.Plan[x, y]; Rodzaj = rodzaj; Trafiony = false; }
static void Main(string[] args) { Plansza gracz = new Plansza(); Plansza komputer = new Plansza(); Plansza ukrytaGracz = new Plansza(); Plansza ukrytaKomputer = new Plansza(); gracz.Wyswietl(); Flota gracza = new Flota(); Flota komputera = new Flota(); //logika komputer List <Pole> potencjalneStrzalyKomputera = new List <Pole>(); while (true) { Console.WriteLine("\nWybierz:\n" + $"1. Ustaw statki, pozostało: Jednomasztowiec * {4 - gracza.UstawioneJ}, Dwumasztowiec * {3 - gracza.UstawioneD}, Trzymasztowiec * {2 - gracza.UstawioneT}, Czteromasztowiec *{1 - gracza.UstawioneC}\n" + "2. Rozstaw statki automatycznie\n" + "3. Wyswietl Swoją Planszę\n" + "4. Rozpocznij grę\n" + "0. Wyjscie\n" ); int wybor; while (!int.TryParse(Console.ReadLine(), out wybor)) { Console.WriteLine("\nPodałeś zły znak! wpisz jeszcze raz!"); Console.WriteLine("\nWybierz:\n" + $"1. Ustaw statki, pozostało: Jednomasztowiec * {4 - gracza.UstawioneJ}, Dwumasztowiec * {3 - gracza.UstawioneD}, Trzymasztowiec * {2 - gracza.UstawioneT}, Czteromasztowiec *{1 - gracza.UstawioneC}\n" + "2. Rozstaw statki automatycznie\n" + "3. Wyswietl Swoją Planszę\n" + "4. Rozpocznij grę\n" + "0. Wyjscie\n" ); } switch (wybor) { case 1: int[] pole = PodajWspolrzednePol(); if (PoliczOdlegloscMiedzyPolami(pole) == 4) { if (gracza.UstawioneC < 1) { try { gracza.czteromasztowiec[gracza.UstawioneC] = new Czteromasztowiec(); gracza.czteromasztowiec[gracza.UstawioneC].UstawStatek(gracz.Plan[pole[0], pole[1]], gracz.Plan[pole[2], pole[3]], gracz); gracza.UstawioneC++; } catch (Exception e) { Console.WriteLine("Cos poszlo nietak " + e); } } else { Console.WriteLine("Ustawiłeś już maksymalną liczbę tego rodzaju statku"); } } if (PoliczOdlegloscMiedzyPolami(pole) == 3) { if (gracza.UstawioneT < 2) { try { gracza.trzymasztowiec[gracza.UstawioneT] = new Trzymasztowiec(); gracza.trzymasztowiec[gracza.UstawioneT].UstawStatek(gracz.Plan[pole[0], pole[1]], gracz.Plan[pole[2], pole[3]], gracz); gracza.UstawioneT++; } catch (Exception e) { Console.WriteLine("Cos poszlo nietak " + e); } } else { Console.WriteLine("Ustawiłeś już maksymalną liczbę tego rodzaju statku"); } } if (PoliczOdlegloscMiedzyPolami(pole) == 2) { if (gracza.UstawioneD < 3) { try { gracza.dwumasztowiec[gracza.UstawioneD] = new Dwumasztowiec(); gracza.dwumasztowiec[gracza.UstawioneD].UstawStatek(gracz.Plan[pole[0], pole[1]], gracz.Plan[pole[2], pole[3]], gracz); gracza.UstawioneD++; } catch (Exception e) { Console.WriteLine("Cos poszlo nietak " + e); } } else { Console.WriteLine("Ustawiłeś już maksymalną liczbę tego rodzaju statku"); } } if (PoliczOdlegloscMiedzyPolami(pole) == 1) { if (gracza.UstawioneJ < 4) { try { gracza.jednomasztowiec[gracza.UstawioneJ] = new Jednomasztowiec(); gracza.jednomasztowiec[gracza.UstawioneJ].UstawStatek(gracz.Plan[pole[0], pole[1]], gracz.Plan[pole[2], pole[3]], gracz); gracza.UstawioneJ++; } catch (Exception e) { Console.WriteLine("Cos poszlo nietak " + e); } } else { Console.WriteLine("Ustawiłeś już maksymalną liczbę tego rodzaju statku"); } } if (PoliczOdlegloscMiedzyPolami(pole) <= 0) { Console.WriteLine("Statek nie jest w Pionie lub Poziomie!"); } gracz.Wyswietl(); break; case 2: UstawStatkiAutomatycznie(gracz, gracza); gracz.Wyswietl(); break; case 3: gracz.Wyswietl(); break; case 4: if (10 - gracza.UstawioneJ - gracza.UstawioneD - gracza.UstawioneT - gracza.UstawioneC == 0) // jeśli rozstawiłeś już statki { UstawStatkiAutomatycznie(komputer, komputera); while (true) { Console.WriteLine("\nWybierz:\n" + $"1. Strzelaj\n" + "2. Statystyka\n" + "3. Wyswietl Swoją Planszę\n" + "4. Wyswietl Plansze Cel\n" + "0. Wyjscie\n" ); int wybor2; while (!int.TryParse(Console.ReadLine(), out wybor2)) { Console.WriteLine("\nPodałeś zły znak! wpisz jeszcze raz!"); Console.WriteLine("\nWybierz:\n" + $"1. Strzelaj\n" + "2. Statystyka\n" + "3. Wyswietl Swoją Planszę\n" + "4. Wyswietl Plansze Cel\n" + "0. Wyjscie\n" ); } switch (wybor2) { case 1: int s = 3; // sprawdza czystrzał się udał s = Strzelaj(komputer, ukrytaGracz, PodajWspolrzedneJednegoPola("do strzału")); if (komputera.Zatopienia == 10) { Console.WriteLine("!!!!!WYGRAŁEŚ!!!!!"); Console.WriteLine(gracza.Statystyka("Gracz ")); Console.WriteLine(komputera.Statystyka("Komputer ")); Console.ReadKey(); return; } if (s != 3) { Console.WriteLine("Strzał Komputera"); potencjalneStrzalyKomputera = KomputerStrzela(gracz, ukrytaKomputer, potencjalneStrzalyKomputera); if (gracza.Zatopienia == 10) { Console.WriteLine("!!!!! =((((( PRZEGRAŁEŚ =((((( !!!!!"); Console.WriteLine(gracza.Statystyka("Gracz ")); Console.WriteLine(komputera.Statystyka("Komputer ")); Console.ReadKey(); return; } } break; case 2: Console.WriteLine(gracza.Statystyka("Gracz ")); Console.WriteLine(komputera.Statystyka("Komputer ")); break; case 3: gracz.Wyswietl(); break; case 4: ukrytaGracz.Wyswietl(); break; case 0: return; default: Console.WriteLine("Nie ma takiej opcji w Menu"); break; } } } else { Console.WriteLine("Nie rozstawiłeś wszystkich statków"); } break; case 0: return; default: Console.WriteLine("Nie ma takiej opcji w Menu"); break; } } }
static List <Pole> KomputerStrzela(Plansza planszaCel, Plansza planszaUkryta, List <Pole> potencjalneStrzaly) { List <Pole> wszystkiePola = new List <Pole>(); foreach (var pole in planszaUkryta.Plan) // zgarnia wszystkie możliwe do strzału pola { if (pole.Status == '~') { wszystkiePola.Add(pole); } } int[] wspolrzedne = new int[3]; // {x,y, wynik strzalu} if (!potencjalneStrzaly.Any()) // jeśli nie ma podejrzanych pol { wspolrzedne = KomputerPierwszyStrzal(planszaCel, planszaUkryta, wszystkiePola); // tu strzela int[] strzal = new[] { wspolrzedne[0], wspolrzedne[1] }; if (wspolrzedne[2] == 1) // trafiony { potencjalneStrzaly.AddRange(GetPotencjalneStrzalyKomputera(strzal, planszaUkryta)); } } else // jeśli są potencjalne strzały { Random rnd = new Random(); int strzal = 3; while (strzal == 3) { int index = rnd.Next(potencjalneStrzaly.Count); wspolrzedne[0] = potencjalneStrzaly[index].X; wspolrzedne[1] = potencjalneStrzaly[index].Y; strzal = Strzelaj(planszaCel, planszaUkryta, wspolrzedne); if (strzal == 0) //pudlo - wykreśl pole z listy potencjalnych strzałów { potencjalneStrzaly.RemoveAt(index); } else if (strzal == 1) // kolejny trafiony { int[] namiary = new[] { wspolrzedne[0], wspolrzedne[1] }; potencjalneStrzaly.AddRange(GetPotencjalneStrzalyKomputera(namiary, planszaUkryta)); //kasuje obecny z listy potencjalneStrzaly.RemoveAt(index); if (StatekWPionie(namiary, planszaUkryta)) { Console.WriteLine("Pion"); potencjalneStrzaly = potencjalneStrzaly.Where(x => x.X == wspolrzedne[0]).ToList(); } else { Console.WriteLine("Poziom"); potencjalneStrzaly = potencjalneStrzaly.Where(x => x.Y == wspolrzedne[1]).ToList(); } } else if (strzal == 2) // zatopiony { potencjalneStrzaly.Clear(); } } } /* // Na potrzeby testów komputera * Console.WriteLine("Obecny"); * Console.WriteLine($"X: {wspolrzedne[0]}, Y: {wspolrzedne[1]}"); * * Console.WriteLine("Potencjalne ////////////////"); * foreach (var ps in potencjalneStrzaly) * { * Console.WriteLine(ps.ToString()); * } */ return(potencjalneStrzaly); }
public bool CzyMoznaUmiescic(Pole pocz, Pole kon, Plansza plan) { int dlugosc = 0; //czy poczatek i koniec na planszy if (pocz.X < 10 && pocz.X >= 0 && pocz.Y < 10 && pocz.Y >= 0 && kon.X < 10 && kon.X >= 0 && kon.Y < 10 && kon.Y >= 0) { //czy w pionie if (pocz.X - kon.X == 0) { dlugosc = Math.Abs(pocz.Y - kon.Y) + 1; if (pocz.Y - kon.Y < 0) { Kierunek = 's'; } else { Kierunek = 'n'; } } //czy w poziomie else if (pocz.Y - kon.Y == 0) { dlugosc = Math.Abs(pocz.X - kon.X) + 1; if (pocz.X - kon.X < 0) { Kierunek = 'e'; } else { Kierunek = 'w'; } } else if (pocz.Y - kon.Y != 0 && pocz.X - kon.X != 0) { throw new Exception("Statek nie jest w Pionie lub Poziomie! Lub jest poza Planszą"); } if (dlugosc == Maszty) { if (Kierunek == 'n') { for (int i = 0; i < Maszty; i++) { if (plan.SprawdzPole(pocz.X, pocz.Y - i) != '~' || plan.SprawdzSasiedniePola(pocz.X, pocz.Y - i) != true) { throw new Exception("Statek na tych bądź sąsiednich polach już został ustawiony!"); } } return(true); } if (Kierunek == 's') { for (int i = 0; i < Maszty; i++) { if (plan.SprawdzPole(pocz.X, pocz.Y + i) != '~' || plan.SprawdzSasiedniePola(pocz.X, pocz.Y + i) != true) { throw new Exception("Statek na tych bądź sąsiednich polach już został ustawiony!"); } } return(true); } if (Kierunek == 'e') { for (int i = 0; i < Maszty; i++) { if (plan.SprawdzPole(pocz.X + i, pocz.Y) != '~' || plan.SprawdzSasiedniePola(pocz.X + i, pocz.Y) != true) { throw new Exception("Statek na tych bądź sąsiednich polach już został ustawiony!"); } } return(true); } if (Kierunek == 'w') { for (int i = 0; i < Maszty; i++) { if (plan.SprawdzPole(pocz.X - i, pocz.Y) != '~' || plan.SprawdzSasiedniePola(pocz.X - i, pocz.Y) != true) { throw new Exception("Statek na tych bądź sąsiednich polach już został ustawiony!"); } } return(true); } } else { throw new Exception("Statek niewymiarowy!"); } } else { throw new Exception("Wyszedłeś poza Plansze"); } return(false); }