Ajedrez en Python: Proyecto Integrador
Ajedrez en Python: Proyecto Integrador
COMPUTACIONALES
“AJEDREZ”
EN PHYTON
PROYECTO INTEGRADOR
❖ PRESENTA:
❖ MARTINEZ SEGURA JOSE
❖ DE LA CRUZ VILLA JOCELYN
❖ OSORNO HERNÁNDEZ FERNANDO ALEJANDRO
❖ VILLALÓN JAIMES BRYAN JOSUÉ
❖ HERNANDEZ CLETO ABIGAIL
❖ GONZALEZ CAMPUZANO EMMANUEL
Índice
INTRODUCCIÓN ................................................................................................................................... 3
PLANTEAMIENTO ................................................................................................................................ 4
OBJETIVOS ........................................................................................................................................... 6
Objetivos Específicos: ...................................................................................................................... 6
ALCANCE.............................................................................................................................................. 7
Alcance de un Programa de Ajedrez en Python .............................................................................. 8
JUSTIFICACIÓN .................................................................................................................................... 9
Beneficios educativos ...................................................................................................................... 9
Beneficios técnicos .......................................................................................................................... 9
Marco Teórico ................................................................................................................................... 10
Marco Metodológico ......................................................................................................................... 11
Configuración PY ........................................................................................................................... 11
Canvas ........................................................................................................................................... 12
Denominación de piezas de ajedrez ............................................................................................. 13
Convención para nombrar ubicaciones en el tablero de ajedrez ................................................. 13
Definición de reglas para las piezas de ajedrez............................................................................. 23
Reglas para un caballo................................................................................................................... 27
La validación del movimiento de piezas de ajedrez ...................................................................... 33
CRONOGRAMA .................................................................................................................................. 33
REESULTADO ..................................................................................................................................... 35
CONCLUSIONES ................................................................................................................................. 38
ANEXOS…………………………………………………………………………………………………………..……………………………40
2
INTRODUCCIÓN.
3
PLANTEAMIENTO.
El objetivo del programa es simular una partida de ajedrez completa entre dos jugadores. El
programa debe ser capaz de:
Las principales características para poder realizar el ajedrez en Python es entender las
abreviaturas MVC.
MVC: Model, View, Controller es el patrón de diseño más utilizado. A los desarrolladores
les resulta fácil implementar este patrón de diseño.
MODEL: En nuestra arquitectura MVC es aquella que se encarga de trabajar con los datos;
por lo que normalmente dentro del modelo encontraremos la lógica de aplicación, que
interactúa con la base de datos. Incluye toda la información para representar los datos al
usuario final.
VIEW: La vista representa los archivos HTML, que interactúan con el usuario
final. Representa los datos del modelo para el usuario.
4
CONTROLLER: contiene el código fuente necesario para responder a las acciones que el
usuario solicita y servir como puente de interacción entre las vistas y el modelo de datos.
Entrada:
• Posición Inicial de las Piezas: El software permitirá al usuario optar entre leer la
posición inicial de las piezas desde un archivo o ingresarla manualmente.
• Movimientos de los Jugadores: Los jugadores podrán introducir sus movimientos
haciendo clic en el tablero para desplazar las piezas según las reglas del juego.
Salida:
5
OBJETIVOS.
Objetivos Específicos:
• Crear una representación del tablero de ajedrez mediante una matriz de 8x8.
• Desarrollar las reglas de movimiento para cada pieza: peón, torre, alfil, caballo,
dama y rey.
• Facilitar la captura de piezas durante el juego.
• Visualizar el estado del tablero en la pantalla mediante una interfaz de usuario
intuitiva y amigable.
6
ALCANCE.
Nivel Principiante:
Nivel Intermedio:
• Un programa con una interfaz gráfica de usuario (GUI) que muestra de forma
visual el tablero y las piezas.
• Herramientas de análisis de jugadas y sugerencias de movimientos más
avanzadas para mejorar las habilidades de los jugadores.
• La posibilidad de desafiar a un oponente controlado por la computadora con
un nivel de habilidad intermedio.
Nivel Avanzado:
7
JUSTIFICACIÓN.
Beneficios educativos
Beneficios técnicos
8
Marco Teórico.
El ajedrez es un juego de estrategia para dos jugadores que se disputa sobre un tablero
cuadriculado de 64 casillas (8x8). Cada jugador comienza con 16 piezas: un rey, una reina,
dos torres, dos caballos, dos alfiles y ocho peones. El objetivo del juego es dar jaque mate al
rey del oponente, lo que significa que el rey está bajo amenaza y no puede escapar.
1-Tablero de ajedrez
a) Representación del tablero: Puedes utilizar una matriz bidimensional para representar
el tablero, donde cada celda contiene información sobre la pieza que está en esa
posición (si hay alguna) o si está vacía.
b) Coordenadas: Puedes usar una notación de coordenadas algebraicas como "a1", "b2",
etc., o simplemente coordenadas numéricas (fila, columna).
c) Tamaño del tablero: El estándar es un tablero de 8x8, pero también puedes considerar
tableros de diferentes tamaños para variantes del juego.
2-Piezas:
● Implementa las reglas del juego para determinar qué movimientos son legales en
una posición dada.
● Esto incluye reglas como el jaque, el jaque mate y el empate por ahogado.
4-Interfaz de Usuario:
● Puedes implementar una interfaz de línea de comandos (CLI) o una interfaz gráfica
de usuario (GUI) para que los jugadores interactúen con el juego.
9
● Para una interfaz gráfica, puedes usar bibliotecas como Tkinter, Pygame o Model,
View, Controller.
● La lógica del juego manejará la interacción entre el tablero, las piezas y las reglas
del juego.
● Debe ser capaz de validar movimientos, detectar jaque mate, mantener un registro
de movimientos y manejar el flujo del juego.
● Jugabilidad uno a uno
6-Pruebas y Depuración:
Las pruebas unitarias y las pruebas de integración son útiles para garantizar el buen
funcionamiento del juego en diferentes situaciones.
Implementar el ajedrez en Python es una tarea desafiante pero gratificante que puede ayudarte
a desarrollar tus habilidades de programación y lógica. Las bibliotecas y herramientas
disponibles en Python facilitan el proceso, pero es importante comprender las reglas del juego
y los conceptos básicos de la programación para crear una implementación completa y
funcional.
10
Marco Metodológico.
Configuración PY.
Se genero una carpeta para que los valores constantes que estén disponibles para todos
los archivos y también los importamos en las carpetas model.py, controller.py y view.py.
También se creó una carpeta llamada excepción para manejo de errores y excepciones.
Según los principios de la arquitectura MVC la clase view interactúa con la clase model y
controller y estás siempre permanecerán ligadas en consecuencia importamos el controlador
en la clase view y el model en la clase controller.
11
Canvas.
Es un área rectangular destinada a hacer dibujos u otros diseños complejos. Puedes
colocar gráficos, texto, widgets o marcos en un lienzo.
Para poder mostrar nuestro tablero en la pantalla utilizamos canvas que sirve para poder
mostrar una imagen en pantalla en el cual van declaradas el tamaño del tablero del numero
de columnas y filas.
12
Denominación de piezas de ajedrez.
Cada pieza de ajedrez está identificada por una sola letra (peón = p, caballo = n, alfil
= b, torre = r, reina = q y rey = k).
P=pawn.
N=knight.
B=bishop.
R =rook.
Q= Queen.
K=King.
Las piezas de ajedrez blancas están representadas por letras mayúsculas (P, N, B, R, Q, K),
y las piezas de ajedrez negras están representadas por letras minúsculas (p, n, b, r, q, k).
13
Por tanto, A1 denota la casilla situada más a la izquierda en la parte inferior del tablero de
ajedrez. Actualmente, está ocupada por una torre blanca. La posición C3 está actualmente
vacía, E8 tiene un rey negro, y A8 tiene una torre negra.
14
Necesitamos estos datos para comenzar. Entonces, agreguemos esto como una constante a la
configurations.py.
Ahora, pasemos a codificar la clase Modelo para nuestro programa. Ya hemos decidido que
usaremos un diccionario Python para almacenar la posición de las piezas de ajedrez en el
tablero de ajedrez. Podemos seguir adelante y agregar un atributo de diccionario a la clase.
Hagamos de Model una clase secundaria de la clase de diccionario incorporada, de la
siguiente manera:
Por lo tanto, la variable self que hace referencia a la instancia del objeto de clase actual
también tendrá todas las propiedades y métodos que están disponibles para el diccionario.
todos los métodos que están disponibles para la clase de diccionario estándar ahora se pueden
llamar en el Modelo.
Ahora podemos definir un método que devuelva el nombre corto de la pieza de ajedrez en
esa posición cuando se le da una posición en el tablero de ajedrez, de la siguiente manera (en
model):
Si no hay ninguna pieza de ajedrez en la posición, esto atrapa en lugar de dar un KeyError
excepción.
A continuación, agreguemos algunos atributos más importantes a la clase Modelo, de la
siguiente manera: (ver model.py).
15
El reloj de medio movimiento mantiene un registro del número de turnos jugados desde el
último avance del peón o la última captura. Esto se utiliza para determinar si un empate puede
ser reclamado bajo la regla de los cincuenta movimientos.
El número de movimiento completo es un conteo que se incrementa en 1 después de cada
movimiento de una pieza negra. Esto se utiliza para realizar un seguimiento de la duración
total de un juego.
Finalmente agreguemos otro método que, dada la tupla fila-columna para un cuadrado,
cambia su posición alfanumérica (por ejemplo, una entrada de (1,2) devuelve B3):
A continuación, definamos un método auxiliar asociado para garantizar que solo procesemos
clics del mouse que ocurren en el widget Canvas y no en ningún otro lugar de la raíz ventana,
de la siguiente manera:
No hay mucho que se pueda agregar a la clase Modelo por ahora hasta que establezcamos
la lógica del código para manejar las piezas de ajedrez.
Podemos definir las reglas para todas las piezas de ajedrez dentro de la clase Modelo, pero
eso haría que la clase Model fuera demasiado voluminosa. Por lo tanto, definamos la pieza
de ajedrez.
La lógica relacionada en un nuevo archivo llamado piece.py. Dado que esto es
inherentemente una parte de la Clase de model, pero está definida en un archivo nuevo,
agreguemos una referencia a la clase de modelo dentro de este archivo. (ver pieza.py)
Creando una clase de pieza
16
Necesitamos definir reglas para todas las diferentes piezas de ajedrez. Algunos métodos
como el color serán comunes a todas las piezas de ajedrez, mientras que otros
atributos/métodos, como las reglas de movimiento, variarán para cada ajedrez.
Primero, definiremos una nueva clase Piece. Esta clase tendrá los atributos y métodos, que
son comunes a todas las piezas de ajedrez. Luego, definiremos clases para cada individuo.
La pieza individual como una subclase de esta clase pieza principal. Luego podemos anular
todos los atributos y métodos en estas clases individuales.
La clase Piece necesita el color como argumento para la creación de objetos. Nosotros
creamos dos atributos llamados self.name y self. Color en la clase.
La definición del método keep_reference (self, model). Desde la clase Piece no es más que
una extensión de la clase Modelo, necesitamos obtener una referencia a la Clase modelo en
este método para comunicarse con él.
De manera similar, la clase Modelo necesita una referencia a la nueva clase Pieza. En
consecuencia, agregue esto como una importación a la clase Modelo, de la siguiente manera
(consulte el código model.py):
17
Finalmente, necesitamos un método que tome una cadena perteneciente al nombre de un
determinado objeto pieza y crea un nuevo objeto pieza. Por ejemplo, necesitamos un método
que,
dados los argumentos (Peón, negro) o simplemente ("p"), crea dinámicamente un nuevo Peón
objeto con el atributo de color definido como negro.
El código anterior simplemente toma un solo carácter como entrada. Luego obtiene completo
el nombre para la clase de pieza correspondiente (por ejemplo, si se da una p, obtiene el valor
completo nombre, que es Peón).
18
Luego verifica el caso del personaje y define la variable de color como blanco si el carácter
de entrada está en mayúsculas. De lo contrario, el color es establecido en negro. Luego crea
dinámicamente un objeto pieza correspondiente.
Esto concluye la iteración. Hemos creado la clase Piece y todas sus subcategorías. Tenemos
la capacidad de crear objetos, pieza dinámicamente a partir de un determinado carácter de
entrada. Esta clase es simplemente una extensión de la clase Modelo, y cada una de las dos
clases pueden acceder a los métodos de cada una manteniendo una referencia a cada uno.
•Las imágenes de las piezas de ajedrez se almacenan en una carpeta llamada piezas imagen
y se nombran en el nombre de la pieza de ajedrez en formato minúscula + _ + color.png.
Entonces, por ejemplo, la reina negra se guarda con el nombre queen_black.png.
•Las imágenes se agregan al tablero de ajedrez usando canvas.create_image() método, que
toma las coordenadas (x , y) un objeto PhotoImage() que se basa en la ubicación del archivo
de imagen como argumento.
•Utilizamos la clase PhotoImage de Tkinter para hacer referencia a los archivos .png.
•Además de crear y exhibir una pieza de ajedrez en el tablero, también los etiqueta con una
etiqueta personalizada llamada ocupado. El etiquetado es importante característica del widget
Canvas, que nos permite identificar de forma única los elementos colocados en el widget de
lienzo.
También utilizamos los siguientes dos métodos auxiliares en el código anterior: (ver view.py)
19
Ahora es el momento de simplemente llamar al método draw_single_piece anterior para
todos los
piezas de ajedrez: (view.py)
Un aspecto clave que debe tener en cuenta aquí es que cuando necesitábamos algunos datos
del Clase modelo, digamos, un diccionario que contiene todas las piezas de ajedrez en el
tablero, no llamó directamente a la clase Modelo para los datos. En lugar de ello, solicitamos
la controller para conseguirnos los datos del modelo. El método
get_all_pieces_on_chess_board()
El método del controlador es simplemente un contenedor alrededor del método real de la
clase Modelo. (ver controller.py):
20
Ahora tenemos los métodos necesarios para dibujar todas las piezas de ajedrez en el tablero
de ajedrez. Pero la mera definición no ayuda. Estos métodos deben llamarse desde algún
lugar. Por lo tanto, definamos un nuevo método llamado start_new_game() y llámelo desde
el método __init__ de la clase View, de la siguiente manera.
Además de llamar al método draw_all Pieces(), este método también restablece el Modele
mediante llamadas a dos métodos de controlador contenedor (ver – controller.py):
El método reset_game_data() es simple. Simplemente restablece todos los atributos del Clase
modelo a sus estados iniciales.
21
Ahora, cuando continúas y ejecutas el código (ver – view.py), el ajedrez-
El tablero debe mostrar todas las piezas de ajedrez en la posición inicial del juego, como
se muestra en la siguiente captura de pantalla:
22
Definición de reglas para las piezas de ajedrez.
Diferentes piezas de ajedrez tienen diferentes reglas de movimiento. Intentemos
tabular la
normas:
Como se desprende de la tabla, las reglas para todas las piezas de ajedrez, excepto el caballo
y los peones son bastante sencillos.
El movimiento del caballo es diferente a los demás. Deben mover dos casillas en una
dirección, y luego un movimiento más en un ángulo de 90 grados, siguiendo la forma de L.
Los caballos son también las únicas piezas de ajedrez que pueden saltar sobre otras piezas de
ajedrez.
23
El siguiente diagrama muestra lo que se necesita para mover una pieza de ajedrez desde su
posición (digamos x, y) tanto ortogonal como diagonalmente:
De manera similar, los movimientos diagonales se pueden representar sumando a las tuplas
(-1,1) (1,1) (1,-1) (-1,-1).
Las tuplas en Python o tuples son muy similares a las listas, pero con dos diferencias.
Son inmutables, lo que significa que no pueden ser modificadas una vez declaradas, y en
vez de inicializarse con corchetes se hace con ().
Dependiendo de lo que queramos hacer, las tuplas pueden ser más rápidas.
Agreguemos estas dos tuplas a configurations.py, de la siguiente manera:
24
Si una pieza de ajedrez puede moverse tanto ortogonal como diagonalmente, como la Reina,
La tupla representativa es simplemente una suma de las dos tuplas anteriores.
Si una pieza de ajedrez se puede mover más de una casilla, es simplemente una cuestión de
multiplicar la tupla representativa por un número entero para obtener todas las demás
posiciones permitidas.
Con esta información en mente, codifiquemos un método de moves_avaibles que, dada la
posición actual de la pieza de ajedrez, la tupla de direcciones relevantes para la pieza de
ajedrez
y la distancia máxima que puede moverse la pieza de ajedrez, devuelve una lista de todas las
tulpas.
Allow_moves, de la siguiente manera (ver – piece.py):
•Dependiendo de los argumentos, el método recopila todos los movimientos permitidos para
una pieza de ajedrez dada en una lista llamada moves_avaibles.
•El código registra en iteración todas las ubicaciones para detectar una posible colisión. Si se
detecta una colisión, se sale del bucle. De lo contrario, añade la coordenada a la lista de
moves_avaibles.
•La penúltima línea filtra los movimientos que quedan fuera del tablero de ajedrez, y la última
línea devuelve la posición equivalente en notaciones alfanuméricas para todos los
movimientos permitidos.
25
También podemos definir algunos métodos auxiliares para respaldar el método anterior,
como se muestra a continuación:
A continuación, modifiquemos las clases secundarias de piezas de Rey, Reina, Torre y Alfil
de la siguiente manera: (ver– piece.py):
26
Reglas para un caballo.
El Caballo es una bestia diferente porque no se mueve ni ortogonal ni diagonalmente.
También puede saltar sobre piezas de ajedrez.
Como las reglas que seguimos antes para llegar a ORTHOGONAL_POSITIONS y
DIAGONAL_POSITIONS, podemos llegar de manera similar a las reglas que se requieren
para determine la tupla KNIGHT_POSITIONS. Esto se define en configuraciones.py, de la
siguiente manera:
•El método es bastante similar al método de la superclase anterior. Sin embargo, a diferencia
del método de superclase, los cambios se representan para capturar movimientos usando la
tupla KNIGHT_POSITIONS.
•A diferencia de la súper clase, no necesitamos rastrear las colisiones, porque los Caballeros
Puede saltar sobre otras piezas de ajedrez.
27
Reglas para un peón.
Un peón también tiene un movimiento único porque avanza. De manera similar,
anulemos la clase moves_avaibles desde dentro de la clase Peón, de la siguiente manera (ver
– piece.py):
28
•Un peón puede capturar sólo las piezas de ajedrez diagonalmente adyacentes que tiene
delante.
Por lo tanto, asignamos un ataque variable para rastrear la posición diagonalmente adyacente.
Si el cuadrado diagonalmente adyacente está ocupado por un enemigo, esa posición califica
para ser agregada a la lista de moves_avaibles.
•Luego, filtramos la lista para eliminar todas las posiciones que pueden quedar fuera del
tablero de ajedrez. La última línea devuelve todos los movimientos permitidos como una lista
de notaciones alfanuméricas correspondientes, como hicimos en todas las definiciones
anteriores.
El código necesario para realizar un seguimiento de todos los movimientos disponibles para
un jugador es el siguiente:
29
La descripción del código se enumera a continuación:
•Ya hemos codificado el método move_available en la iteración anterior.
•El método anterior simplemente recorre en iteración cada elemento del diccionario y agrega
el resultado de move_available para cada pieza de ajedrez de un color determinado en una
lista llamada resultado.
El código anterior simplemente recorre en iteración todos los elementos del diccionario. Si
un dado position es una instancia de la clase King, simplemente devuelve su posición.
30
Descripción del código anterior:
•Primero, obtuvimos la posición actual del Rey y el color del oponente.
•Luego descubrimos todos los movimientos posibles para todas las piezas de ajedrez del
oponente. Si la posición del Rey coincide con cualquier posición de todas las posiciones,
posibles movimientos, el Rey está en jaque y devolvemos Verdadero. De lo contrario,
volvemos FALSO.
Hacer que el juego sea funcional
Ahora que tenemos todas las piezas de ajedrez y las reglas de validación relacionadas con el
tablero, demos, ahora vida a nuestro programa de ajedrez. En esta iteración, haremos nuestro
Juego de ajedrez totalmente funcional.
El objetivo de esta iteración es mover las piezas de ajedrez con un clic de la izquierda. Botón
del ratón. Cuando un jugador hace clic en una pieza de ajedrez, el código primero debe
verificar si es un turno legítimo para esa pieza de ajedrez.
Con el primer clic, se selecciona la pieza de ajedrez que se debe mover y se muestran todas
las demás.
Los movimientos indicados para esa pieza de ajedrez se resaltan en el tablero. El segundo el
clic debe realizarse en el cuadrado de destino. Si el segundo clic se realiza en una casilla de
destino válida, la pieza de ajedrez debe moverse desde la casilla de origen hasta la plaza de
destino.
También necesitamos codificar los eventos de capturar piezas de ajedrez y que el Rey esté
en jaque. Los otros atributos que deben ser rastreados incluyen una lista de las piezas
capturadas del ajedrez, el conteo del reloj de medio movimiento, el conteo de números del
movimiento completo y el historial.
Anteriormente creamos un método ficticio que está vinculado al clic izquierdo evento. El
método por ahora simplemente imprime el valor de la fila y la columna en la consola.
Modifiquemos este método de la siguiente manera (ver código – view.py):
31
Descripción del código:
•La primera parte del código calcula las coordenadas de la pieza de ajedrez en el que hiciste
clic. En base a las coordenadas calculadas, almacena las coordenadas notación de la letra
correspondiente en una variable denominada position_of_click.
•Luego intenta asignar la variable pieza a la instancia de pieza correspondiente. Si no hay
ninguna pieza en el cuadrado en el que se hizo clic, simplemente ignora el clic.
•La segunda parte del método comprueba si este es el segundo clic que estaba destinado a
mover una pieza de ajedrez a una casilla de destino. Si esta es la segunda. Con un segundo
clic, llama al método de desplazamiento, pasando las coordenadas de origen y destino.
•Si el cambio tiene éxito, establece todos los atributos establecidos previamente en su estado
vacío original y llama a los métodos draw_board y draw_pieces para volver a dibujar el
tablero de ajedrez y piezas de ajedrez.
Mientras codificamos la funcionalidad deseada para el método on_square_clicked, llamamos
varios métodos nuevos desde su interior. Necesitamos definir estos nuevos métodos.
Éste es el método central en torno al cual se basan todos los demás. Los métodos
evolucionarán a lo largo de nuestros intentos de hacer que el juego de ajedrez funcione.
32
CRONOGRAMA.
33
• Ajustes finales en la jugabilidad y la interfaz de usuario según la
retroalimentación obtenida durante las pruebas.
34
RESULTADO.
En el mundo digital del ajedrez, cada partida es un emocionante enfrentamiento entre
estrategia y habilidad. Al ejecutar este programa creado en Python, se despliega un tablero
virtual que se convierte en el campo de batalla donde los jugadores compiten por la
supremacía. Veamos cómo podría desarrollarse el resultado de una partida:
La pantalla se ilumina con la representación visual del tablero, cada casilla esperando ser
ocupada por las piezas. Los jugadores, con concentración palpable, hacen clic para mover
sus piezas con destreza y cautela. El flujo del juego avanza con movimientos precisos y
calculados, mientras el programa registra cada acción con precisión milimétrica.
Durante la partida, la tensión crece a medida que los jugadores despliegan sus estrategias.
Los peones avanzan audazmente, las torres dominan las columnas, los caballos saltan en
movimientos impredecibles, y la dama y el rey defienden su territorio con valentía. La
pantalla se llena de acción mientras las piezas rivalizan por el control del tablero.
35
El programa, dotado de inteligencia artificial, evalúa cada jugada y ofrece sugerencias
tácticas para mejorar el juego de los participantes. Las herramientas de análisis proporcionan
a los jugadores una visión más profunda de la posición y las posibles estrategias a seguir.
A medida que la partida se acerca a su clímax, la emoción se intensifica. Cada movimiento
se vuelve crucial, y los jugadores deben tomar decisiones cuidadosas para evitar los embates
del oponente y buscar oportunidades para alcanzar la victoria.
Finalmente, después de una intensa batalla mental, un jugador logra asegurar la victoria,
capturando el rey del oponente y proclamando su triunfo. El tablero se congela en la posición
final, mostrando el resultado de la partida mientras los jugadores reflexionan sobre su
desempeño y planean su próxima estrategia para el siguiente enfrentamiento.
Así concluye una emocionante partida de ajedrez en el mundo virtual, donde la estrategia, la
habilidad y la emoción se combinan para ofrecer una experiencia única y cautivadora para
los amantes del juego milenario.
36
CONCLUSIONES.
Luego de completar el desarrollo del programa de ajedrez en Python, se pueden
extraer varias conclusiones importantes:
1. Viabilidad Tecnológica:
2. Desafíos Técnicos:
3. Importancia de la Planificación:
La fase inicial de planificación y diseño resultó fundamental para el éxito del proyecto.
Definir claramente los requisitos, establecer objetivos y diseñar una arquitectura sólida
contribuyó significativamente a la eficiencia y efectividad del desarrollo.
4. Pruebas Rigurosas:
37
6. Continuidad del Mantenimiento:
38
Anexos
- Ajedrez de Torneo. (s.f.). Historia del ajedrez.
- Efdeportes. (s.f.). Ajedrez en la escuela.
- Tecnologia+Informatica. (s.f.). El ajedrez y su historia.
- Krerivas. (s.f.). Historia del ajedrez.
- Russ, H. (2017). *Bobby Fischer Teaches Chess*. Bantam.
- Silman, J. (1999). *The Amateur's Mind: Turning Chess Misconceptions into Chess Mastery*. Siles
Press.
- Dvoretsky, M. (2014). *Dvoretsky's Endgame Manual*. Russell Enterprises.
- Chernev, I. (2018). *Logical Chess: Move By Move: Every Move Explained New Algebraic Edition*.
Batsford.
- Kasparov, G. (2010). *Garry Kasparov on My Great Predecessors, Part 1*. Everyman Chess.
- Pandolfini, B. (2003). *Pandolfini's Ultimate Guide to Chess*. Fireside.
- Schiller, E. (2003). *Learn to Play Chess Like a Boss: Make Pawns of Your Opponents with Tips and
Tricks from a Grandmaster of the Game*. Adams Media.
- Watson, J. (2016). *A Strategic Chess Opening Repertoire for White*. Mongoose Press.
- Soltis, A. (2003). *Pawn Structure Chess*. Batsford.
- Kasparov, G. (2007). *How Life Imitates Chess: Making the Right Moves, from the Board to the
Boardroom*. Bloomsbury Publishing.
- Fine, R. (2015). *Basic Chess Endings*. Ishi Press.
39