C.3. Cartas, mazos y juegos Python
1: import random
2: class Carta:
3: listaDePalos = ["Tr¶eboles", "Diamantes", "Corazones",
4: "Picas"]
5: listaDeValores = ["nada", "As", "2", "3", "4", "5", "6", "7",
6: "8", "9", "10", "Sota", "Reina", "Rey"]
7:
8: def __init__(self, palo=0, valor=0):
9: self.palo = palo
10: self.valor = valor
11: def __str__(self):
12: return (self.listaDeValores[self.valor] + " de " +\
13: self.listaDePalos[self.palo])
14: def __cmp__(self, otro):
15: # controlar el palo
16: if self.palo > otro.palo: return 1
17: if self.palo < otro.palo: return -1
18: # si son del mismo palo, controlar el valor
19: if self.valor > otro.valor: return 1
20: if self.valor < otro.valor: return -1
21: # los valores son iguales, es un empate
22: return 0
23:
24: class Mazo:
25: def __init__(self):
26: self.cartas = []
27: for palo in range(4):
28: for valor in range(1, 14):
29: self.cartas.append(Carta(palo, valor))
30:
31: def muestraMazo(self):
32: for carta in self.cartas:
33: print carta
34: def __str__(self):
35: s = ""
36: for i in range(len(self.cartas)):
37: s = s + " "*i + str(self.cartas[i]) + "\n"
38: return s
39: def mezclar(self):
40: import random
41: nCartas = len(self.cartas)
42: for i in range(nCartas):
43: j = random.randrange(i, nCartas)
44: self.cartas[i], self.cartas[j] =\
45: self.cartas[j], self.cartas[i]
46: def eliminaCarta(self, carta):
47: if carta in self.cartas:
48: self.cartas.remove(carta)
49: return 1
50: else: return 0
51: def darCarta(self):
52: return self.cartas.pop()
53: def estaVacio(self):
54: return (len(self.cartas) == 0)
55: def repartir(self, manos, nCartas=999):
56: nManos = len(manos)
57: for i in range(nCartas):
58: if self.estaVacio(): break # fin si se acaban las cartas
59: carta = self.darCarta() # da la carta superior
60: mano = manos[i % nManos] # a qui¶en le toca?
61: mano.agregaCarta(carta) # agrega la carta a la mano
62:
63: class Mano(Mazo):
64: def __init__(self, nombre=""):
65: self.cartas = []
66: self.nombre = nombre
67: def agregaCarta(self,carta) :
68: self.cartas.append(carta)
69: def __str__(self):
70: s = "La mano de " + self.nombre
71: if self.estaVacio():
72: s = s + " est¶a vac¶³a\n"
73: else:
74: s = s + " contiene\n"
75: return s + Mazo.__str__(self)
76:
77: class JuegoDeCartas:
78: def __init__(self):
79: self.mazo = Mazo()
80: self.mazo.mezclar()
81:
82: class ManoDeLaMona(Mano):
83: def eliminaCoincidencias(self):
84: cant = 0
85: cartasOriginales = self.cartas[:]
86: for carta in cartasOriginales:
87: empareja = Carta(3 - carta.palo, carta.valor)
88: if empareja in self.cartas:
89: self.cartas.remove(carta)
90: self.cartas.remove(empareja)
91: print "Mano %s: %s con %s" % (self.nombre,carta,empareja)
92: cant = cant + 1
93: return cant
94:
95: class JuegoDeLaMona(JuegoDeCartas):
96: def jugar(self, nombres):
97: # quitamos la Reina de Tr¶eboles
98: self.mazo.eliminaCarta(Carta(0,12))
99: # construimos una mano para cada jugador
100: self.manos = []
101: for nombre in nombres :
102: self.manos.append(ManoDeLaMona(nombre))
103: # repartimos los naipes
104: self.mazo.repartir(self.manos)
105: print "----- Se han repartido las cartas."
106: self.muestraManos()
107: # eliminamos las coincidencias iniciales
108: emparejadas = self.eliminaTodasLasCoincidencias()
109: print "----- Coincidencias eliminadas, el juego comienza."
110: self.muestraManos()
111: # se juega hasta que se han descartado las 50 cartas
112: turno = 0
113: cantManos = len(self.manos)
114: while emparejadas < 25:
115: emparejadas = emparejadas + self.jugarUnTurno(turno)
116: turno = (turno + 1) % cantManos
117: print "----- El juego termin¶o."
118: self.muestraManos()
119: def eliminaTodasLasCoincidencias(self):
120: cant = 0
121: for mano in self.manos:
122: cant = cant + mano.eliminaCoincidencias()
123: return cant
124: def jugarUnTurno(self, i):
125: if self.manos[i].estaVacio():
126: return 0
127: vecino = self.encuentraVecino(i)
128: cartaElegida = self.manos[vecino].darCarta()
129: self.manos[i].agregaCarta(cartaElegida)
130: print "Mano", self.manos[i].nombre, "eligi¶o", cartaElegida
131: cant = self.manos[i].eliminaCoincidencias()
132: self.manos[i].mezclar()
133: return cant
134:
135: def encuentraVecino(self, i):
136: cantManos = len(self.manos)
137: for proximo in range(1,cantManos):
138: vecino = (i + proximo) % cantManos
139: if not self.manos[vecino].estaVacio():
140: return vecino
141: def muestraManos(self) :
142: for mano in self.manos :
143: print mano
DESCARGAR CODIGO FUENTE
Comentarios
Publicar un comentario