A probléma:
Egy rpg-szerű játék karaktergenerálásához a karakter tulajdonságait kockadobással kell megállapítani. Ehhez hatoldalú kockát használnak, de a dobálgatási idő lerövidítése érdekében egy kis program nyújtana segítséget.
Minden tulajdonság kockadobásos értékét úgy kapjuk, hogy dobunk 4x a kockával, a legkisebb dobást eldobjuk, majd a maradék hármat összeadjuk.
A legkézenfekvőbb dolog, hogy kreáljunk egy osztályt erre a feladatra, amit így akár több játéknál is fel tudunk használni.
Mit kell tudjon az osztályunk?
- egy objektum létrehozásakor addhassuk meg, hogy hány oldalú dobókockát használunk (szerepjátékos berkekben van 4, 6, 8, 10, 20 oldalú "dobókocka" is), adhassuk meg a tulajdonságok listáját, és a tulajdonság megállapításához szükséges dobások számát
- legyen egy metódus amivel új tulajdonságokat tudunk "dobni", azaz kreálni
import random class AttributeGenerator(): def __init__(self,dicesize=6,rollno=4,attributelist=[]): self.dicesize=dicesize self.rollno=rollno self.attributelist=attributelist def roll(self): return random.randint(1, self.dicesize) def rollAtt(self): dices=[ self.roll() for i in range(self.rollno)] return sum(dices)-min(dices) def genAtts(self): attdict={} for key in self.attributelist: attdict[key]=self.rollAtt() return attdict
Az __init__-ünk nem csinál mást, mint objektumváltozókat hoz létre példányosításkor, így akár egyidőben többféle generátort is munkában tarthatunk.
A roll metódus egyszerűen egy kockadobást végez és ad vissza, így akár erre is használhatjuk az objektumunkat.
A rollAtt a dobások számának megfelelően elvégzi a dobásokat, összeadja őket, majd ebből kivonja a legkisebb dobás értékét, így valosítva meg az igényünket, azaz, hogy a legkisebb kockadobást "eldobjuk".
A genAtts végiglépked a tulajdonságok listáján, és letrehoz egy dict-et, amiben a tulajdonsághoz legenerálja annak értékét, majd visszaadja nekünk ezt a szótárat (dict-et).
Nézzük az eredményt:
>>> from attributegenerator import * >>> newgen=AttributeGenerator(6,4,['att1','att2']) >>> newgen.genAtts() {'att2': 9, 'att1': 14}
Működik! Hurrá :)
Van valami különösebb oka, hogy range-t használtál xrange helyett?
VálaszTörlésIgen, vagyis nem :D
VálaszTörlésInkább azt mondanám, hogy nincs különösebb ok arra, hogy az xrange-et használjam range helyett.
Emiatt:
"xrange([start], stop[, step])
This function is very similar to range(), but returns an “xrange object” instead of a list."
Itt nekem listára van szükségem csupán a for-ban, nem pedig xrange objektumra.