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 paint que pinta la peça amb el color.
- ChessPiece conté el mètode abstracte getPieceString() que retorna el String usat per pintar la figura ("♜" en el cas de la torre)
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 (2p)
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 (1p)
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
0 1 2 3 4 5 6 7
0|♜|♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | | | | | | | |
3| | | | | | | | |
4| | | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
Moure peça (2p)
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
0 0 2 2
-1
Ouput
0 1 2 3 4 5 6 7
0|♜|♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | | | | | | | |
3| | | | | | | | |
4| | | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
0 1 2 3 4 5 6 7
0| |♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | |♜| | | | | |
3| | | | | | | | |
4| | | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
Moviment possibles (3p)
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 defineix el següent mètode abstracte a ChessPiece que retorna true si la peça es pot moure de la posició i,j a la i2,j2. Per ara fes que sempre retorni true (una peça es pot moure a qualsevol lloc).
abstract boolean canMove(int i, int j, int i2, int j2);
Moviment torre
Fes que la torre només es pugui moure en vertical o horitzonal (les altres peces es poden moure de qualsevol manera)
Si l'usuari entra un moviment impossible imprimeix "Moviment impossible" i torna a imprimir el taulell.
Input
0 0 2 2
0 0 4 0
-1
Output
0 1 2 3 4 5 6 7
0|♜|♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | | | | | | | |
3| | | | | | | | |
4| | | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
Moviment impossible
0 1 2 3 4 5 6 7
0|♜|♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | | | | | | | |
3| | | | | | | | |
4| | | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
0 1 2 3 4 5 6 7
0| |♞|♝|♛|♚|♝|♞|♜|
1|♟|♟|♟|♟|♟|♟|♟|♟|
2| | | | | | | | |
3| | | | | | | | |
4|♜| | | | | | | |
5| | | | | | | | |
6|♟|♟|♟|♟|♟|♟|♟|♟|
7|♜|♞|♝|♛|♚|♝|♞|♜|
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)