Advertisement
Guest User

Table

a guest
Jun 24th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.77 KB | None | 0 0
  1. package pl.chessonline.gui;
  2.  
  3.  
  4. import com.google.common.collect.Lists;
  5. import pl.chessonline.client.model.*;
  6.  
  7. import javax.swing.*;
  8. import java.awt.*;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseListener;
  13. import java.util.ArrayList;
  14. import java.util.Collection;
  15. import java.util.Collections;
  16. import java.util.List;
  17. import javax.imageio.ImageIO;
  18. import java.awt.image.BufferedImage;
  19. import java.io.File;
  20. import java.io.IOException;
  21.  
  22. import static javax.swing.SwingUtilities.isLeftMouseButton;
  23. import static javax.swing.SwingUtilities.isRightMouseButton;
  24.  
  25. public class Table {
  26.  
  27. private final JFrame gameFrame;
  28. private final BoardPanel boardPanel;
  29. public Board chessBoard;
  30.  
  31. private Tile sourceTile;
  32. private Tile destinationTile;
  33. private Piece humanMovedPiece;
  34. private BoardDirection boardDirection;
  35.  
  36. private boolean highlightLegalMoves;
  37.  
  38. private final static Dimension OUTER_FRAME_DIMENSION = new Dimension(600, 600);
  39. private final static Dimension BOARD_PANEL_DIMENSION = new Dimension(400,350);
  40. private final static Dimension TILE_PANEL_DIMENSION = new Dimension(10, 10);
  41. private static String defaultPieceImagesPath = "art/";
  42.  
  43. private Color lightTileColor = Color.decode("#FFFFFF");
  44. private Color darkTileColor = Color.decode("#696969");
  45.  
  46. public Table() {
  47. this.gameFrame = new JFrame("Chess game");
  48. this.gameFrame.setLayout(new BorderLayout());
  49. final JMenuBar tableMenuBar = createTableMenuBar();
  50. this.gameFrame.setJMenuBar(tableMenuBar);
  51. this.gameFrame.setSize(OUTER_FRAME_DIMENSION);
  52. this.chessBoard = Board.createStandardBoard();
  53. this.boardPanel = new BoardPanel();
  54. this.boardDirection = BoardDirection.NORMAL;
  55. this.highlightLegalMoves = true;
  56. this.gameFrame.add(this.boardPanel, BorderLayout.CENTER);
  57. this.gameFrame.setVisible(true);
  58. }
  59.  
  60. private JMenuBar createTableMenuBar() {
  61. final JMenuBar tableMenuBar = new JMenuBar();
  62. tableMenuBar.add(createGameMenu());
  63. tableMenuBar.add(createPreferencesMenu());
  64.  
  65. return tableMenuBar;
  66. }
  67.  
  68. private JMenu createGameMenu() {
  69. final JMenu gameMenu = new JMenu("Game");
  70.  
  71. final JMenuItem openPGN = new JMenuItem("Load PGN file");
  72. openPGN.addActionListener(new ActionListener() {
  73. @Override
  74. public void actionPerformed(ActionEvent e) {
  75. System.out.println("Open up that pgn file!");
  76. }
  77. });
  78. gameMenu.add(openPGN);
  79.  
  80. final JMenuItem exitMenuItem = new JMenuItem("Exit");
  81. exitMenuItem.addActionListener(new ActionListener() {
  82. @Override
  83. public void actionPerformed(ActionEvent e) {
  84. System.exit(0);
  85. }
  86. });
  87. gameMenu.add(exitMenuItem);
  88.  
  89. return gameMenu;
  90. }
  91.  
  92. private JMenu createPreferencesMenu() {
  93.  
  94. final JMenu preferencesMenu = new JMenu("Preferences");
  95. final JMenuItem flipBoardMenuItem = new JMenuItem("Flip Board");
  96. flipBoardMenuItem.addActionListener(new ActionListener() {
  97. @Override
  98. public void actionPerformed(ActionEvent e) {
  99. boardDirection = boardDirection.opposite();
  100. boardPanel.drawBoard(chessBoard);
  101. }
  102. });
  103. preferencesMenu.add(flipBoardMenuItem);
  104.  
  105. preferencesMenu.addSeparator();
  106.  
  107. final JCheckBoxMenuItem legalMoveHighlighterCheckbox = new JCheckBoxMenuItem("Highlight Legal Moves", true);
  108.  
  109. legalMoveHighlighterCheckbox.addActionListener(new ActionListener() {
  110. @Override
  111. public void actionPerformed(ActionEvent e) {
  112. highlightLegalMoves = legalMoveHighlighterCheckbox.isSelected();
  113. }
  114. });
  115.  
  116. preferencesMenu.add(legalMoveHighlighterCheckbox);
  117. return preferencesMenu;
  118. }
  119.  
  120. public enum BoardDirection {
  121.  
  122. NORMAL {
  123. @Override
  124. List<TilePanel> traverse(final List<TilePanel> boardTiles) {
  125. System.out.println("Tutaj");
  126. return boardTiles;
  127. }
  128.  
  129. @Override
  130. BoardDirection opposite() {
  131. return FLIPPED;
  132. }
  133. },
  134.  
  135. FLIPPED {
  136. @Override
  137. List<TilePanel> traverse(final List<TilePanel> boardTiles) {
  138. return Lists.reverse(boardTiles);
  139. }
  140.  
  141. @Override
  142. BoardDirection opposite() {
  143. return NORMAL;
  144. }
  145. };
  146.  
  147. abstract List<TilePanel> traverse(final List<TilePanel> boardTiles);
  148. abstract BoardDirection opposite();
  149. }
  150.  
  151. private class BoardPanel extends JPanel{
  152. final List<TilePanel> boardTiles;
  153.  
  154. BoardPanel() {
  155. super(new GridLayout(8,8));
  156. this.boardTiles = new ArrayList<>();
  157.  
  158. for(int i = 0; i < BoardUtils.NUM_TILES; i++) {
  159. final TilePanel tilePanel = new TilePanel(this, i);
  160. this.boardTiles.add(tilePanel);
  161. add(tilePanel);
  162. }
  163. setPreferredSize(BOARD_PANEL_DIMENSION);
  164. validate();
  165. }
  166.  
  167. public void drawBoard(final Board board) {
  168. removeAll();
  169. for(final TilePanel tilePanel : boardDirection.traverse(boardTiles)) {
  170. tilePanel.drawTile(board);
  171. add(tilePanel);
  172. }
  173. validate();
  174. repaint();
  175. }
  176. }
  177.  
  178. public class TilePanel extends JPanel {
  179.  
  180. private final int tileId;
  181.  
  182. TilePanel(final BoardPanel boardPanel, final int tileId) {
  183. super(new GridBagLayout());
  184. this.tileId = tileId;
  185. setPreferredSize(TILE_PANEL_DIMENSION);
  186. assignTileColor();
  187. assignTilePieceIcon(chessBoard);
  188.  
  189. addMouseListener(new MouseListener() {
  190. @Override
  191. public void mouseClicked(final MouseEvent e) {
  192.  
  193.  
  194.  
  195. if(isRightMouseButton(e)) {
  196. sourceTile = null;
  197. destinationTile = null;
  198. humanMovedPiece = null;
  199. } else if (isLeftMouseButton(e)) {
  200. if(sourceTile == null) {
  201. sourceTile = chessBoard.getTile((tileId));
  202. humanMovedPiece = sourceTile.getPiece();
  203. if(humanMovedPiece == null) {
  204. sourceTile = null;
  205. }
  206. } else {
  207. destinationTile = chessBoard.getTile(tileId);
  208. final Move move = Move.MoveFactory.createMove(chessBoard, sourceTile.getTileCoordinate(), destinationTile.getTileCoordinate());
  209. final MoveTransition transition = chessBoard.currentPlayer().makeMove(move);
  210. if(transition.getMoveStatus().isDone()) {
  211. chessBoard = transition.getTransitionBoard();
  212. //TODO add the move that was made to the move log
  213. }
  214. sourceTile = null;
  215. destinationTile = null;
  216. humanMovedPiece = null;
  217. }
  218. SwingUtilities.invokeLater(new Runnable() {
  219. @Override
  220. public void run() {
  221. boardPanel.drawBoard(chessBoard);
  222. }
  223. });
  224. }
  225. }
  226.  
  227. @Override
  228. public void mousePressed(final MouseEvent e) {
  229.  
  230. }
  231.  
  232. @Override
  233. public void mouseReleased(final MouseEvent e) {
  234.  
  235. }
  236.  
  237. @Override
  238. public void mouseEntered(final MouseEvent e) {
  239.  
  240. }
  241.  
  242. @Override
  243. public void mouseExited(final MouseEvent e) {
  244.  
  245. }
  246. });
  247.  
  248. validate();
  249. }
  250.  
  251. public void drawTile(final Board board) {
  252. assignTileColor();
  253. assignTilePieceIcon(board);
  254. highlightLegals(chessBoard);
  255. validate();
  256. repaint();
  257. }
  258.  
  259. public void assignTilePieceIcon(final Board board) {
  260. this.removeAll();
  261. if(board.getTile(this.tileId).isTileOccupied()) {
  262. try {
  263. final BufferedImage image =
  264. ImageIO.read(new File(defaultPieceImagesPath + board.getTile(this.tileId).getPiece().getPieceAlliance().toString().substring(0, 1) +
  265. board.getTile(this.tileId).getPiece().toString() + ".gif"));
  266. add(new JLabel(new ImageIcon(image)));
  267. } catch (IOException e) {
  268. e.printStackTrace();
  269. }
  270. }
  271. }
  272.  
  273. public void highlightLegals(final Board board) {
  274. if(highlightLegalMoves) {
  275. for(final Move move : pieceLegalMoves(board)) {
  276. if(move.getDestinationCoordinate() == this.tileId) {
  277. try {
  278. add(new JLabel(new ImageIcon(ImageIO.read(new File("art/green_dot.png")))));
  279. } catch(Exception e) {
  280. e.printStackTrace();
  281. }
  282. }
  283. }
  284. }
  285. }
  286.  
  287. private Collection<Move> pieceLegalMoves(final Board board) {
  288. if(humanMovedPiece != null && humanMovedPiece.getPieceAlliance() == board.currentPlayer().getAlliance()) {
  289. return humanMovedPiece.calculateLegalMoves(board);
  290. }
  291. return Collections.emptyList();
  292. }
  293.  
  294. public void assignTileColor() {
  295. if(BoardUtils.FIRST_ROW[this.tileId] || BoardUtils.THIRD_ROW[this.tileId] ||
  296. BoardUtils.FIFTH_ROW[this.tileId] || BoardUtils.SEVENTH_ROW[this.tileId]) {
  297. setBackground(this.tileId % 2 == 0 ? lightTileColor : darkTileColor);
  298. } else if(BoardUtils.SECOND_ROW[this.tileId] || BoardUtils.FOURTH_ROW[this.tileId] ||
  299. BoardUtils.SIXTH_ROW[this.tileId] || BoardUtils.EIGHTH_ROW[this.tileId]) {
  300. setBackground(this.tileId % 2 != 0 ? lightTileColor : darkTileColor);
  301. }
  302. }
  303. }
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement