package checkers; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Arrays; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; /** * main game component */ public class GamePanel extends JPanel { private static final long serialVersionUID = 5209868672877405279L; /** * board border with letters and numbers */ private static class BorderPanel extends JPanel { private static final long serialVersionUID = 4355351078893761543L; JPanel board; public BorderPanel(JPanel board) { this.board = board; add(board); setLayout(null); board.setLocation(20, 20); setBackground(Color.WHITE); setPreferredSize(new Dimension(board.getWidth() + 40, board.getHeight() + 40)); } public void paint(Graphics g) { super.paint(g); if(g instanceof Graphics2D) ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for(int x = 0; x < Board.width; x++) { g.drawString(Integer.toString(x + 1), x * 32 + 32, 16); g.drawString(Integer.toString(x + 1), x * 32 + 32, board.getHeight() + 32); } for(int y = 0; y < Board.height; y++) { g.drawString(Character.toString((char)(y + 'A')), 8, y * 32 + 32 + 8); g.drawString(Character.toString((char)(y + 'A')), board.getWidth() + 24, y * 32 + 32 + 8); } g.setColor(Color.BLACK); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); } } /** * Component displaying player controller and clock */ private class PlayerInfoPanel extends JPanel implements BoardListener { private static final long serialVersionUID = -2691532936608582978L; final String playerName; final Clock clock; final int player; public PlayerInfoPanel(final int player) { this.player = player; setLayout(new GridBagLayout()); if(player == 1) playerName = "White"; else if(player == -1) playerName = "Black"; else throw new IllegalArgumentException(); setBorder(BorderFactory.createTitledBorder(playerName + ":")); JComboBox playerController = new JComboBox(); for(Player p : avaliablePlayers) { playerController.addItem(p); } playerController.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) controller.setPlayer(player, (Player)e.getItem()); } }); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.VERTICAL; constraints.anchor = GridBagConstraints.NORTH; constraints.insets = new Insets(4, 4, 4, 4); add(playerController,constraints); clock = new Clock(); constraints.gridy=1; constraints.weighty =1.0; add(clock,constraints); controller.addBoardListener(this); if(controller.getBoard().turnHolder == player) clock.start(); } @Override public void onMove(Board board, Move move) { if(board.turnHolder != player) clock.start(); else clock.stop(); } @Override public void onNewGame(Board board) { clock.reset(); if(board.turnHolder == player) clock.start(); } } private static final List<Player> avaliablePlayers = Arrays.asList(new Player[] { new HumanPlayer(), new RandomPlayer(), new MinMaxPlayer(1), new MinMaxPlayer(3), new MinMaxPlayer(5) }); private final BoardView view; private final BoardController controller; public GamePanel(Board board) { view = new BoardView(board); controller = new BoardController(view); BorderLayout borderLayout = new BorderLayout(8,8); setLayout(borderLayout); JPanel filler = new JPanel(); filler.setLayout(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.CENTER; filler.add(new BorderPanel(view),constraints); add(filler, BorderLayout.CENTER); JComponent buttonPanel = new JPanel(); JButton newGame = new JButton("New Game"); newGame.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { controller.newGame(); } }); buttonPanel.add(newGame); JButton quit = new JButton("Quit"); quit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); buttonPanel.add(quit); add(buttonPanel, BorderLayout.NORTH); JPanel rightPanel = new JPanel(); rightPanel.setLayout(new GridLayout(0, 1)); rightPanel.add(new PlayerInfoPanel(-1)); rightPanel.add(new PlayerInfoPanel(1)); add(rightPanel, BorderLayout.EAST); Log log = new Log(); JScrollPane logScroll=new JScrollPane(log); logScroll.setBorder(BorderFactory.createTitledBorder("Log:")); add(logScroll, BorderLayout.SOUTH); controller.addBoardListener(log); setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); } }