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@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a