Deljenje kart igralcem

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: