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
        1. Output
      3. Pintar Taulell v2
        1. Output
      4. Moure peça
        1. Input
        2. Ouput
      5. Moviment possibles
        1. Moviment torre
          1. Input
          2. Output
        2. Moviment àlfil
        3. Altres moviments
      6. Ampliació
        1. Partida per torns
        2. Moviment del peó
        3. Check (jaque)

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{ #boolean white +isWhite() boolean +toString() String #abstract_getPieceString()* String +abstract_isMovePossible(Position from, Position to)* boolean } 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

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 ChessPiece{ #boolean white #Position position +isWhite() boolean +toString() String #abstract_getPieceString()* String +abstract_isMovePossible(Position to)* boolean } class ChessBoard{ -ChessPiece[][] board +printBoard() } ChessPiece "*" <-- "1" ChessBoard : board

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

classDiagram class ChessBoard{ -ChessPiece[][] board +printBoard() +movePiece(from, to) }

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ó

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

Moviment del peó

El peo és la peça que més condicions té a l'hora de moure's.

Check (jaque)