Practica UF2

(*) elteuusuari correspon a la direcció de correu eltectrònic del centre, sense punts, fins a @itb.cat

Sumari

  1. ChessBoadApp
    1. Escacs per consola?
    2. Tasques
      1. Pintar figures (2p)
        1. Output
      2. Pintar Taulell v1 (2p)
        1. Output
      3. Pintar Taulell v2 (1p)
        1. Output
      4. Moure peça (2p)
        1. Input
        2. Ouput
      5. Moviment possibles (3p)
        1. Moviment torre
          1. Input
          2. Output
        2. Moviment àlfil
        3. Altres moviments

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:

classDiagram class ChessPiece ChessPiece : +boolean white ChessPiece : +void paint() ChessPiece : +String abstract_getPieceString() ChessPiece <|-- Rock ChessPiece <|-- Bishop ChessPiece <|-- Knight ChessPiece <|-- King ChessPiece <|-- Queen ChessPiece <|-- Pawn

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.

classDiagram class ChessBoard ChessBoard : +void paint() class ChessPiece ChessPiece : +boolean white ChessPiece : +void paint() ChessPiece : +String abstract_getPieceString() ChessPiece "*" <-- "1" ChessBoard : board

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).

classDiagram class ChessBoard ChessBoard : +void paint() ChessBoard: +void move(int i, int j, int i2, int j2)

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ó