Sedaj, ko imamo razred Igralec
, želimo iz objekta Komplet
razdeliti karte igralcem. Na prvi pogled ni jasno, ali naj to metodo dodamo razredu Igralec
ali razredu Komplet
, toda ker deluje nad enim kompletom kart in (verjetno) nekaj igralci, je bolj naravno, da metodo dodamo razredu Komplet
.
Metodo deli
smo napisali že v prejšnji učni enoti, vendar je bila napisana zelo osnovno – omogočala je le deljenje ene posamezne karte. Poizkusimo jo malce izboljšati.
Metoda mora biti precej splošna, saj imajo različne igre različne zahteve glede deljenja kart. Morda želimo razdeliti celoten komplet kart naenkrat ali samo dodati po eno karto vsakemu igralcu. Metoda deli
bo imela dva parametra, seznam igralcev in skupno število kart, ki jih bomo razdelili tem igralcem. Če v kompletu ni dovolj kart, bo metoda deli
razdelila vse karte v kompletu, nato pa se bo ustavila:
class Komplet: # ... def deli(self, igralci, stev_kart=999): stev_igralcev = len(igralci) for i in range(stev_kart): if self.je_prazen(): break # Ni več kart; končaj karta = self._karte.pop() # Vzemi vrhnjo karto igralec = igralci[i % stev_igralcev] # Kdo je naslednji? igralec.dodaj(karta) # Dodaj karto igralcu
Drugi parameter, stev_kart
, ni obvezen; privzeta vrednost tega parametra je veliko število, kar v bistvu pomeni, da bodo razdeljene vse karte iz kompleta kart.
Vrednost spremenljivke i
v zanki se spreminja od 0
do stev_kart-1
. Pri vsaki iteraciji odstranimo karto iz kompleta tako, da uporabimo funkcijo pop
, ki odstrani in vrne zadnji element iz tabele.
Operator modulo (%
) nam omogoča, da karte delimo v krogu (naenkrat po eno karto vsakemu igralcu). Ko je spremenljivka i
enaka številu igralcev v tabeli, izraz i % stev_igralcev
nastavi indeks na vrednost 0
, kar pomeni, da se vrne na začetek tabele igralcev (indeks 0 v tabeli).
V spodnjem video posnetku si oglejte, kako poteka deljenje kart: