Llicència
Pots copiar i redistribuir aquest material seguint la llicència Attribution-NonCommercial-ShareAlike 4.0 International CC BY-NC-SA 4.0, indicant-ne autors originals, l'origen (aquesta web), sense fins comercials i mantenint-ne aquesta la llicència
Autors:
Practica UF2
- Usa el mateix projecte que l'usat als exercicis
- Crea un package cat.itb.elteuusuari(*).dam.m03.uf4.practica
- Assegura't de mostrar els mateixos textos usats als exemples.
- Quan la vulguis entregar afegeix el tag "practicaUF4" a la versió.
- Assegura't de pujar el tag al git i que el projecte compili.
- Exporta el projecte en un zip i entrega'l al classroom
- Per exportar el projecte ves a File->Export->Project To Zip File
(*) elteuusuari correspon a la direcció de correu eltectrònic del centre, sense punts, fins a @itb.cat
Sumari
ChessBoadApp
Després de mirar la sèrie de moda The Queen's Gambit i llegir un article sobre AlphaZero
has decidit que vols crar una IA que guanyi a AphaZero als escacs! Estas hipermotivat!
Després de fer un petit planing de les dificultats decideixes començar per un problema una mica més senzill.
Volem fer un petit joc d'escacs per consola. Per fer-ho anirem fent diferents petites tasques per anar construint el joc i anar perfecionant-lo.
Amb aquesta pràctica no finalitzarem el programa.
Escacs per consola?
Per pintar les peces usarem el caracters especials que conté unicode UTF Miscellaneous Symbols.
Podeu copiar les icones següents al codi java: ♜ ♞ ♝ ♛ ♚ ♟
Per distigir els colors de les peces en una terminal fosca o clara pintarem les blanques de color groc iles negres de color blau.
Tasques
Pintar figures (2p)
La nostra primera tasca serà pintar peces per la consola.
Crea la següent estructura de classes:
- ChessPiece és la classe pare, Rock, Bishop, Knight, King, Queen i Pawn són les filles.
- ChessPiece conté el boleà white que és true si és una peça blanca i false si és negra
- ChessPiece conté el mètode abstracte getPieceString() que retorna el String usat per pintar la figura ("♜" en el cas de la torre)
- ChessPiece conté el mètode toString() s'encarregarà de tornar el String corresponent a la peça amb el color corresponent.
Fes la classe PrintChessPieceTest que crei una Rock i la printa per pantalla (les sortides presentades en aquest enunciat no tenen color. Les del programa si que n'haurien de tenir)
Output
♜
Pintar Taulell v1
Ja podem printa les peces. Començarem a preparar el taulell.
Necessitarem una classe ChessBoard que tindrà una matriu de 8x8 amb les diferents peces.
- A la constructora afegeix les peces a la seva posició inicial.
- Defineix el mètode paint que pinti la peça que hi ha a cada posició
Fes la classe PrintChessBoardTest que printi el taulell per pantalla.
Output
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♟♟♟♟♟♟♟♟
♜♞♝♛♚♝♞♜
Pintar Taulell v2
Per fer més llegible el taulell modifica el mètode paint per a que el pinti amb el següent format.
Pots usar el mateix PrintChessBoardTest per probar de pintal el taulell
Output
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | | | | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1|♜|♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Moure peça
Ja tenim el taulell pintat. Ara hem de permetre que l'usuari mogui les peces.
Per fer-ho introduirà la posició on està la peça i a on ha d'anar. Al fer-ho es mourà la peça (sense tenir en compte si el moviment és possible).
Defineix el mètode move dins de ChessBoard que mogui una peça d'una posició a una altre.
Crea la classe ChessBoadApp que printi per pantalla el taulell. Llegeix de la consola les cordenades, mou la fitxa i torna a imprimir el taulell. Quan l'usuari entra -1 s'acaba el programa
Input
a1 c3
-1
Ouput
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | | | | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1|♜|♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
8|♜ |♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | |♜| | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1| |♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Moviment possibles
Per ara tots els moviments són possibles: una torre es pot moure en diagonal, no mires si xoca amb una altre peça,…
Començarem a limitar alguns moviments.
Per fer-ho cal implementar el mètode isMovePossible() que retornarà true si el moviment està permès.
abstract boolean isMovePossible(Position from, Position to);
Moviment torre
Fes que la torre només es pugui moure en vertical o horitzonal (les altres peces es poden moure de qualsevol manera)
No tenim en compte si hi ha peces en el camí.
Si l'usuari entra un moviment impossible imprimeix "Moviment impossible" i torna a imprimir el taulell.
S'ha de tindre en compte si hi ha una peça que es puga moure.
Input
a3 a4
a1 c3
a1 a5
-1
Output
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | | | | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1|♜|♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Error! No hi ha cap peça a A3!
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | | | | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1|♜|♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Error! El moviment Torre A1 a C3 no està permitit.
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5| | | | | | | | |
4| | | | | | | | |
3| | | | | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1|♜|♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Torre es mou de A1 a A5
8|♜|♞|♝|♛|♚|♝|♞|♜|
7|♟|♟|♟|♟|♟|♟|♟|♟|
6| | | | | | | | |
5|♜| | | | | | | |
4| | | | | | | | |
3| | || | | | | |
2|♟|♟|♟|♟|♟|♟|♟|♟|
1| |♞|♝|♛|♚|♝|♞|♜|
A B C D E F G H
Moviment àlfil
Fes que l'`alfil només es pugi moure en diagonal.
Altres moviments
Limita els moviment de les següents peces: cavall, rei, reina, peó
- En el cas del peó permetrem sempre que es pugui moure en diagonal (acció de menjar peça)
Ampliació
Partida per torns
Programar una partida. La idea és que en cada torn, el jugador pot moure les seues peces (i sols capturar les peces del contrincant).
- Mostrar el tauler des de cada punt de vista del jugador actual (blanc/negre). Sempre comencen les blanques.
- El jugador sols pot moure les seues peces.
- El jugador sols pot capurar les peces dels contrincant.
Moviment del peó
El peo és la peça que més condicions té a l'hora de moure's.
- Sols pot avançar una casella en vertical, no es pot moure en horitzontal. No pot tornar enrere.
- Des de la casella de sortida (si no s'ha menejat) pot avançar dues caselles.
- Sols pot capturar a una casella en diagonal.
- Pot capturar un peó que l'haja sobrepassat amb un moviment de dues caselles En passant
Check (jaque)
- El rei no es pot moure a una casella la qual està amenaçada per una peça del contrincant.
- Si el rei està amenaçat, sols es poden realitzar moviments que eliminen aquesta amenaça. Si no hi ha cap es produeix Checkmate (Escac i mat) i s'acaba la partida.