[Python] Gioco OldMaid, metodo StampaMani().
Gabriel Battaglia (Kriyaban)
iz4apu a libero.it
Mer 27 Mar 2013 16:26:51 CET
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
|----------------------------------------------|
Maggiori informazioni sulla lista
Python