-
Notifications
You must be signed in to change notification settings - Fork 0
/
gameLogic.py
80 lines (57 loc) · 2.25 KB
/
gameLogic.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
import numpy as np
BLANK_SPACE = "_"
class Action:
def __init__(self, name:str, offset:tuple):
self.name = name
self.offset = offset
# possible_actions(): Tuple[int, int] -> List
# Objetivo: recebe uma posição na matriz 3x3 e devolve os movimentos possíveis
def possible_actions(grid, position:tuple[int,int]):
pos_row = position[0]
pos_col = position[1]
esquerda = Action("esquerda", (0, -1))
direita = Action("direita", (0, 1))
acima = Action("acima", (-1, 0))
abaixo = Action("abaixo", (1, 0))
adjacents_moves = {esquerda, direita, acima, abaixo}
possibilities = []
for move in adjacents_moves:
possible_grid = np.copy(grid)
row_off = move.offset[0]
col_off = move.offset[1]
row = pos_row + row_off
col = pos_col + col_off
if (row >= 0 and row <= 2) and (col >= 0 and col <= 2):
temp = possible_grid[pos_row, pos_col]
possible_grid[pos_row, pos_col] = possible_grid[row, col]
possible_grid[row,col] = temp
possibilities.append((possible_grid, move.name))
# else: movimento impossível
return possibilities
# decod_state(state): String -> None
# Transforma o estado em um array de caracteres e converte este para
# uma matriz 3x3 do jogo.
def decod_state(state:str):
estado = np.array(list(state))
state_grid = estado.reshape(3,3)
return state_grid
# cod_state(game_grid): ndarray -> str
# Transforma uma matriz de jogo em uma string em ordem linear
def cod_state(game_grid:np.ndarray[int,int])->str:
state_arr = game_grid.flatten()
state_list = state_arr.tolist()
state_str = ''.join(state_list)
return state_str
def sucessor(estado:str):
sucessors_set = set()
state_grid = decod_state(estado)
# Busca a posição do espaço em branco na matriz e retorna
# uma lista de ações possíveis
for idx_row, row in enumerate(state_grid):
for idx_col, col in enumerate(row):
if col == BLANK_SPACE:
actions = possible_actions(state_grid, (idx_row, idx_col))
for grid, movement in actions:
coded_state = cod_state(grid)
sucessors_set.add((movement, coded_state))
return sucessors_set