2019-07-07 13:53:57 +02:00
|
|
|
package dev.kske.chess.game;
|
|
|
|
|
2019-07-17 08:26:51 +02:00
|
|
|
import java.util.HashMap;
|
2019-07-07 13:53:57 +02:00
|
|
|
import java.util.Map;
|
|
|
|
|
2019-07-23 11:02:34 +02:00
|
|
|
import javax.swing.JOptionPane;
|
|
|
|
|
2019-07-07 13:53:57 +02:00
|
|
|
import dev.kske.chess.board.Board;
|
2019-07-07 21:07:58 +02:00
|
|
|
import dev.kske.chess.board.GameState;
|
2019-07-07 13:53:57 +02:00
|
|
|
import dev.kske.chess.board.Move;
|
|
|
|
import dev.kske.chess.board.Piece.Color;
|
2019-08-04 14:40:25 +02:00
|
|
|
import dev.kske.chess.event.EventBus;
|
2019-08-07 18:54:00 +02:00
|
|
|
import dev.kske.chess.event.MoveEvent;
|
2019-07-17 08:26:51 +02:00
|
|
|
import dev.kske.chess.game.ai.AIPlayer;
|
2019-07-09 09:20:30 +02:00
|
|
|
import dev.kske.chess.ui.BoardComponent;
|
2019-07-16 15:32:02 +02:00
|
|
|
import dev.kske.chess.ui.BoardPane;
|
2019-07-25 07:21:07 +02:00
|
|
|
import dev.kske.chess.ui.EngineUtil;
|
|
|
|
import dev.kske.chess.ui.EngineUtil.EngineInfo;
|
2019-07-16 15:32:02 +02:00
|
|
|
import dev.kske.chess.ui.OverlayComponent;
|
2019-07-07 13:53:57 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Project: <strong>Chess</strong><br>
|
|
|
|
* File: <strong>Game.java</strong><br>
|
|
|
|
* Created: <strong>06.07.2019</strong><br>
|
|
|
|
* Author: <strong>Kai S. K. Engelbart</strong>
|
|
|
|
*/
|
|
|
|
public class Game {
|
|
|
|
|
2019-07-25 07:21:07 +02:00
|
|
|
private Map<Color, Player> players;
|
|
|
|
private Board board;
|
|
|
|
private OverlayComponent overlayComponent;
|
|
|
|
private BoardComponent boardComponent;
|
2019-07-07 13:53:57 +02:00
|
|
|
|
2019-07-25 07:21:07 +02:00
|
|
|
public Game(BoardPane boardPane, String whiteName, String blackName) {
|
|
|
|
players = new HashMap<>();
|
|
|
|
board = new Board();
|
|
|
|
overlayComponent = boardPane.getOverlayComponent();
|
|
|
|
boardComponent = boardPane.getBoardComponent();
|
2019-07-17 08:26:51 +02:00
|
|
|
boardComponent.setBoard(board);
|
2019-07-07 13:53:57 +02:00
|
|
|
|
2019-07-25 07:21:07 +02:00
|
|
|
players.put(Color.WHITE, getPlayer(whiteName, Color.WHITE));
|
|
|
|
players.put(Color.BLACK, getPlayer(blackName, Color.BLACK));
|
|
|
|
|
2019-07-07 13:53:57 +02:00
|
|
|
// Initialize the game variable in each player
|
|
|
|
players.values().forEach(player -> player.setGame(this));
|
|
|
|
}
|
|
|
|
|
2019-07-25 07:21:07 +02:00
|
|
|
private Player getPlayer(String name, Color color) {
|
|
|
|
switch (name) {
|
|
|
|
case "Natural Player":
|
|
|
|
return new NaturalPlayer(color, overlayComponent);
|
|
|
|
case "AI Player":
|
|
|
|
return new AIPlayer(color, 4, -10);
|
|
|
|
default:
|
|
|
|
for (EngineInfo info : EngineUtil.getEngineInfos())
|
|
|
|
if (info.name.equals(name)) return new UCIPlayer(color, info.path);
|
|
|
|
System.err.println("Invalid player name: " + name);
|
|
|
|
return null;
|
|
|
|
}
|
2019-07-21 14:35:14 +02:00
|
|
|
}
|
|
|
|
|
2019-07-07 13:53:57 +02:00
|
|
|
public void onMove(Player player, Move move) {
|
|
|
|
if (board.getPos(move).getColor() == player.color && board.attemptMove(move)) {
|
2019-07-25 07:21:07 +02:00
|
|
|
// Redraw
|
|
|
|
boardComponent.repaint();
|
|
|
|
overlayComponent.displayArrow(move);
|
|
|
|
|
2019-07-07 13:53:57 +02:00
|
|
|
System.out.printf("%s: %s%n", player.color, move);
|
2019-07-22 14:51:24 +02:00
|
|
|
System.out.println("FEN: " + board.toFEN());
|
2019-08-07 18:54:00 +02:00
|
|
|
EventBus.getInstance().dispatch(new MoveEvent(move));
|
2019-07-07 21:07:58 +02:00
|
|
|
GameState eventType = board.getGameEventType(board.getDest(move).getColor().opposite());
|
|
|
|
switch (eventType) {
|
2019-07-25 07:21:07 +02:00
|
|
|
case CHECKMATE:
|
|
|
|
case STALEMATE:
|
|
|
|
String result = String.format("%s in %s!%n", player.color.opposite(), eventType);
|
|
|
|
System.out.print(result);
|
|
|
|
JOptionPane.showMessageDialog(boardComponent, result);
|
|
|
|
break;
|
|
|
|
case CHECK:
|
|
|
|
System.out.printf("%s in check!%n", player.color.opposite());
|
|
|
|
default:
|
|
|
|
players.get(board.getActiveColor()).requestMove();
|
2019-07-07 21:07:58 +02:00
|
|
|
}
|
2019-07-25 07:21:07 +02:00
|
|
|
} else player.requestMove();
|
2019-07-07 13:53:57 +02:00
|
|
|
}
|
2019-07-14 12:03:45 +02:00
|
|
|
|
|
|
|
public void start() {
|
|
|
|
players.get(Color.WHITE).requestMove();
|
|
|
|
}
|
|
|
|
|
2019-07-16 18:24:48 +02:00
|
|
|
public void reset() {
|
2019-07-28 13:51:10 +02:00
|
|
|
players.values().forEach(Player::cancelMove);
|
2019-08-05 21:02:54 +02:00
|
|
|
board.initDefaultPositions();
|
2019-07-14 12:03:45 +02:00
|
|
|
boardComponent.repaint();
|
2019-07-16 15:32:02 +02:00
|
|
|
overlayComponent.clearDots();
|
|
|
|
overlayComponent.clearArrow();
|
2019-07-14 12:03:45 +02:00
|
|
|
}
|
2019-07-17 08:26:51 +02:00
|
|
|
|
2019-07-18 15:01:15 +02:00
|
|
|
/**
|
2019-07-28 13:51:10 +02:00
|
|
|
* Removed all connections between the game and the UI.
|
2019-07-18 15:01:15 +02:00
|
|
|
*/
|
|
|
|
public void disconnect() {
|
|
|
|
players.values().forEach(Player::disconnect);
|
|
|
|
}
|
2019-07-23 10:38:19 +02:00
|
|
|
|
2019-07-23 09:31:20 +02:00
|
|
|
public void swapColors() {
|
|
|
|
players.values().forEach(Player::cancelMove);
|
2019-07-25 07:21:07 +02:00
|
|
|
Player white = players.get(Color.WHITE);
|
|
|
|
Player black = players.get(Color.BLACK);
|
2019-07-23 09:31:20 +02:00
|
|
|
white.setColor(Color.BLACK);
|
|
|
|
black.setColor(Color.WHITE);
|
|
|
|
players.put(Color.WHITE, black);
|
|
|
|
players.put(Color.BLACK, white);
|
|
|
|
players.get(board.getActiveColor()).requestMove();
|
|
|
|
}
|
2019-07-18 15:01:15 +02:00
|
|
|
|
2019-07-17 08:26:51 +02:00
|
|
|
public Board getBoard() { return board; }
|
2019-07-23 10:38:19 +02:00
|
|
|
|
|
|
|
public Map<Color, Player> getPlayers() { return players; }
|
2019-07-07 13:53:57 +02:00
|
|
|
}
|