~FullSyst3m~
10-12-2008, 19:15
Apro un nuovo topic dato che l'altro sul libro in generale ormai e poco controllato. Ecco in breve cosa mi interesserebbe sapere, il libro che sto studiando negli ultimi capitoli ha un sacco di errori e ho passato più tempo a scovarli e correggerli che a concentrarmi sullo studio vero e proprio. Per prima cosa posto il codice, cosi da avere le idee chiare:
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 __str__(self):
return (self.ListaRanghi[self.Rango] + " di " + self.ListaSemi[self.Seme])
def __cmp__(self, Altro):
#controlla il seme
if self.Seme > Altro.Seme: return 1
if self.Seme < Altro.Seme: return -1
#controlla il rango
if (self.Rango == 1) and (Altro.Rango != 1): return 1
if (self.Rango != 1) and (Altro.Rango == 1): return -1
if self.Rango > Altro.Rango: return 1
if self.Rango < Altro.Rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
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 StampaMazzo(self):
for Carta in self.Carte:
print Carta
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 = s + " e' vuota\n"
else:
s = 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 = Carta(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):
for Mano in self.Mani:
print Mano
def RimuoveTutteLeCoppie(self):
Conteggio = 0
for Mano in self.Mani:
Conteggio = Conteggio + Mano.RimuoviCoppie()
return Conteggio
def TrovaVicino(self, Giocatore):
NumMani = len(self.Mani)
for Prossimo in range(1, NumMani):
Vicino = (Giocatore + Prossimo) % NumMani
if not self.Mani[Vicino].EVuoto():
return Vicino
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].RimuoviCoppie()
self.Mani[Giocatore].Mescola()
return Conteggio
def Partita(self, Nomi):
self.Mazzo.RimuoviCarta(Carta(0, 12)) # Rimozione della regina di fiori
self.Mani = [] # Creazione di una mano per ogni giocatore
for Nome in Nomi:
self.Mani.append(ManoOldMaid(Nome))
self.Mazzo.Distribuisci(self.Mani) # Distribuzione delle carte
print "----------- Le carte sono state distribuite -----------"
self.StampaMani()
NumCoppie = self.RimuoveTutteLeCoppie() # Toglie le coppie iniziali
print "----------- Coppie scartate, inizia la partita -----------"
self.StampaMani()
Turno = 0 # Gioca finche' non sono state fatte 25 coppie
NumMani = len(self.Mani)
while NumCoppie < 25:
Turno = (Turno + 1) % NumMani
NumCoppie = NumCoppie + self.GiocaUnTurno(Turno)
print "----------- La partita e' finita -----------"
self.StampaMani()
Gioco = GiocoOldMaid()
Gioco.Partita(["Full", "Syst3m", "Io"])
e questo è il capitolo interessato http://www.python.it/doc/Howtothink/Howtothink-html-it/chap16.htm
Adesso a noi:
1) ho provato a "runnare" ripetutamente il programma e alle volte viene eseguito senza problemi fino alla fine, altre dà un errore di indice (rilevato nella riga di codice in grassetto) e altre ancora si ferma al Nooooooooooooooooooooooooooooooo e finisce l'esecuzione.
2)
Mano = ListaMani[i % NumMani]
Mano.AggiungiCarta(Carta)
Apparte che credo che l'approccio di insegnamento del libro in questi ultimi capitoli è degradato e apparte che crea un casino bestiale mettere una variabile con lo stesso nome di una classe, non capisco come mai ad AggiungiCarta viene passato come parametro self Mano che è una variabile? Probabilmente perchè il contenuto di quella variabile è un oggetto Mano, ma allora la domanda è: dove è stato creato questo oggetto Mano? Forse qua dato che ManoOldMaid eredita da Mano?
self.Mani.append(ManoOldMaid(Nome))
3) se si usava Mano(Nome) non era la stessa cosa? la classe ManoOldMaid è stata usata per poter poi sfruttare in un successivo momento il metodo al suo interno (RimuoviCoppie)?
P.S: credo che sia cosi controllando passo per passo, ma vorrei una conferma: l'ereditarietà funziona come una scatola dentro un'altra in pratica. Quindi ManoOldMaid oltre ad ereditare da Mano eredita anche da Mazzo visto che Mano eredita a sua volta da Mazzo?
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 __str__(self):
return (self.ListaRanghi[self.Rango] + " di " + self.ListaSemi[self.Seme])
def __cmp__(self, Altro):
#controlla il seme
if self.Seme > Altro.Seme: return 1
if self.Seme < Altro.Seme: return -1
#controlla il rango
if (self.Rango == 1) and (Altro.Rango != 1): return 1
if (self.Rango != 1) and (Altro.Rango == 1): return -1
if self.Rango > Altro.Rango: return 1
if self.Rango < Altro.Rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
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 StampaMazzo(self):
for Carta in self.Carte:
print Carta
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 = s + " e' vuota\n"
else:
s = 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 = Carta(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):
for Mano in self.Mani:
print Mano
def RimuoveTutteLeCoppie(self):
Conteggio = 0
for Mano in self.Mani:
Conteggio = Conteggio + Mano.RimuoviCoppie()
return Conteggio
def TrovaVicino(self, Giocatore):
NumMani = len(self.Mani)
for Prossimo in range(1, NumMani):
Vicino = (Giocatore + Prossimo) % NumMani
if not self.Mani[Vicino].EVuoto():
return Vicino
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].RimuoviCoppie()
self.Mani[Giocatore].Mescola()
return Conteggio
def Partita(self, Nomi):
self.Mazzo.RimuoviCarta(Carta(0, 12)) # Rimozione della regina di fiori
self.Mani = [] # Creazione di una mano per ogni giocatore
for Nome in Nomi:
self.Mani.append(ManoOldMaid(Nome))
self.Mazzo.Distribuisci(self.Mani) # Distribuzione delle carte
print "----------- Le carte sono state distribuite -----------"
self.StampaMani()
NumCoppie = self.RimuoveTutteLeCoppie() # Toglie le coppie iniziali
print "----------- Coppie scartate, inizia la partita -----------"
self.StampaMani()
Turno = 0 # Gioca finche' non sono state fatte 25 coppie
NumMani = len(self.Mani)
while NumCoppie < 25:
Turno = (Turno + 1) % NumMani
NumCoppie = NumCoppie + self.GiocaUnTurno(Turno)
print "----------- La partita e' finita -----------"
self.StampaMani()
Gioco = GiocoOldMaid()
Gioco.Partita(["Full", "Syst3m", "Io"])
e questo è il capitolo interessato http://www.python.it/doc/Howtothink/Howtothink-html-it/chap16.htm
Adesso a noi:
1) ho provato a "runnare" ripetutamente il programma e alle volte viene eseguito senza problemi fino alla fine, altre dà un errore di indice (rilevato nella riga di codice in grassetto) e altre ancora si ferma al Nooooooooooooooooooooooooooooooo e finisce l'esecuzione.
2)
Mano = ListaMani[i % NumMani]
Mano.AggiungiCarta(Carta)
Apparte che credo che l'approccio di insegnamento del libro in questi ultimi capitoli è degradato e apparte che crea un casino bestiale mettere una variabile con lo stesso nome di una classe, non capisco come mai ad AggiungiCarta viene passato come parametro self Mano che è una variabile? Probabilmente perchè il contenuto di quella variabile è un oggetto Mano, ma allora la domanda è: dove è stato creato questo oggetto Mano? Forse qua dato che ManoOldMaid eredita da Mano?
self.Mani.append(ManoOldMaid(Nome))
3) se si usava Mano(Nome) non era la stessa cosa? la classe ManoOldMaid è stata usata per poter poi sfruttare in un successivo momento il metodo al suo interno (RimuoviCoppie)?
P.S: credo che sia cosi controllando passo per passo, ma vorrei una conferma: l'ereditarietà funziona come una scatola dentro un'altra in pratica. Quindi ManoOldMaid oltre ad ereditare da Mano eredita anche da Mazzo visto che Mano eredita a sua volta da Mazzo?