<div dir="ltr">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! </div><div class="gmail_extra"><br clear="all"><div>Lorenzo Macchiavelli<div>

<br></div><div>web designer</div></div>
<br><br><div class="gmail_quote">Il giorno 27 marzo 2013 16:26, Gabriel Battaglia (Kriyaban) <span dir="ltr"><<a href="mailto:iz4apu@libero.it" target="_blank">iz4apu@libero.it</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Buongiorno a tutti.<br>
<br>
Torno con una "richiesta d'aiuto", le virgolette sono per sdrammatizzare l'enfasi delle parole che è certamente eccessiva.<br>
<br>
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.<br>


<br>
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à.<br>
- 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.<br>
<br>
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.<br>
<br>
La domanda è: a quale classe deve appartenere il metodo .StampaMani()?<br>
<br>
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.<br>


<br>
Probabilmente mi sto confondendo, la mia famigliarità con questo modo di programmare è appena abbozzata.<br>
<br>
Qualche anima gentile, :) mi darebbe una spintina intellettuale?<br>
<br>
Grazie.<br>
<br>
***<br>
# Dal capitolo 15 di Pensare da Informatico.<br>
<br>
class Carta:<br>
   ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]<br>
   ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", "6",\<br>
                   "7", "8", "9", "10", "Jack", "Regina", "Re"]<br>
   def __init__(self, Seme=0, Rango=0):<br>
       self.Seme = Seme<br>
       self.Rango = Rango<br>
   def __cmp__(self, Altro):<br>
       # controlla il seme<br>
       if self.Seme > Altro.Seme: return 1<br>
       if self.Seme < Altro.Seme: return -1<br>
       # se i semi sono uguali controlla il rango<br>
       if self.Rango > Altro.Rango: return 1<br>
       if self.Rango < Altro.Rango: return -1<br>
       # se anche i ranghi sono uguali le carte sono uguali!<br>
       return 0<br>
   def __str__(self):<br>
       return (self.ListaRanghi[self.Rango] + " di " +<br>
              self.ListaSemi[self.Seme])<br>
#Ora l'oggetto carta e' creato.<br>
<br>
# Ora il Mazzo.<br>
<br>
class Mazzo:<br>
   def __init__(self):<br>
       self.Carte = []<br>
       for Seme in range(4):<br>
           for Rango in range (1,14):<br>
               self.Carte.append(Carta(Seme, Rango))<br>
   def __str__(self):<br>
       s = ""<br>
       for i in range(len(self.Carte)):<br>
           s = s + " "*i + str(self.Carte[i]) + "\n"<br>
       return s<br>
   def Mescola(self):<br>
       import random<br>
       NumCarte = len(self.Carte)<br>
       for i in range(NumCarte):<br>
           j = random.randrange(i,NumCarte)<br>
           self.Carte[i], self.Carte[j] = self.Carte[j], self.Carte[i]<br>
   def RimuoviCarta(self, Carta):<br>
       if Carta in self.Carte:<br>
           self.Carte.remove(Carta)<br>
           return 1<br>
       else:<br>
           return 0<br>
   def PrimaCarta(self):<br>
       return self.Carte.pop()<br>
   def EVuoto(self):<br>
       return (len(self.Carte) == 0)<br>
   def Distribuisci(self, ListaMani, NumCarte=999):<br>
       NumMani=len(ListaMani)<br>
       for i in range(NumCarte):<br>
           if self.EVuoto:<br>
               break<br>
           Carta = self.PrimaCarta()<br>
           Mano = ListaMani(i % NumMani)<br>
           Mano.AggiungiCarta(Carta)<br>
<br>
class Mano(Mazzo):<br>
   def __init__(self, Nome=""):<br>
       self.Carte = []<br>
       self.Nome = Nome<br>
   def AggiungiCarta(self, Carta):<br>
       self.Carte.append(Carta)<br>
   def __str__(self):<br>
       s = "La mano di "+self.Nome<br>
       if self.EVuoto():<br>
           s += " E' vuota\n"<br>
       else:<br>
           s += " Contiene queste carte:\n"<br>
           return s + Mazzo.__str__(self)<br>
class GiocoDiCarte:<br>
   def __init__(self):<br>
       self.Mazzo = Mazzo()<br>
       self.Mazzo.Mescola()<br>
class ManoOldMaid(Mano):<br>
   def RimuoviCoppie(self):<br>
       Conteggio = 0<br>
       CarteOriginali = self.Carte[:]<br>
       for CartaOrig in CarteOriginali:<br>
           CartaDaCercare = (3-CartaOrig.Seme, CartaOrig.Rango)<br>
           if CartaDaCercare in self.Carte:<br>
               self.Carte.remove(CartaOrig)<br>
               self.Carte.remove(<u></u>CartaDaCercare)<br>
               print "Mano di %s : %s elimina %s" %\<br>
               self.Nome, CartaOrig, CartaDaCercare<br>
               Conteggio += 1<br>
               return Conteggio<br>
class GiocoOldMaid(GiocoDiCarte):<br>
   def StampaMani(self): #QUI<br>
       # Metodo per stampare le mani.<br>
       print "Mano di ",self.Nomi," :\n"<br>
       for i in range(self.Carte):<br>
           print i,"\n"<br>
       print "\n-----\n"<br>
   def Partita(self, Nomi):<br>
       # Tolgo la donna di fiori<br>
       self.Mazzo.RimuoviCarta(Carta(<u></u>0,12))<br>
       # Creazione di una mano per ogni giocatore<br>
       self.Mani = []<br>
       for Nome in Nomi:<br>
           self.Mani.append(ManoOldMaid(<u></u>Nome))<br>
           # Distribuzione mani<br>
           self.Mazzo.Distribuisci(self.<u></u>Mani) #Rimossa () dopo mani<br>
           print " ---------- Le carte sono state distribuite."<br>
           self.StampaMani()<br>
           # Toglie le coppie iniziali.<br>
           NumCoppie = self.RimuoviTutteLeCoppie()<br>
           print " --- Coppie scartate. Inizia la partita.\n"<br>
           self.StampaMani()<br>
           # Gioca finche' non sono state fatte 25 coppie<br>
           Turno = 0<br>
           NumMani = len(self.Mani())<br>
           while NumCoppie < 25:<br>
               NumCoppie += self.GiocaUnTurno(Turno)<br>
               Turno = (Turno + 1) % NumMani<br>
           print "----------La partita e' finita! \n"<br>
           self.StampaMani()<br>
   def RimuoviTutteLeCoppie(self):<br>
       Conteggio = 0<br>
       for Mano in self.Mani:<br>
           Conteggio += Mano.RimuoviCoppie()<br>
           return Conteggio<br>
   def GiocaUnTurno(self, Giocatore):<br>
       if self.Mani[Giocatore].EVuoto():<br>
           return 0<br>
       Vicino = self.TrovaVicino(Giocatore)<br>
       CartaScelta = self.Mani[Vicino].PrimaCarta()<br>
       self.Mani[Giocatore].<u></u>AggiungiCarta(CartaScelta)<br>
       print "Mano di ",self.Mani[Giocatore].Nome,\<br>
       ": scelta", CartaScelta<br>
       Conteggio = self.Mani[Giocatore].<u></u>RimuoveCoppie()<br>
       self.Mani[Giocatore].Mescola()<br>
       return Conteggio<br>
   def TrovaVicino(self, Giocatore):<br>
       NumMani=len(self.Mani)<br>
       for Prossimo in range(1, NumMani):<br>
           Vicino = (Prossimo + Giocatore) % NumMani<br>
           if not self.Mani[Vicino].EVuoto():<br>
               return Vicino<br>
# Codice che gestisce il gioco.<br>
Gioco = GiocoOldMaid()<br>
Quanti = input("Quanti giocatori?")<br>
if Quanti > 8: Quanti = 8<br>
if Quanti < 2: Quanti = 2<br>
ListaG = []<br>
for i in range(Quanti):<br>
   print "Giocatore: ", i+1,<br>
   ListaG.append(raw_input("nome: "))<br>
Gioco.Partita(ListaG)<br>
<br>
|---------< Gabriel Battaglia (Kriyaban) >-----|<br>
|- Skype: gabriel_battaglia<br>
|-----------------------------<u></u>------|<br>
|- Ricevitoria Telefonica<br>
|--- Fondazione Cassa di Risparmio in Bologna<br>
|----- via Farini 15, I:40124, Bologna (BO)<br>
|------- Tel: <a href="tel:%28%2B39%29%20051%2027%2054%20111" value="+390512754111" target="_blank">(+39) 051 27 54 111</a><br>
|--------- Sito Web: <a href="http://fondazionecarisbo.it" target="_blank">http://fondazionecarisbo.it</a><br>
|-----------------------------<u></u>-----------------| <br>
______________________________<u></u>_________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it" target="_blank">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/<u></u>mailman/listinfo/python</a><br>
</blockquote></div><br></div>