[Python] Gioco OldMaid, metodo StampaMani().

Marco Giusti marco.giusti a gmail.com
Ven 29 Mar 2013 15:52:31 CET


On Wed, Mar 27, 2013 at 04:26:51PM +0100, Gabriel Battaglia (Kriyaban) wrote:
> 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()?

Capita spesso di domandarsi a quale classe appartiene un metodo ma nel
caso specifico hai una sola possibilità perché tutte le altre
porterebbero ad un errore.

In realtà è abbastanza grave che tu non lo veda, forse è il caso di fare
qualche passo indietro e riguardare come funzionano le classi e
l'invocazione dei metodi.

Ti lascio il weekend per pensarci.

Se vuoi fare una prova per capire usa il seguente codice:

	def StampaMani(self):
		print 'Metodo StampaMani definito nella classe', \
			self.__class__.__name__

usalo nelle farie classi e vedi un po' cosa restituisce, ma ti ripeto
che hai tutti gli elementi per capirlo da solo.

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

Non farti ingannare dall'errore, vedi più avanti perché.

Nell'ultima riga del seguente codice c'è un errore.

		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) # err!

Qui, nel metodo `StampaMani`, commetti un errore di concetto: la classe
`GiocoOldMaid` contiene un attributo (variabile o metodo) di nome
`Nomi`? Lo stesso errore lo ripeti dopo ma con un altro attributo:
`Carte`. Inoltre il metodo `range` ti restituisce una lista di interi
(1, 2, ...) e sicuramente non accetta una lista come parametro.
Rileggi il paragrafo, gli esempi ma soprattutto il testo dell'esecizio
che ti indica la direzione da seguire.

		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"

			...

ps. non conosco il testo e non ho letto nulla più che il testo
dell'esercizio quindi la mia risposta è un po' superficiale.

ciao
m.


Maggiori informazioni sulla lista Python