[Python] Gioco OldMaid, metodo StampaMani().

Lorenzo Macchiavelli lmacchiavelli a gmail.com
Mer 27 Mar 2013 16:31:47 CET


Ciao un consiglio, è buona norma aggiungere due ritorni a capo alla fine di
una def o una classe... così da rendere il codice più compensibile!

Lorenzo Macchiavelli

web designer


Il giorno 27 marzo 2013 16:26, Gabriel Battaglia (Kriyaban) <
iz4apu a libero.it> ha scritto:

> 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
> |-----------------------------**-----------------|
> ______________________________**_________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/**mailman/listinfo/python<http://lists.python.it/mailman/listinfo/python>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20130327/91ad0659/attachment-0001.html>


Maggiori informazioni sulla lista Python