Diskuze: Programovaní hry

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Nevim syntaxi pythonu (neznám ho), ale myslim ze bys mel do metod strength,
health a agility předávat help_var odkazem a ne hodnotou - dojde tim ke
"zkopírování" promene na nove místo v paměti a změny se po opuštění
funkce nepromítnou do help_var. Pokud ji předáš jako odkaz, dojde ke změně
i v hlavním while cyklu a pojede to Zkus pohledat tady nebi na netu předání odkazem vs předání
hodnotou
Myslím, že zatím pořád nechápeš OOP v Pythonu.
Toto je třída, která reprezentuje abstrakci objektu z reálného světa (například psa):
class Pes: pass
Díky ní můžeme vyrábět konkrétní objekty, psy Azora a Alíka:
alik = Pes()
azor = Pes()
Ale každý pes (objekt) se drobně liší v určitých vlastnostech (atributy objektu), takže upravíme třídu:
class Pes:
def __init__(self, jmeno, vek, majitel):
self.jmeno = jmeno
self.vek = vek
self.majitel = majitel
A použití:
alik = Pes("Alík", 2, "Novák")
azor = Pes("Azor", 5, "Notovný")
Do třídy jsme přidali metodu konstruktoru pro objekty. Konstuktor se zavolá, když se vytváří nový objekt dané třídy. Parametr self je právě ten nový objekt, kterému postupně přidáváme atributy a nastavujeme jejich výchozí hodnoty.
Bez metody konstruktoru by kód vypadal takto:
alik = Pes()
alik.jmeno = "Alik"
alik.vek = 2
alik.majitel = "Novák"
Na objektech stejné třídy můžeme mít volat nějaké metody. Například
zaštěkej, zestárni...
Metody pro objekty se ve třídě definují takto:
class Pes:
def __init__(self, jmeno, vek, majitel):
self.jmeno = jmeno
self.vek = vek
self.majitel = majitel
def zestarni(self, pocet):
self.vek = self.vek + pocet
Alík zestárne o 24 let, zatímco Azor, co létá kolem černé díry, zestárne o jeden rok.
alik.zestarni(24)
azor.zestarni(1)
Možná stále není jasné, proč musíme do metod ve třídě psát self. Je to proto, že Python ve skutečnosti volá toto:
Pes.zestarni(alik, 24)
Pes.zestarni(azor, 1)
Tudíž je třeba do metod objektů vkládat jako první parametr self. A přes něj pak můžeme přistupovat na jednotlivé atributy objektu (jelikož self = objekt, na kterém metodu voláme).
A nakonec, statické metody a atributy. Statické metody a atrubitu patří ke třídě, ne k objektu! Tudíž pro každý objekt jsou stejné.
Deklarují se takto:
class Pes:
druhove_jmeno = "Canis lupus familiaris"
...
Na ně se pak přistupuje převážně přes třídu:
print(Pes.druhove_jmeno) # vypíše Canis lupus familiaris
Ale lze i přes objekt:
print(alik.druhove_jmeno)
print(azor.druhove_jmeno)
Statické metody nemají parametr self, protože nedostávájí instanci objektu, jelikož se volají na třídě.
@staticmethod
def vrat_druhove_jmeno(): return druhove_jmeno
Proto je kód z větší části špatně.
Zbytečné závorky:
class Fighther():
Na třídě Set_skills voláš choice a jako parametr dáš tu samou třídu? O_o
def ability(self):
Set_skills.choice(Set_skills)
V této metodě sice změněné help_var vracíš, ale už s ním nic neděláš.
self.strength(help_var)
gcx11↑, ok díky ti za lepší vysvětliení, podívu se tedy znovu a zkusím to předělat
rdeak ↑, díky ti za takový postřeh. Hledal jsem na netu, rozdíl mě napadl hnedka, ale horší bylo to jak to napsat tak, aby to v Pythonu fungovalo.
Ještě sem potom nad tím dumal, a přišel jsem na toto. Ale je to takové látaní...
Nechci zde, dělat reklamu, ale kdo by řešil podobný problém tak jsem
čerpal z těchto infromací
→ https://edux.fit.cvut.cz/…funkceii.pdf
Takže, jsem vlastně udělal jen změnu, že jsem začal předávat parametr
odkazem místo hodnotou (viz str. 7 ↑)
Změnu kódu posílám, kdyby někdo někdy řešil podobný problém
class Set_skills(Fighther):
def choice(self):
help_var = [10]
print('Skills: ', help_var[0],
'\n================'
'\n1 - Strength'
'\n2 - Health'
'\n3 - Agility'
'\n4 - End (I do not extra skills :])'
'\n================')
while help_var[0] > 0:
print('Count skills:', help_var[0])
choice = int(input('Your choice [1--4]: '))
if choice == 1:
self.strength(help_var)
elif choice == 2:
self.health(help_var)
elif choice == 3:
self.agility(help_var)
elif choice == 4:
break
else:
print('Invalid choice!')
@classmethod
def strength(cls, help_var):
print('Count skills:', help_var[0])
x = [int(input('How many points skill you want add for STRENGTH:'))]
help_var[0] = help_var[0] - x[0]
print('Count skills:', help_var[0])
return help_var[0]
@classmethod
def health(cls, help_var):
print('Count skills:', help_var[0])
x = [int(input('How many points skill you want add for HEALTH:'))]
help_var[0] = help_var[0] - x[0]
print('Count skills:', help_var[0])
return help_var[0]
@classmethod
def agility(cls, help_var):
print('Count skills:', help_var[0])
x = [int(input('How many points skill you want add for AGILITY:'))]
help_var[0] = help_var[0] - x[0]
print('Count skills:', help_var[0])
return help_var[0]]
Což je strašný humus, předávat to jako pole. Úplně jednoduše by stačilo používat tu hodnotu, co si vracíš returnem.
Jo, každopádně jsem přehlédl to co zmiňuje gcx11. Vracíš si z funkcí
změněnou help_var pomoci return help_var. Takze by do původního kódu mělo
stačit změnit help_var = self.strength(help_var) a podobně u ostatních
Zobrazeno 7 zpráv z 7.