16.3. El reparto de los naipes

Ahora que ya tenemos la clase Mano, queremos repartir las cartas del Mazo en manos. No es claramente obvio si este metodo debe ir en la clase Mano o en la clase Mazo, pero como opera sobre un mazo único y (posiblemente) sobre varias manos, es mas natural ponerlo en el Mazo. repartir debe ser bastante general, pues los diferentes juegos tienen distintos requerimientos.

Puede que necesitemos repartir todo el mazo de una vez, o que agreguemos una carta a cada mano.
Repartir toma dos parámetros, una lista (o tupla) de manos y la cantidad total de naipes a repartir. Si no hay suficientes cartas en el mazo, el metodo reparte todas las cartas y se detiene:

   1: class Mazo :
   2:     ...
   3:     def repartir(self, manos, nCartas=999):
   4:     nManos = len(manos)
   5:         for i in range(nCartas):
   6:         if self.estaVacio(): break # fin si se acaban las cartas
   7:         carta = self.darCarta() # da la carta superior
   8:         mano = manos[i % nManos] # a qui¶en le toca?
   9:         mano.agregaCarta(carta) # agrega la carta a la mano

 

El segundo parámetro, nCartas es opcional; el valor por omisión es un numero muy grande, lo cual es lo mismo que decir que se repartirán todos los naipes del mazo.


La variable de bucle i va desde 0 hasta nCartas-1. A cada paso a través del bucle, se elimina una carta del mazo mediante el metodo de lista pop, que quita y devuelve el ultimo elemento de la lista.


El operador modulo ( %) permite que podamos repartir las cartas de una en una (una carta cada vez para cada mano). Cuando i es igual a la cantidad de manos en la lista, la expresión i % nManos salta hacia el comienzo de la lista (el índice
es 0).

0