import math class Plansza: _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance def __init__(self): if not hasattr(self, '_initialized'): self.pole = [['O' for x in range(5)] for y in range(5)] self._initialized = True def dodaj_jednostke(self, jednostka, x, y): if self.czy_zajete(x, y): print('Nie mozna dodać jednostki na tym polu') else: self.pole[x][y] = jednostka def usun_jednostke(self, x, y): if self.czy_zajete(x, y): self.pole[x][y] = 'O' else: print('To pole juz jest puste') def rusz_jednostke(self, jednostka, x, y): x1, y1 = self.znajdz(jednostka) if self.czy_zajete(x, y): print('Nie mozna ruszyc jednostki na to pole - pole zajete') return False else: dystans = self.sprawdz_dystans(x1, y1, x, y) if dystans <= jednostka.szybkosc_ruchu: self.dodaj_jednostke(jednostka, x, y) self.usun_jednostke(x1, y1) return True else: print('Nie mozna ruszyc jednostki na to pole - za duzy dystans') return False def wykonaj_atak(self, atakujacy, cel): if self.sprawdz_zasieg(atakujacy, cel): cel.otrzymaj_obrazenia(self.oblicz_obrazenia(atakujacy, cel)) return True else: print('Cel jest za daleko') return False def sprawdz_zasieg(self, atakujacy, cel): x1, y1 = self.znajdz(atakujacy) x2, y2 = self.znajdz(cel) dystans = self.sprawdz_dystans(x1, y1, x2, y2) return atakujacy.zasieg_ataku >= dystans def sprawdz_dystans(self, x1, y1, x2, y2): dystans = math.sqrt(math.pow(math.fabs(x1 - x2), 2) + math.pow(math.fabs(y1 - y2), 2)) return round(dystans, 0) def oblicz_obrazenia(self, atakujacy, cel): obrazenia = atakujacy.sila_ataku return obrazenia def czy_zajete(self, x, y): if self.pole[x][y] == 'O': return False return True def znajdz(self, jednostka): for y in range(5): for x in range(5): if self.pole[x][y] == jednostka: return x, y def wyswietl(self): print() for y in range(5): for x in range(5): print(self.pole[x][y], end=' ') print() print()