package org.squirrelframework.foundation.fsm.snake; import org.squirrelframework.foundation.fsm.snake.SnakeController.SnakeState; import javax.swing.*; import java.awt.*; public class SnakePanel extends JPanel { private static final long serialVersionUID = 1197860599866744836L; private static final Font FONT = new Font("Tahoma", Font.BOLD, 25); private SnakeController controller; private SnakeModel model; public SnakePanel(SnakeController controller, SnakeModel model) { this.controller = controller; this.model = model; setPreferredSize(new Dimension(GameConfigure.COL_COUNT * GameConfigure.CELL_SIZE, GameConfigure.ROW_COUNT * GameConfigure.CELL_SIZE)); setBackground(Color.BLACK); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); // draw snake body g.setColor(Color.GREEN); for(Point snakePoint : model.getSnakePoints()) { g.fillRect(snakePoint.x * GameConfigure.CELL_SIZE, snakePoint.y * GameConfigure.CELL_SIZE, GameConfigure.CELL_SIZE, GameConfigure.CELL_SIZE); } // draw fruit if(model.getFruitPos()!=null) { g.setColor(Color.RED); g.fillOval(model.getFruitPos().x*GameConfigure.CELL_SIZE + 2, model.getFruitPos().y*GameConfigure.CELL_SIZE + 2, GameConfigure.CELL_SIZE - 4, GameConfigure.CELL_SIZE - 4); } /* * Draw the grid on the board. This makes it easier to see exactly * where we in relation to the fruit. */ g.setColor(Color.DARK_GRAY); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); for(int x = 0; x < GameConfigure.COL_COUNT; x++) { for(int y = 0; y < GameConfigure.ROW_COUNT; y++) { g.drawLine(x * GameConfigure.CELL_SIZE, 0, x * GameConfigure.CELL_SIZE, getHeight()); g.drawLine(0, y * GameConfigure.CELL_SIZE, getWidth(), y * GameConfigure.CELL_SIZE); } } /* * Show a message on the screen based on the current game state. */ if(controller.getCurrentState()==SnakeState.GAMEOVER || controller.getCurrentState()==SnakeState.NEW || controller.getCurrentState()==SnakeState.PAUSE) { g.setColor(Color.WHITE); int centerX = getWidth() / 2; int centerY = getHeight() / 2; String largeMessage = null; String smallMessage = null; if(controller.getCurrentState()==SnakeState.NEW) { largeMessage = "Snake Game!"; smallMessage = "Press Enter to Start"; } else if(controller.getCurrentState()==SnakeState.GAMEOVER) { largeMessage = "Game Over!"; smallMessage = "Press Enter to Restart"; } else if(controller.getCurrentState()==SnakeState.PAUSE) { largeMessage = "Paused"; smallMessage = "Press P to Resume"; } g.setFont(FONT); g.drawString(largeMessage, centerX - g.getFontMetrics().stringWidth(largeMessage) / 2, centerY - 50); g.drawString(smallMessage, centerX - g.getFontMetrics().stringWidth(smallMessage) / 2, centerY + 50); } } }