Compare commits

..

No commits in common. "582b86edd16225b74ea7a9fd787c9feb56da73a4" and "7869bd002b403b1d7d390ef225ce868e1de9e791" have entirely different histories.

8 changed files with 62 additions and 166 deletions

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12 (projekt_gra_turowa)" />
</component>
</project>

View File

@ -2,13 +2,11 @@ from abc import ABC
class Jednostka(ABC):
def __init__(self, zdrowie, sila_ataku, zasieg_ataku, szybkosc_ruchu, imie):
self.nazwa = ''
def __init__(self, zdrowie, sila_ataku, zasieg_ataku, szybkosc_ruchu):
self.zdrowie = zdrowie
self.sila_ataku = sila_ataku
self.zasieg_ataku = zasieg_ataku
self.szybkosc_ruchu = szybkosc_ruchu
self.imie = imie
def otrzymaj_obrazenia(self, obrazenia):
print(f'Zadano {obrazenia} obrażeń')
@ -20,7 +18,6 @@ class Jednostka(ABC):
return False
def wyswietl_stan(self):
print(self.nazwa)
print(f'Zdrowie: {self.zdrowie}')
print(f'Sila: {self.sila_ataku}')
print(f'Zasieg: {self.zasieg_ataku}')

View File

@ -2,12 +2,12 @@ from jednostka import Jednostka
class Kusznik(Jednostka):
def __init__(self, imie):
super().__init__(80, 15, 2, 2, imie)
self.nazwa = 'Kusznik'
def __init__(self):
super().__init__(80, 15, 2, 5)
def __str__(self):
return 'K'
def wyswietl_stan(self):
print('Kusznik')
super().wyswietl_stan()

View File

@ -2,12 +2,12 @@ from jednostka import Jednostka
class Lucznik(Jednostka):
def __init__(self, imie):
super().__init__(60, 10, 3, 3, imie)
self.nazwa = 'Lucznik'
def __init__(self):
super().__init__( 60, 10, 3, 9)
def __str__(self):
return 'L'
def wyswietl_stan(self):
print('Łucznik')
super().wyswietl_stan()

106
main.py
View File

@ -4,106 +4,22 @@ from lucznik import Lucznik
from kusznik import Kusznik
from piechur import Piechur
jednostki = []
def wiecej_niz_jeden_zywy():
licznik = 0
for i in jednostki:
if i.czy_zyje():
licznik += 1
return licznik > 1
def waliduj_opcje(opcja):
return 1 <= opcja <= 2
def wprowadz_wspolrzedna(w):
a = int(input(f'Podaj wspolrzedna {w}: '))
return a
def waliduj_wspolrzedna(a):
return 0 <= a <= 4
def wyswietl_jednostki():
for i in range(len(jednostki)):
print(f'{i} - {jednostki[i]}')
def waliduj_cel(x):
return 0 <= x <= (len(jednostki) - 1)
def wybierz_opcje():
opcja = -1
wybrano_opcje = False
while True:
print('Wybierz opcje: ')
print(f'1. Ruch')
print(f'2. Atak')
opcja = int(input('Wprowadz opcje:'))
wybrano_opcje = waliduj_opcje(opcja)
if wybrano_opcje:
break
return opcja
def wykonaj_ruch():
wykonano_ruch = False
while True:
x = wprowadz_wspolrzedna('x')
y = wprowadz_wspolrzedna('y')
if waliduj_wspolrzedna(x) and waliduj_wspolrzedna(y):
wykonano_ruch = plansza.rusz_jednostke(jednostka, x, y)
else:
print('Ups! Nieprawidlowe wspolrzedne. Podaj jeszcze raz')
if wykonano_ruch:
break
def wykonaj_atak():
wykonano_ruch = False
while True:
wyswietl_jednostki()
indeks_celu = int(input('Kogo atakujesz?'))
if waliduj_cel(indeks_celu):
wykonano_ruch = plansza.wykonaj_atak(jednostka, jednostki[indeks_celu])
else:
print('Ups! Nieprawidłowy cel. Podaj jeszcze raz')
if wykonano_ruch:
break
if __name__ == '__main__':
plansza = Plansza()
r1 = Rycerz('Lukasz')
l1 = Lucznik('Sebastian')
r1 = Rycerz()
l1 = Lucznik()
k1 = Kusznik()
p1 = Piechur()
jednostki = [r1, l1]
plansza.dodaj_jednostke(r1, 1, 1)
plansza.dodaj_jednostke(l1, 2, 1)
plansza.dodaj_jednostke(r1, 0, 0)
plansza.dodaj_jednostke(l1, 4, 4)
plansza = Plansza()
print('Jednostki zostaly rozstawiona. Niech rozpocznie sie walka')
while wiecej_niz_jeden_zywy():
for jednostka in jednostki:
plansza.wyswietl()
print(f'Tura {jednostka.nazwa} {jednostka.imie}')
jednostka.wyswietl_stan()
plansza.dodaj_jednostke(k1, 5, 5)
plansza.dodaj_jednostke(p1, 3, 5)
opcja = wybierz_opcje()
plansza.wykonaj_atak(r1, l1)
if opcja == 1:
wykonaj_ruch()
elif opcja == 2:
wykonaj_atak()
l1.wyswietl_stan()

View File

@ -2,12 +2,12 @@ from jednostka import Jednostka
class Piechur(Jednostka):
def __init__(self, imie):
super().__init__(80, 15, 1, 1.5, imie)
self.nazwa = 'Piechur'
def __init__(self):
super().__init__(80, 15, 1, 7)
def __str__(self):
return 'P'
def wyswietl_stan(self):
print('Piechur')
super().wyswietl_stan()

View File

@ -5,77 +5,38 @@ class Plansza:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not hasattr(self, '_initialized'):
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):
x -= 1
y -= 1
if self.czy_zajete(x, y):
print('Nie mozna dodać jednostki na tym polu')
else:
self.pole[x][y] = jednostka
self.wyswietl()
def usun_jednostke(self, x, y):
x -= 1
y -= 1
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
self.wyswietl()
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):
@ -83,3 +44,31 @@ class Plansza:
print(self.pole[x][y], end=' ')
print()
print()
def wykonaj_atak(self, atakujacy, cel):
if self.sprawdz_zasieg(atakujacy, cel):
cel.otrzymaj_obrazenia(self.oblicz_obrazenia(atakujacy, cel))
else:
print('Cel jest za daleko')
def sprawdz_zasieg(self, atakujacy, cel):
x1, y1 = self.znajdz(atakujacy)
x2, y2 = self.znajdz(cel)
dystans = math.sqrt(math.pow(math.fabs(x1 - x2), 2) + math.pow(math.fabs(y1- y2), 2))
dystans = round(dystans, 0)
if atakujacy.zasieg_ataku >= dystans:
return True
else:
return False
def oblicz_obrazenia(self, atakujacy, cel):
obrazenia = atakujacy.sila_ataku
return obrazenia
def znajdz(self, jednostka):
for y in range(5):
for x in range(5):
if self.pole[x][y] == jednostka:
return x, y

View File

@ -2,12 +2,12 @@ from jednostka import Jednostka
class Rycerz(Jednostka):
def __init__(self, imie):
super().__init__(100, 20, 1, 1, imie)
self.nazwa = 'Rycerz'
def __init__(self):
super().__init__(100, 20, 1, 5)
def __str__(self):
return 'R'
def wyswietl_stan(self):
print('Rycerz')
super().wyswietl_stan()