Kockadobás probléma

Minap belefutottam egy érdekes esetbe. Sokfajta megoldást találhatunk a dologra, én ennél maradtam.

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
Kezdjünk is hozzá, legyen az osztályunk neve AttributeGenerator:
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á :)

2 megjegyzés:

  1. Van valami különösebb oka, hogy range-t használtál xrange helyett?

    VálaszTörlés
  2. Igen, vagyis nem :D
    Inká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.

    VálaszTörlés