-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsp_munchkin.py
139 lines (100 loc) · 3.68 KB
/
csp_munchkin.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
"""
En el juego Munchkin, cada jugador tiene un personaje al que puede mejorar aplicando
diferentes cartas. Estas cartas incluyen cosas como armas, armaduras, pociones,
maldiciones, y otros modificadores que incrementan el nivel del personaje, haciéndolo
más capaz de ganar el juego. Pero existen algunas restricciones respecto a qué cartas
pueden utilizarse en un mismo personaje, de forma de evitar jugadores “superpoderosos”
que degradan la jugabilidad.
Un jugador tiene que elegir 3 cartas para intentar armar su personaje, y las opciones
disponibles son:
- Armadura de madera +1 (800 oro)
- Armadura de hierro +3 (1000 oro)
- Armadura de acero +5 (1300 oro)
- Espada de madera +1 (500 oro)
- Espada de hierro +2 (700 oro)
- Espada de acero +4 (1000 oro)
- Garrote gigante de madera +6 (1300 oro)
- Poción de fuego +5 (1500 oro)
- Poción de hielo +2 (800 oro)
- Poción de ácido +3 (1200 oro)
Y a la vez, deben cumplirse las siguientes restricciones:
- Solo se puede tener 1 armadura
- Solo se puede tener 1 arma de mano (espada o garrote)
- Solo se dispone de 3000 de oro para gastar (es decir, el valor de las cartas sumadas
no puede superar ese monto)
- No se pueden mezclar cartas de objetos de fuego con cartas de objetos de madera
- Se tiene que lograr un bonificador total (sumando las cartas) mayor a +8
"""
from itertools import combinations
from simpleai.search import (
CspProblem,
backtrack,
min_conflicts,
MOST_CONSTRAINED_VARIABLE,
HIGHEST_DEGREE_VARIABLE,
LEAST_CONSTRAINING_VALUE,
)
from simpleai.search.csp import convert_to_binary
from utils import print_grid
VARIABLES = ["slot1", "slot2", "slot3"]
# tipo, material, bonif, costo
ITEMS = [
("armadura", "madera", 1, 800),
("armadura", "hierro", 3, 1000),
("armadura", "acero", 5, 1300),
("espada", "madera", 1, 500),
("espada", "hierro", 2, 700),
("espada", "acero", 4, 1000),
("garrote", "madera", 6, 1300),
("pocion", "fuego", 5, 1500),
("pocion", "hielo", 2, 800),
("pocion", "acido", 3, 1200),
]
DOMAINS = {
variable: ITEMS
for variable in VARIABLES
}
CONSTRAINTS = []
def differents(variables, values):
item_a, item_b = values
return item_a != item_b
def una_armadura_max(variables, values):
item_a, item_b = values
return (item_a[0], item_b[0] != ("armadura", "armadura"))
def arma_de_mano(variables, values):
item_a, item_b = values
items_type = {item_a[0], item_b[0]}
return items_type not in [{"espada", "espada"}, {"espada", "garrote"}]
def fuego_y_madera(variables, values):
item_a, item_b = values
items_material = {item_a[1], item_b[1]}
return items_material != {"fuego", "madera"}
for variables_pair in combinations(VARIABLES, 2):
CONSTRAINTS.extend([
(variables_pair, differents),
(variables_pair, una_armadura_max),
(variables_pair, arma_de_mano),
(variables_pair, fuego_y_madera),
])
def valid_cost(variables, values):
cost = sum(item[-1] for item in values)
return cost <= 3000
def bonificador_total(variables, values):
bonif = sum(item[-2] for item in values)
return bonif >= 8
CONSTRAINTS.append((VARIABLES, valid_cost))
CONSTRAINTS.append((VARIABLES, bonificador_total))
def print_result(result):
for item in result.values():
print(item)
print("COST:", sum(x[-1] for x in result.values()))
print("BONIF:", sum(x[-2] for x in result.values()))
if __name__ == "__main__":
problem = CspProblem(VARIABLES, DOMAINS, CONSTRAINTS)
print("MIN CONFLICTS")
result = min_conflicts(problem, iterations_limit=100)
print_result(result)
print("-"* 50)
print("BACKTRACKING")
result = backtrack(problem)
print_result(result)