[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