Пример #1
0
 def test_deal(self):
     m = Mazzo()
     lastThree = m.carte[-3:]
     others = m.carte[:-3]
     dealed = m.deal(3)
     self.assertEqual(lastThree, dealed)
     self.assertEqual(m.carte, others)
Пример #2
0
 def test_deal_empy(self):
     m = Mazzo()
     m.deal(40)
     with self.assertRaises(ValueError):
         m.deal(1)
Пример #3
0
class Gioco():
    """
    Classe contenente tutti gli oggetti presenti in una partita
    """
    def __init__(self, num_giocatori=2, classe_giocatore=Giocatore):
        self.mazzo = Mazzo()
        self.briscola = copy.deepcopy(self.mazzo.carte[0])
        self.giocatori = []
        self.num_giocatori = num_giocatori
        self.primo = 0
        if not (num_giocatori == 2 or num_giocatori == 4):
            raise ValueError("Numero di giocatori non valido, num_giocatori=%d" % num_giocatori)
        for i in range(num_giocatori):
            self.giocatori.append(classe_giocatore(self.mazzo.deal(3)))

    """
    Funzione con un loop che chiede a tutti i giocatori di giocare una carta
    finchè non finisce il mazzo
    """
    def run(self):
        print("BRISCOLA: %s\n" % self.briscola.__str__())
        while not self.gioco_finito():
            self.gioca_turno()
        vincitore = max(self.giocatori, key=(lambda x: Rules.conta_punti(x.prese)))
        return self.giocatori.index(vincitore)

    """
    Fa giocare un turno a tutti i giocatori
    """
    def gioca_turno(self):
        carte = []
        for i in range(self.primo, self.primo+self.num_giocatori):
            carte.append(self.chiedi_carta(i, carte))
            print("Giocato: %s" % carte[-1].__str__())

        giocatore_vincente = self.elabora_vincitore(carte)
        self.aggiungi_presa(giocatore_vincente, carte)
        self.pesca()

    """
    Ritorna il vincitore di una giocata
    Usa la funzione della classe Rules e poi ricalcola l'indice
    """
    def elabora_vincitore(self, carte):
        carta_vincente = Rules.vincitore(carte, self.briscola.seme)
        index_giocatore_vincente =  (carte.index(carta_vincente)+self.primo) % self.num_giocatori
        self.primo = index_giocatore_vincente
        return self.giocatori[index_giocatore_vincente]

    """
    Aggiunge presa alle carte prese da un giocatore
    """
    def aggiungi_presa(self, giocatore, presa):
        giocatore.prese.extend(presa)

    """
    Pesca una carta dal mazzo per ciascun giocatore
    Ignora se il mazzo e' finito
    """
    def pesca(self):
        for giocatore in self.giocatori:
            try:
                giocatore.mano.carte.append(self.mazzo.deal(1)[0])
            except ValueError:
                pass

    """
    Chiama la funzione di callback che deve ritornare
    la carta giocata dal giocatore
    """
    def chiedi_carta(self, i, carte):
        i %= self.num_giocatori
        return self.giocatori[i].gioca(carte)

    """
    Controlla se la partita e' finita
    """
    def gioco_finito(self):
        return len(self.giocatori[0].mano.carte) == 0