Heretic Curse
13-05-2013, 19:15
Fare questo gioco di carte virtuale mi sta davvero mettendo in difficoltà
# !/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import random
class Carta:
ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", "6", \
"7", "8", "9", "10", "Jack", "Queen", "King"]
def __init__(self, Seme = 0, Rango = 0):
self.Rango = Rango
self.Seme = Seme
def __str__(self):
return str(self.ListaRanghi[self.Rango]) + " di " + str(self.ListaSemi[self.Seme])
def __cmp__(self, Altro):
if self.Seme > Altro.Seme: return 1
if self.Seme < Altro.Seme: return -1
if self.Rango == 1 and self.Rango != Altro.Rango: return 1
if self.Rango > Altro.Rango: return 1
if self.Rango < Altro.Rango: return -1
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 __str__(self):
s = ""
for i in range(len(self.Carte)):
s = s + " "*i + str(self.Carte[i]) + "\n"
return s
def Mescola(self):
NumCarte = len(self.Carte)
for i in range(NumCarte):
j = random.randrange(i, NumCarte)
x = 0
self.Carte[x] = self.Carte[i]
self.Carte[i] = self.Carte[j]
self.Carte[j] = self.Carte[x]
def RimuoviCarte(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.AggiungeCarta(Carta)
class Mano(Mazzo):
def __init__(self, Nome=""):
self.Carte = []
self.Nome = Nome
def __str__(self):
s = "La mano di " + self.Nome
if self.EVuoto():
s = s + " è vuota\n"
else:
s = s + " contiene tali carte:\n"
return s + Mazzo.__str__(self)
def AggiungeCarta(self, Carta):
self.Carte.append(Carta)
class GiocoDiCarte:
def __init__(self):
self.Mazzo = Mazzo()
self.Mazzo.Mescola()
class GiocoOldMaid(GiocoDiCarte):
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].AggiungeCarta(CartaScelta)
print "Mano di", self.Mani[Giocatore].Nome, ": scelta", CartaScelta
Conteggio = self.Mani[Giocatore].RimuoveCoppie()
self.Mani[Giocatore].Mescola()
return Conteggio
def StampaMani(self):
for Mano in self.Mani:
print Mano
def RimuoveTutteLeCoppie(self):
Conteggio = 0
for Mano in self.Mani:
Conteggio = Conteggio + Mano.RimuoveCoppie()
return Conteggio
def Partita(self, Nomi):
self.Mazzo.RimuoviCarte(Carta(0, 12))
self.Mani=[]
for Nome in Nomi:
self.Mani.append(ManoOldMaid(Nome))
self.Mazzo.Distribuisci(self.Mani)
print "---------- Le carte sono state distribuite"
self.StampaMani()
NumCoppie = self.RimuoveTutteLeCoppie()
print "---------- Coppie scartate, inizia la partita"
self.StampaMani
Turno = 0
NumMani = len(self.Mani)
while NumCoppie < 25:
NumCoppie = NumCoppie + self.GiocaUnTurno(Turno)
Turno = (Turno + 1) % NumMani
print "---------- La partita è finita"
self.StampaMani()
class ManoOldMaid(Mano):
def RimuoveCoppie(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 = Conteggio + 1
return Conteggio
import Carta
Gioco = GiocoOldMaid()
Gioco.Partita(["Howard", "Sheldon", "Leonard"])
Ora viene il bello: Sublime Text non mi restituisce alcun errore, ne mi scrive "Finished in x seconds with exit code y", semplicemente me lo esegue fino a stamparmi "---------- Coppie scartate, inizia la partita", poi più nulla. Eppure non riesco seriamente a trovare errori in ciò che segue (anche se ovviamente ci saranno).
Volevo inoltre chiedervi, le prime 2 righe di codice che ho scritto cosa significano? Perché il codice presentava un errore e ho trovato googolando di usare quelle righe come soluzione, ma non ne ho compreso il "senso".
Spero l'indentazione vi vada bene, è quella che mi mette in automatico l' IDE.
# !/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import random
class Carta:
ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", "6", \
"7", "8", "9", "10", "Jack", "Queen", "King"]
def __init__(self, Seme = 0, Rango = 0):
self.Rango = Rango
self.Seme = Seme
def __str__(self):
return str(self.ListaRanghi[self.Rango]) + " di " + str(self.ListaSemi[self.Seme])
def __cmp__(self, Altro):
if self.Seme > Altro.Seme: return 1
if self.Seme < Altro.Seme: return -1
if self.Rango == 1 and self.Rango != Altro.Rango: return 1
if self.Rango > Altro.Rango: return 1
if self.Rango < Altro.Rango: return -1
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 __str__(self):
s = ""
for i in range(len(self.Carte)):
s = s + " "*i + str(self.Carte[i]) + "\n"
return s
def Mescola(self):
NumCarte = len(self.Carte)
for i in range(NumCarte):
j = random.randrange(i, NumCarte)
x = 0
self.Carte[x] = self.Carte[i]
self.Carte[i] = self.Carte[j]
self.Carte[j] = self.Carte[x]
def RimuoviCarte(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.AggiungeCarta(Carta)
class Mano(Mazzo):
def __init__(self, Nome=""):
self.Carte = []
self.Nome = Nome
def __str__(self):
s = "La mano di " + self.Nome
if self.EVuoto():
s = s + " è vuota\n"
else:
s = s + " contiene tali carte:\n"
return s + Mazzo.__str__(self)
def AggiungeCarta(self, Carta):
self.Carte.append(Carta)
class GiocoDiCarte:
def __init__(self):
self.Mazzo = Mazzo()
self.Mazzo.Mescola()
class GiocoOldMaid(GiocoDiCarte):
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].AggiungeCarta(CartaScelta)
print "Mano di", self.Mani[Giocatore].Nome, ": scelta", CartaScelta
Conteggio = self.Mani[Giocatore].RimuoveCoppie()
self.Mani[Giocatore].Mescola()
return Conteggio
def StampaMani(self):
for Mano in self.Mani:
print Mano
def RimuoveTutteLeCoppie(self):
Conteggio = 0
for Mano in self.Mani:
Conteggio = Conteggio + Mano.RimuoveCoppie()
return Conteggio
def Partita(self, Nomi):
self.Mazzo.RimuoviCarte(Carta(0, 12))
self.Mani=[]
for Nome in Nomi:
self.Mani.append(ManoOldMaid(Nome))
self.Mazzo.Distribuisci(self.Mani)
print "---------- Le carte sono state distribuite"
self.StampaMani()
NumCoppie = self.RimuoveTutteLeCoppie()
print "---------- Coppie scartate, inizia la partita"
self.StampaMani
Turno = 0
NumMani = len(self.Mani)
while NumCoppie < 25:
NumCoppie = NumCoppie + self.GiocaUnTurno(Turno)
Turno = (Turno + 1) % NumMani
print "---------- La partita è finita"
self.StampaMani()
class ManoOldMaid(Mano):
def RimuoveCoppie(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 = Conteggio + 1
return Conteggio
import Carta
Gioco = GiocoOldMaid()
Gioco.Partita(["Howard", "Sheldon", "Leonard"])
Ora viene il bello: Sublime Text non mi restituisce alcun errore, ne mi scrive "Finished in x seconds with exit code y", semplicemente me lo esegue fino a stamparmi "---------- Coppie scartate, inizia la partita", poi più nulla. Eppure non riesco seriamente a trovare errori in ciò che segue (anche se ovviamente ci saranno).
Volevo inoltre chiedervi, le prime 2 righe di codice che ho scritto cosa significano? Perché il codice presentava un errore e ho trovato googolando di usare quelle righe come soluzione, ma non ne ho compreso il "senso".
Spero l'indentazione vi vada bene, è quella che mi mette in automatico l' IDE.