C.3. Cartas, mazos y juegos Python
1: import random2: 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 palo16: if self.palo > otro.palo: return 1
17: if self.palo < otro.palo: return -1
18: # si son del mismo palo, controlar el valor19: if self.valor > otro.valor: return 1
20: if self.valor < otro.valor: return -1
21: # los valores son iguales, es un empate22: 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 + 193: 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) % cantManos117: print "----- El juego termin¶o."
118: self.muestraManos() 119: def eliminaTodasLasCoincidencias(self): 120: cant = 0121: 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) % cantManos139: if not self.manos[vecino].estaVacio():
140: return vecino
141: def muestraManos(self) :142: for mano in self.manos :
143: print manoDESCARGAR CODIGO FUENTE

Comentarios
Publicar un comentario