-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jugadores.py
147 lines (108 loc) · 3.39 KB
/
Jugadores.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
class Jugador:
def __init__(self, _id):
self.id = _id
self.reset()
def reset(self):
self.cartas = []
self.escobas = 0
self.cartas_comidas = { palo : [] for palo in ["Espada", "Basto", "Copa", "Oro"] } #Cambiar nombre
@property
def puntos(self):
Carta = Primera = 0
for cartas in self.cartas_comidas.values():
try:
Primera += max(cartas)
Carta += len(cartas)
except ValueError:
pass
return {
"Oro" : len(self.cartas_comidas["Oro"]),
"Belo" : 7 in self.cartas_comidas["Oro"],
"Carta" : Carta,
"Primera" : Primera,
"Escobas" : self.escobas
}
def comer_cartas(self, cartas, juego):
print("----------------------")
print("- Cartas agregadas -")
for carta in cartas:
print(f" { carta }")
self.cartas_comidas[carta.palo].append(carta.valorP)
try: juego.cartas_mesa.remove(carta)
except ValueError: pass
print("----------------------")
if not juego.cartas_mesa:
print(" Escoba!\n----------------------")
self.escobas += 1
juego.ultimo_comer = self.id
class Humano(Jugador):
def __init__(self, id_):
super().__init__(id_)
self.nombre = f"Jugador { id_+1 }"
def jugar(self, juego):
print("- Tus cartas: -")
for i, carta in enumerate(self.cartas):
print(f" { i+1 }. { carta }")
print("----------------------")
print(" Elegir carta:")
while 1:
try:
inp = int(input("> "))-1
carta_sel = self.cartas.pop(inp)
break
except (IndexError, ValueError): continue
print("----------------------")
print(" Tirar/Comer carta:")
while 1:
try:
inp = input("> ")
if inp == "0":
juego.cartas_mesa.append(carta_sel)
print(f" { self.nombre }: \n Tira el { carta_sel }")
print("----------------------")
break
idxs = [int(i)-1 for i in inp.split(" ")]
cartas = [carta_sel] + [juego.cartas_mesa[i] for i in idxs]
if sum([c.valor for c in cartas]) == 15:
self.comer_cartas(cartas, juego)
break
else: raise ValueError
except (ValueError, IndexError):
print("Opcion incorrecta")
continue
class Cpu(Jugador):
def __init__(self, id_):
super().__init__(id_)
self.nombre = f"Cpu { id_ }"
def jugar(self, juego):
if len(self.cartas) == 3: self.cartas.sort(reverse=True)
self.opciones = []
for carta in self.cartas:
self.buscar_sumas(carta, juego.cartas_mesa)
if not self.opciones:
carta_tirar = self.cartas.pop()
juego.cartas_mesa.append(carta_tirar)
print(f" { self.nombre }: \n Tira el { carta_tirar }")
print("----------------------")
return
mejor_opcion = idx_m = 0
for i,opc in enumerate(self.opciones):
peso = sum(cart.peso for cart in opc)
if juego.cartas_mesa == opc[1:]: peso += 6 #Escoba!
if peso > mejor_opcion:
mejor_opcion = peso
idx_m = i
carta_tirar = self.opciones[idx_m][0]
print(f" { self.nombre }: \n Juega el { carta_tirar }")
self.cartas.remove(carta_tirar)
self.comer_cartas(self.opciones[idx_m], juego)
def buscar_sumas(self, mi_carta, cartas_mesa, parcial=[]):
#Busca combinaciones que sumen 15, las guarda en un array dentro de self.opciones
nums_parcial = [cart.valor for cart in parcial]
if sum(nums_parcial) + mi_carta.valor == 15:
self.opciones.append([mi_carta] + parcial)
return
for i in range(len(cartas_mesa)):
n = cartas_mesa[i]
remaining = cartas_mesa[i+1:]
self.buscar_sumas(mi_carta, remaining, parcial + [n])