<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>