-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboard.py
220 lines (150 loc) · 7.39 KB
/
board.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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
from constant import CHESS_BOARD_SIZE_X, CHESS_BOARD_SIZE_Y, ARMY_WHITE
from rich.text import Text
from coord import Coord
from scuare import Scuare
from piece.piece import EmptyChess, EntityChess, PieceChess
class Board:
'''
Class Board:
((Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare), \n
(Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare, Scuare)) \n
> La clase Board es una representacion de un tablero de ajedrez que esta conformado
por una matriz 2D de 8 x 8 de clases "Scuare"
> La matriz es inmutable, las clases "Scuare" nunca cambiaran de posicion, ni se modificara
ni se agregara mas elementos
> Cada clase "Scuare contiene informacion de su coordenada actual en la matriz, ademas de que
puede poseer dentro de si una clase derivada de "EntityChess"("EmptyChess or "PieceChess").
> Al crear una instancia, todos los "Scuares tendran una instancia de la clase "EmptyChess"
como ficha por defecto.
Scuare(
coord = Coord(posicion_y, posicion_x), # Coordenada en la matriz
ficha = EmptyChess() # por defecto al instanciar la clase "Board"
)
> Las objetos "Scuare", si pueden cambiar la ficha que llevan dentro de si, por cualquier
objeto de clase "EmptyChess o derivadas de "PieceChess" como "Peon", "Rey", "Caballo", etc
> La mayoria de las funciones que realizan busquedas dentro de la matriz utilizan objetos "Coord"
como parametro
- ATRIBUTOS: \n
- size_y (int): Numero de elementos de eje y de la matriz \n
- size_x (int): Numero de elementos de eje y de la matriz \n
- content (tuple[tuple[Scuare]] ): Contenido de la matriz de "Scuare" \n
'''
size_y: int = CHESS_BOARD_SIZE_Y
size_x: int = CHESS_BOARD_SIZE_X
content: tuple[tuple[Scuare]]
def __init__(self) -> None:
'''
Al inicializar se llama a la funcion "refresh_content" para guardar en el atributo content
la matriz de "Scuare"
'''
self.refresh_content()
def refresh_content(self) -> None:
'''
Genera una matriz 2d 8 x 8 de clases "Scuare" usando List comprehension y lo guarda en el atributo content, la matriz esta conformada
de una tupla de tuplas se clases "Scuare" que se inicializan usando como parametros la coordenada
de la posicion actual y una instancia de "EmptyChess" que representa un ficha vacia
'''
self.content = tuple([
tuple([
Scuare(Coord(y, x), EmptyChess())
for x in range(self.size_x)
])
for y in range(self.size_y)
])
@property
def notation_forsyth_edwards(self) -> str:
result: str = ""
for column in self.content:
n_emptys: int = 0
for scuare in column:
piece: EntityChess = scuare.ficha
if isinstance(piece, EmptyChess):
n_emptys += 1
continue
if n_emptys != 0:
result += str(n_emptys)
n_emptys = 0
piece_fen = piece.str_fen.upper() if piece.clase == ARMY_WHITE else piece.str_fen
result += piece_fen
if n_emptys != 0:
result += str(n_emptys)
result += "/"
return result[: -1]
@property
def view(self) -> Text:
index: int = 8
result: Text = Text("\n")
result.append("____________________________\n")
result.append("| Board |\n")
result.append("|___________________________|\n\n")
result.append(" A B C D E F G H \n\n")
for column in self.content:
result.append(f"{index} ")
for scuare in column:
ficha = scuare.ficha
if isinstance(ficha, EmptyChess):
result.append("X ")
continue
if isinstance(ficha, PieceChess):
result.append(f"{ficha.char} ", style=f"bold {ficha.console_color}")
continue
result.append(f" {index}\n")
index -= 1
result.append("\n A B C D E F G H \n")
return result
def is_valid_coord(self, coord: Coord) -> bool:
'''
Verifica que la coordenada pasada como parametro sea una cordenada valida,
si es una coordenada valida retorna True de lo contrario False
El numero que representa la posicion de los ejes "Y" y "X" no deben ser negativos
y deben ser menores del tamaño del tablero
'''
return (self.size_y > coord.y >= 0) and (self.size_x > coord.x >= 0)
# Funcions gets
def get_ficha(self, coord: Coord) -> EntityChess | None:
'''
Retorna la ficha dentro del "Scuare" en la posicion de la coordenada pasada como parametro,
primero verifica si es una coordenada valida usando la funcion "is_valid_coord".
Si es una coordenada valida retorna la ficha del "scuare" de lo contrario retorna None
'''
return self.get_scuare(coord).ficha if self.is_valid_coord(coord) else None
def get_scuare(self, coord: Coord) -> Scuare | None:
'''
Retorna el "Scuare" en la posicion de la coordenada pasada como parametro,
primero verifica si es una coordenada valida usando la funcion "is_valid_coord".
Si es una coordenada valida retorna el "scuare" de lo contrario retorna None
'''
return self.content[coord.y][coord.x] if self.is_valid_coord(coord) else None
# Funcions set Fichas
def set_ficha(self, ficha: PieceChess, coord: Coord) -> None:
'''
Setea la ficha pasada como parametro en el "Scuare"
de la posicion de la coordenada pasada como parametro
'''
self.get_scuare(coord).ficha = ficha
def set_fichas(self, fichas: list[tuple[Coord, PieceChess]]) -> None:
'''
Setea varias fichas en varios Scuares
Toma como parametro una lista de datos emparejados de coordenada y ficha y realiza
un seteo por cada uno de los datos de la lista usando la funcion "set_ficha"
'''
for coord, ficha in fichas:
self.set_ficha(ficha, coord)
# En desarrollo
def trade_fichas(self, ficha_start: EntityChess, ficha_final: EntityChess, gen_empty_in_start: bool) -> None:
ficha_start.clear_influence(self)
ficha_final.clear_influence(self)
scuare_init: Scuare = ficha_start.scuare
scuare_final: Scuare = ficha_final.scuare
scuare_init.ficha = ficha_final
scuare_final.ficha = ficha_start
if gen_empty_in_start:
scuare_init.ficha = EmptyChess()
scuare_init.ficha.update_influence(self)
scuare_final.ficha.update_influence(self)