From e01060bc11ed7390718a0c359696febc34cef4f9 Mon Sep 17 00:00:00 2001 From: Woody Folsom Date: Thu, 15 Nov 2012 04:02:05 -0500 Subject: [PATCH] GUI updates. Added sound effect for playing a stone. --- src/net/woodyfolsom/msproj/Referee.java | 8 +- src/net/woodyfolsom/msproj/gui/Goban.java | 20 ++- src/net/woodyfolsom/msproj/gui/GridPanel.java | 140 ++++++++++-------- .../sfx/Click-SoundBible.com-1387633738.wav | Bin 0 -> 79312 bytes src/net/woodyfolsom/msproj/sfx/SfxPlayer.java | 41 +++++ 5 files changed, 148 insertions(+), 61 deletions(-) create mode 100644 src/net/woodyfolsom/msproj/sfx/Click-SoundBible.com-1387633738.wav create mode 100644 src/net/woodyfolsom/msproj/sfx/SfxPlayer.java diff --git a/src/net/woodyfolsom/msproj/Referee.java b/src/net/woodyfolsom/msproj/Referee.java index cbece3a..c719f2a 100644 --- a/src/net/woodyfolsom/msproj/Referee.java +++ b/src/net/woodyfolsom/msproj/Referee.java @@ -39,7 +39,13 @@ public class Referee { GameRecord gameRecord = new GameRecord(gameConfig); System.out.println("Game started."); - + + GameState initialGameState = gameRecord.getGameState(gameRecord.getNumTurns()); + + //Allow policy / GUI to do setup. + blackPolicy.setState(initialGameState); + whitePolicy.setState(initialGameState); + try { while (!gameRecord.isFinished()) { GameState gameState = gameRecord.getGameState(gameRecord.getNumTurns()); diff --git a/src/net/woodyfolsom/msproj/gui/Goban.java b/src/net/woodyfolsom/msproj/gui/Goban.java index 05f7088..54041cb 100644 --- a/src/net/woodyfolsom/msproj/gui/Goban.java +++ b/src/net/woodyfolsom/msproj/gui/Goban.java @@ -3,6 +3,8 @@ package net.woodyfolsom.msproj.gui; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; @@ -12,16 +14,32 @@ import net.woodyfolsom.msproj.Action; import net.woodyfolsom.msproj.GameConfig; import net.woodyfolsom.msproj.GameState; import net.woodyfolsom.msproj.Player; +import net.woodyfolsom.msproj.sfx.SfxPlayer; public class Goban extends JFrame { private static final long serialVersionUID = 1L; private GridPanel gridPanel; + private SfxPlayer sfxPlayer; public Goban(GameConfig gameConfig, Player guiPlayer) { setLayout(new BorderLayout()); - this.gridPanel = new GridPanel(gameConfig, guiPlayer); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + sfxPlayer.cleanup(); + } + }); + + try { + sfxPlayer = new SfxPlayer(); + } catch (Exception ex) { + System.out.println("Unable to initialize click sound due to: " + ex.getMessage()); + } + + this.gridPanel = new GridPanel(gameConfig, guiPlayer, sfxPlayer); add(gridPanel,BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); diff --git a/src/net/woodyfolsom/msproj/gui/GridPanel.java b/src/net/woodyfolsom/msproj/gui/GridPanel.java index 60751f4..9ec3d82 100644 --- a/src/net/woodyfolsom/msproj/gui/GridPanel.java +++ b/src/net/woodyfolsom/msproj/gui/GridPanel.java @@ -1,6 +1,7 @@ package net.woodyfolsom.msproj.gui; import java.awt.Color; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; @@ -19,14 +20,15 @@ import net.woodyfolsom.msproj.GameBoard; import net.woodyfolsom.msproj.GameConfig; import net.woodyfolsom.msproj.GameState; import net.woodyfolsom.msproj.Player; +import net.woodyfolsom.msproj.sfx.SfxPlayer; public class GridPanel extends JPanel implements MouseListener, MouseMotionListener { private static final long serialVersionUID = 1L; - private static final int BOARD_HEIGHT = 300; - private static final int BOARD_WIDTH = 300; + private final int boardPixelWidth; + private static final int BORDER_WIDTH = 10; private static final int DOT_WIDTH = 5; @@ -37,43 +39,36 @@ public class GridPanel extends JPanel implements MouseListener, private int mouseX = 0; private int mouseY = 0; - - // - private char[][] board; - //private static final char WHITE = 'O'; - //private static final char BLACK = 'X'; - private static final char EMPTY = '.'; - // - + private GameState gameState; private LinkedBlockingQueue actionQueue = new LinkedBlockingQueue(); private Player guiPlayer; - private String[] COLS = { "A", "B", "C", "D", "E", "F", "G", "H", "J" }; + private SfxPlayer sfxPlayer; + private String[] COLS = { "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T" }; private String[] ROWS; - public GridPanel(GameConfig gameConfig, Player guiPlayer) { + public GridPanel(GameConfig gameConfig, Player guiPlayer, SfxPlayer sfxPlayer) { this.guiPlayer = guiPlayer; - + this.sfxPlayer = sfxPlayer; this.boardSize = gameConfig.getSize(); initRows(this.boardSize); - this.setPreferredSize(new Dimension(BOARD_WIDTH + BORDER_WIDTH * 2, - BOARD_HEIGHT + BORDER_WIDTH * 2)); + if (boardSize <= 9) { + boardPixelWidth = 300; + } else if (boardSize <= 13) { + boardPixelWidth = 434; + } else { + boardPixelWidth = 634; + } + this.setPreferredSize(new Dimension(boardPixelWidth + BORDER_WIDTH * 2, + boardPixelWidth + BORDER_WIDTH * 2)); URL urlBackgroundImg = getClass().getResource("wood3.jpg"); this.backgroundImg = new ImageIcon(urlBackgroundImg).getImage(); this.addMouseListener(this); this.addMouseMotionListener(this); - - // - board = new char[boardSize][boardSize]; - for (int i = 0; i < boardSize; i++) { - for (int j = 0; j < boardSize; j++) { - board[i][j] = EMPTY; - } - } } public void addAction(Action action) { @@ -106,7 +101,7 @@ public class GridPanel extends JPanel implements MouseListener, // Given a pair of (x,y) coordinates (pixels), returns a row index in the // range [0..(boardSize-1)]. private int getColumn(int x, int y) { - int intersectionSize = BOARD_WIDTH / boardSize; + int intersectionSize = boardPixelWidth / boardSize; return (x - BORDER_WIDTH/*- centerOffset*/) / intersectionSize; } @@ -114,7 +109,7 @@ public class GridPanel extends JPanel implements MouseListener, // Given a pair of (x,y) coordinates (pixels), returns a row index in the // range [0..(boardSize-1)]. private int getRow(int x, int y) { - int intersectionSize = BOARD_WIDTH / boardSize; + int intersectionSize = boardPixelWidth / boardSize; return (y - BORDER_WIDTH/*- centerOffset*/) / intersectionSize; } @@ -134,19 +129,13 @@ public class GridPanel extends JPanel implements MouseListener, } } - int intersectionSize = BOARD_WIDTH / boardSize; + int intersectionSize = boardPixelWidth / boardSize; int centerOffset = intersectionSize / 2; g.translate(BORDER_WIDTH, BORDER_WIDTH); - for (int row = 0; row < boardSize; row++) { - for (int col = 0; col < boardSize; col++) { - g.fillOval(intersectionSize * col + centerOffset - DOT_WIDTH, - intersectionSize * row + centerOffset - DOT_WIDTH, - DOT_WIDTH * 2, DOT_WIDTH * 2); - } - } - + g.setColor(Color.BLACK); + for (int row = 0; row < boardSize; row++) { g.drawLine(centerOffset, centerOffset + row * intersectionSize, intersectionSize * boardSize - centerOffset, centerOffset @@ -159,31 +148,17 @@ public class GridPanel extends JPanel implements MouseListener, * boardSize - centerOffset); } - Color defaultColor = g.getColor(); - g.setColor(Color.YELLOW); - - int stoneX = getColumn(mouseX, mouseY) * intersectionSize - + centerOffset; - int stoneY = getRow(mouseX, mouseY) * intersectionSize + centerOffset; - - g.drawOval(stoneX - STONE_WIDTH, stoneY - STONE_WIDTH, STONE_WIDTH * 2, - STONE_WIDTH * 2); - - g.setColor(defaultColor); + int mouseCol = getColumn(mouseX, mouseY); + int mouseRow = getRow(mouseX, mouseY); for (int col = 0; col < boardSize; col++) { - // g.drawLine(centerOffset + col * intersectionSize, centerOffset, - // centerOffset + col * intersectionSize, intersectionSize * - // boardSize - centerOffset); g.drawBytes(COLS[col].getBytes(), 0, 1, centerOffset + col - * intersectionSize - 5, BOARD_WIDTH + 5); + * intersectionSize - 5, boardPixelWidth + 5); } for (int row = 0; row < boardSize; row++) { - // g.drawLine(centerOffset + col * intersectionSize, centerOffset, - // centerOffset + col * intersectionSize, intersectionSize * - // boardSize - centerOffset); - g.drawBytes(ROWS[row].getBytes(), 0, 1, BOARD_WIDTH - 5, + byte[] bytes = ROWS[row].getBytes(); + g.drawBytes(bytes, 0, bytes.length, boardPixelWidth - 5, centerOffset + row * intersectionSize + 5); } @@ -196,19 +171,44 @@ public class GridPanel extends JPanel implements MouseListener, char symbol = gameBoard.getSymbolAt(col,boardSize - row - 1); switch (symbol) { - case 'X' : + case GameBoard.BLACK_STONE : g.setColor(Color.BLACK); + g.fillOval(intersectionSize * col + centerOffset - STONE_WIDTH, + intersectionSize * row + centerOffset - STONE_WIDTH, + STONE_WIDTH * 2, STONE_WIDTH * 2); break; - case 'O' : + case GameBoard.WHITE_STONE : g.setColor(Color.WHITE); + g.fillOval(intersectionSize * col + centerOffset - STONE_WIDTH, + intersectionSize * row + centerOffset - STONE_WIDTH, + STONE_WIDTH * 2, STONE_WIDTH * 2); + break; + case GameBoard.EMPTY_INTERSECTION : + if (row == mouseRow && col == mouseCol && gameState.getPlayerToMove() == guiPlayer) { + if (guiPlayer == Player.BLACK) { + g.setColor(Color.BLACK); + } else if (guiPlayer == Player.WHITE) { + g.setColor(Color.WHITE); + } else { + throw new RuntimeException("Invalid guiPlayer: " + guiPlayer); + } + g.fillOval(intersectionSize * col + centerOffset - STONE_WIDTH, + intersectionSize * row + centerOffset - STONE_WIDTH, + STONE_WIDTH * 2, STONE_WIDTH * 2); + g.setColor(Color.RED); + g.drawOval(intersectionSize * col + centerOffset - STONE_WIDTH, + intersectionSize * row + centerOffset - STONE_WIDTH, + STONE_WIDTH * 2, STONE_WIDTH * 2); + } else { + g.setColor(Color.BLACK); + g.fillOval(intersectionSize * col + centerOffset - DOT_WIDTH, + intersectionSize * row + centerOffset - DOT_WIDTH, + DOT_WIDTH * 2, DOT_WIDTH * 2); + } break; default : continue; } - - g.fillOval(intersectionSize * col + centerOffset - STONE_WIDTH, - intersectionSize * row + centerOffset - STONE_WIDTH, - STONE_WIDTH * 2, STONE_WIDTH * 2); } } } @@ -216,7 +216,21 @@ public class GridPanel extends JPanel implements MouseListener, public void setGameState(GameState gameState) { this.gameState = gameState; + + if (gameState.getPlayerToMove() == guiPlayer || gameState.isTerminal()) { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } else { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } + this.repaint(); + + new Thread(new Runnable() { + + @Override + public void run() { + sfxPlayer.play(); + }}).start(); } @Override @@ -248,6 +262,14 @@ public class GridPanel extends JPanel implements MouseListener, int row = getRow(mouseX, mouseY); int column = getColumn(mouseX, mouseY); + if (row < 0 || row >= boardSize) { + return; + } + + if (column < 0 || column >= boardSize) { + return; + } + Player currentPlayer = gameState.getPlayerToMove(); if (currentPlayer == guiPlayer) { // gameState.playStone(guiPlayer, Action.getInstance(COLS[row] + diff --git a/src/net/woodyfolsom/msproj/sfx/Click-SoundBible.com-1387633738.wav b/src/net/woodyfolsom/msproj/sfx/Click-SoundBible.com-1387633738.wav new file mode 100644 index 0000000000000000000000000000000000000000..1d3143b8078271b83cf94af3f681db239fe3a6f3 GIT binary patch literal 79312 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 literal 0 HcmV?d00001 diff --git a/src/net/woodyfolsom/msproj/sfx/SfxPlayer.java b/src/net/woodyfolsom/msproj/sfx/SfxPlayer.java new file mode 100644 index 0000000..b23c5a9 --- /dev/null +++ b/src/net/woodyfolsom/msproj/sfx/SfxPlayer.java @@ -0,0 +1,41 @@ +package net.woodyfolsom.msproj.sfx; + +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; + +public class SfxPlayer { + private static final String clickFilename = "Click-SoundBible.com-1387633738.wav"; + private Clip clip; + + public SfxPlayer() throws LineUnavailableException, IOException, UnsupportedAudioFileException { + init(); + } + + public void cleanup() { + if (clip != null) { + clip.close(); + } + } + + public void init() throws LineUnavailableException, IOException, UnsupportedAudioFileException { + if (clip != null) { + clip.close(); + } + + InputStream inputStream = SfxPlayer.class.getResourceAsStream(clickFilename); + clip = AudioSystem.getClip(); + clip.open(AudioSystem.getAudioInputStream(inputStream)); + } + + public void play() { + if (clip!= null && !clip.isActive()) { + clip.setFramePosition(0); + clip.start(); + } + } +}