[Python] Gioco OldMaid, metodo StampaMani().

Gabriel Battaglia (Kriyaban) iz4apu a libero.it
Mer 27 Mar 2013 16:26:51 CET


Buongiorno a tutti.

Torno con una "richiesta d'aiuto", le virgolette sono per sdrammatizzare l'enfasi delle parole che è certamente eccessiva.

Diligentemente sto seguendo il libro di A.A.V.V Pensare da informatico, che trovo estremamente ben fatto e utile. I capitoli 15 e 
16, come forse ricorderete dalla preistoria della vostra esperienza formativa, affrontano le classi e propongono un meraviglioso 
esempio per impararle e famigliarizzarsi con esse: il gioco di carte OldMaid.

Ho riscritto (Copiandolo) tutto il codice, il che mi aiuta a memorizzarlo e comprenderlo, tuttavia, arrivato al momento di svolgere 
lìultimo esercizio, mi trovo in difficoltà.
- Per funzionare infatti, il programma va completato con la scrittura di un metodo .StampaMani() volutamente lasciato alla perizia 
degli studenti... Una perizia però... che evidentemente ancora non posseggo.

Qui sotto c'è il listato del programma. Il Metodo che dovrei scrivere è indicato dal tag "#QUI", mentre le ultime righe dello script 
sono un'aggiunta mia di scarsa rilevanza.

La domanda è: a quale classe deve appartenere il metodo .StampaMani()?

Io pensavo dovesse essere della classe GiocoOldMaid, figlia a propria volta di GiocoDiCarte. Se lo scrivo lì tuttavia, non riesco ad 
accedere alla variabile che contiene il nome del giocatore di turno: self.Nomi non definito in GiocoOldMaid.

Probabilmente mi sto confondendo, la mia famigliarità con questo modo di programmare è appena abbozzata.

Qualche anima gentile, :) mi darebbe una spintina intellettuale?

Grazie.

***
# Dal capitolo 15 di Pensare da Informatico.

class Carta:
    ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
    ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", "6",\
                    "7", "8", "9", "10", "Jack", "Regina", "Re"]
    def __init__(self, Seme=0, Rango=0):
        self.Seme = Seme
        self.Rango = Rango
    def __cmp__(self, Altro):
        # controlla il seme
        if self.Seme > Altro.Seme: return 1
        if self.Seme < Altro.Seme: return -1
        # se i semi sono uguali controlla il rango
        if self.Rango > Altro.Rango: return 1
        if self.Rango < Altro.Rango: return -1
        # se anche i ranghi sono uguali le carte sono uguali!
        return 0
    def __str__(self):
        return (self.ListaRanghi[self.Rango] + " di " +
               self.ListaSemi[self.Seme])
#Ora l'oggetto carta e' creato.

# Ora il Mazzo.

class Mazzo:
    def __init__(self):
        self.Carte = []
        for Seme in range(4):
            for Rango in range (1,14):
                self.Carte.append(Carta(Seme, Rango))
    def __str__(self):
        s = ""
        for i in range(len(self.Carte)):
            s = s + " "*i + str(self.Carte[i]) + "\n"
        return s
    def Mescola(self):
        import random
        NumCarte = len(self.Carte)
        for i in range(NumCarte):
            j = random.randrange(i,NumCarte)
            self.Carte[i], self.Carte[j] = self.Carte[j], self.Carte[i]
    def RimuoviCarta(self, Carta):
        if Carta in self.Carte:
            self.Carte.remove(Carta)
            return 1
        else:
            return 0
    def PrimaCarta(self):
        return self.Carte.pop()
    def EVuoto(self):
        return (len(self.Carte) == 0)
    def Distribuisci(self, ListaMani, NumCarte=999):
        NumMani=len(ListaMani)
        for i in range(NumCarte):
            if self.EVuoto:
                break
            Carta = self.PrimaCarta()
            Mano = ListaMani(i % NumMani)
            Mano.AggiungiCarta(Carta)

class Mano(Mazzo):
    def __init__(self, Nome=""):
        self.Carte = []
        self.Nome = Nome
    def AggiungiCarta(self, Carta):
        self.Carte.append(Carta)
    def __str__(self):
        s = "La mano di "+self.Nome
        if self.EVuoto():
            s += " E' vuota\n"
        else:
            s += " Contiene queste carte:\n"
            return s + Mazzo.__str__(self)
class GiocoDiCarte:
    def __init__(self):
        self.Mazzo = Mazzo()
        self.Mazzo.Mescola()
class ManoOldMaid(Mano):
    def RimuoviCoppie(self):
        Conteggio = 0
        CarteOriginali = self.Carte[:]
        for CartaOrig in CarteOriginali:
            CartaDaCercare = (3-CartaOrig.Seme, CartaOrig.Rango)
            if CartaDaCercare in self.Carte:
                self.Carte.remove(CartaOrig)
                self.Carte.remove(CartaDaCercare)
                print "Mano di %s : %s elimina %s" %\
                self.Nome, CartaOrig, CartaDaCercare
                Conteggio += 1
                return Conteggio
class GiocoOldMaid(GiocoDiCarte):
    def StampaMani(self): #QUI
        # Metodo per stampare le mani.
        print "Mano di ",self.Nomi," :\n"
        for i in range(self.Carte):
            print i,"\n"
        print "\n-----\n"
    def Partita(self, Nomi):
        # Tolgo la donna di fiori
        self.Mazzo.RimuoviCarta(Carta(0,12))
        # Creazione di una mano per ogni giocatore
        self.Mani = []
        for Nome in Nomi:
            self.Mani.append(ManoOldMaid(Nome))
            # Distribuzione mani
            self.Mazzo.Distribuisci(self.Mani) #Rimossa () dopo mani
            print " ---------- Le carte sono state distribuite."
            self.StampaMani()
            # Toglie le coppie iniziali.
            NumCoppie = self.RimuoviTutteLeCoppie()
            print " --- Coppie scartate. Inizia la partita.\n"
            self.StampaMani()
            # Gioca finche' non sono state fatte 25 coppie
            Turno = 0
            NumMani = len(self.Mani())
            while NumCoppie < 25:
                NumCoppie += self.GiocaUnTurno(Turno)
                Turno = (Turno + 1) % NumMani
            print "----------La partita e' finita! \n"
            self.StampaMani()
    def RimuoviTutteLeCoppie(self):
        Conteggio = 0
        for Mano in self.Mani:
            Conteggio += Mano.RimuoviCoppie()
            return Conteggio
    def GiocaUnTurno(self, Giocatore):
        if self.Mani[Giocatore].EVuoto():
            return 0
        Vicino = self.TrovaVicino(Giocatore)
        CartaScelta = self.Mani[Vicino].PrimaCarta()
        self.Mani[Giocatore].AggiungiCarta(CartaScelta)
        print "Mano di ",self.Mani[Giocatore].Nome,\
        ": scelta", CartaScelta
        Conteggio = self.Mani[Giocatore].RimuoveCoppie()
        self.Mani[Giocatore].Mescola()
        return Conteggio
    def TrovaVicino(self, Giocatore):
        NumMani=len(self.Mani)
        for Prossimo in range(1, NumMani):
            Vicino = (Prossimo + Giocatore) % NumMani
            if not self.Mani[Vicino].EVuoto():
                return Vicino
# Codice che gestisce il gioco.
Gioco = GiocoOldMaid()
Quanti = input("Quanti giocatori?")
if Quanti > 8: Quanti = 8
if Quanti < 2: Quanti = 2
ListaG = []
for i in range(Quanti):
    print "Giocatore: ", i+1,
    ListaG.append(raw_input("nome: "))
Gioco.Partita(ListaG)

|---------< Gabriel Battaglia (Kriyaban) >-----|
|- Skype: gabriel_battaglia
|-----------------------------------|
|- Ricevitoria Telefonica
|--- Fondazione Cassa di Risparmio in Bologna
|----- via Farini 15, I:40124, Bologna (BO)
|------- Tel: (+39) 051 27 54 111
|--------- Sito Web: http://fondazionecarisbo.it
|----------------------------------------------| 



Maggiori informazioni sulla lista Python