I’m a beginner so I used Bro Code’s (a YouTuber) version of snake game. It’s almost identical with minor adjustments, but I’ve been trying to figure out how to restart the game when I die. I’ve tried making a restart button and tried to make it restart with a keystroke but I’ve got no experience coding so I couldn’t figure it out. Here’s the source code:
import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import javax.swing.JPanel; import javax.swing.Timer; public class GamePanel<Restart> extends JPanel implements ActionListener { static final int SCREEN_WIDTH = 1300; static final int SCREEN_HEIGHT = 750; static final int UNIT_SIZE = 25; static final int GAME_UNITS = (SCREEN_WIDTH * SCREEN_HEIGHT) / (UNIT_SIZE * UNIT_SIZE); static final int DELAY = 85; final int x[] = new int[GAME_UNITS]; final int y[] = new int[GAME_UNITS]; int bodyParts = 5; int applesEaten; int appleX; int appleY; char direction = 'R'; boolean running = false; Timer timer; Random random; GamePanel() { random = new Random(); this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT)); this.setBackground(Color.black); this.setFocusable(true); this.addKeyListener(new MyKeyAdapter()); startGame(); } public void startGame() { newApple(); running = true; timer = new Timer(DELAY, this); timer.start(); } public void paintComponent(Graphics g) { super.paintComponent(g); draw(g); } public void draw(Graphics g) { if (running) { /* * for(int i=0;i<SCREEN_HEIGHT/UNIT_SIZE;i++) { g.drawLine(i*UNIT_SIZE, 0, * i*UNIT_SIZE, SCREEN_HEIGHT); g.drawLine(0, i*UNIT_SIZE, SCREEN_WIDTH, * i*UNIT_SIZE); } */ g.setColor(Color.red); g.fillOval(appleX, appleY, UNIT_SIZE, UNIT_SIZE); for (int i = 0; i < bodyParts; i++) { if (i == 0) { g.setColor(Color.green); g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE); } else { g.setColor(new Color(45, 180, 0)); // g.setColor(new // Color(random.nextInt(255),random.nextInt(255),random.nextInt(255))); g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE); } } g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 40)); FontMetrics metrics = getFontMetrics(g.getFont()); g.drawString("Score: " + applesEaten, (SCREEN_WIDTH - metrics.stringWidth("Score: " + applesEaten)) / 2, g.getFont().getSize()); } else { gameOver(g); } } public void newApple() { appleX = random.nextInt((int) (SCREEN_WIDTH / UNIT_SIZE)) * UNIT_SIZE; appleY = random.nextInt((int) (SCREEN_HEIGHT / UNIT_SIZE)) * UNIT_SIZE; } public void move() { for (int i = bodyParts; i > 0; i--) { x[i] = x[i - 1]; y[i] = y[i - 1]; } switch (direction) { case 'U': y[0] = y[0] - UNIT_SIZE; break; case 'D': y[0] = y[0] + UNIT_SIZE; break; case 'L': x[0] = x[0] - UNIT_SIZE; break; case 'R': x[0] = x[0] + UNIT_SIZE; break; } } public void checkApple() { if ((x[0] == appleX) && (y[0] == appleY)) { bodyParts++; applesEaten++; newApple(); } } public void checkCollisions() { // checks if head collides with body for (int i = bodyParts; i > 0; i--) { if ((x[0] == x[i]) && (y[0] == y[i])) { running = false; } } // check if head touches left border if (x[0] < 0) { running = false; } // check if head touches right border if (x[0] > SCREEN_WIDTH) { running = false; } // check if head touches top border if (y[0] < 0) { running = false; } // check if head touches bottom border if (y[0] > SCREEN_HEIGHT) { running = false; } if (!running) { timer.stop(); } } public void gameOver(Graphics g) { // Score g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 40)); FontMetrics metrics1 = getFontMetrics(g.getFont()); g.drawString("Score: " + applesEaten, (SCREEN_WIDTH - metrics1.stringWidth("Score: " + applesEaten)) / 2, g.getFont().getSize()); // Game Over text g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 75)); FontMetrics metrics2 = getFontMetrics(g.getFont()); g.drawString("Game Over", (SCREEN_WIDTH - metrics2.stringWidth("Game Over")) / 2, SCREEN_HEIGHT / 2); } @Override public void actionPerformed(ActionEvent e) { if (running) { move(); checkApple(); checkCollisions(); } repaint(); } public class MyKeyAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_A: if (direction != 'R') { direction = 'L'; } break; case KeyEvent.VK_D: if (direction != 'L') { direction = 'R'; } break; case KeyEvent.VK_W: if (direction != 'D') { direction = 'U'; } break; case KeyEvent.VK_S: if (direction != 'U') { direction = 'D'; } } } } }
Advertisement
Answer
This is the solution, Pressing Enter will close the previous window and open a new game window. Let me know if you don’t understand something so I can explain it to you!
import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public final class GamePanel<Restart> extends JPanel implements ActionListener { JFrame frame = new JFrame(); JPanel panel = new JPanel(); static final int SCREEN_WIDTH = 1300; static final int SCREEN_HEIGHT = 750; static final int UNIT_SIZE = 25; static final int GAME_UNITS = (SCREEN_WIDTH * SCREEN_HEIGHT) / (UNIT_SIZE * UNIT_SIZE); static final int DELAY = 85; final int x[] = new int[GAME_UNITS]; final int y[] = new int[GAME_UNITS]; int bodyParts = 5; int applesEaten; int appleX; int appleY; char direction = 'R'; boolean running = false; Timer timer; Random random; public void createGUI() { panel.add(new GamePanel()); frame.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } GamePanel() { random = new Random(); setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT)); setBackground(Color.black); setFocusable(true); addKeyListener(new MyKeyAdapter()); startGame(); } public void startGame() { newApple(); running = true; timer = new Timer(DELAY, this); timer.start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); draw(g); } public void draw(Graphics g) { if (running) { /* * for(int i=0;i<SCREEN_HEIGHT/UNIT_SIZE;i++) { g.drawLine(i*UNIT_SIZE, 0, * i*UNIT_SIZE, SCREEN_HEIGHT); g.drawLine(0, i*UNIT_SIZE, SCREEN_WIDTH, * i*UNIT_SIZE); } */ g.setColor(Color.red); g.fillOval(appleX, appleY, UNIT_SIZE, UNIT_SIZE); for (int i = 0; i < bodyParts; i++) { if (i == 0) { g.setColor(Color.green); g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE); } else { g.setColor(new Color(45, 180, 0)); // g.setColor(new // Color(random.nextInt(255),random.nextInt(255),random.nextInt(255))); g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE); } } g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 40)); FontMetrics metrics = getFontMetrics(g.getFont()); g.drawString("Score: " + applesEaten, (SCREEN_WIDTH - metrics.stringWidth("Score: " + applesEaten)) / 2, g.getFont().getSize()); } else { gameOver(g); } } public void newApple() { appleX = random.nextInt((int) (SCREEN_WIDTH / UNIT_SIZE)) * UNIT_SIZE; appleY = random.nextInt((int) (SCREEN_HEIGHT / UNIT_SIZE)) * UNIT_SIZE; } public void move() { for (int i = bodyParts; i > 0; i--) { x[i] = x[i - 1]; y[i] = y[i - 1]; } switch (direction) { case 'U': y[0] = y[0] - UNIT_SIZE; break; case 'D': y[0] = y[0] + UNIT_SIZE; break; case 'L': x[0] = x[0] - UNIT_SIZE; break; case 'R': x[0] = x[0] + UNIT_SIZE; break; } } public void checkApple() { if ((x[0] == appleX) && (y[0] == appleY)) { bodyParts++; applesEaten++; newApple(); } } public void checkCollisions() { // checks if head collides with body for (int i = bodyParts; i > 0; i--) { if ((x[0] == x[i]) && (y[0] == y[i])) { running = false; } } // check if head touches left border if (x[0] < 0) { running = false; } // check if head touches right border if (x[0] > SCREEN_WIDTH) { running = false; } // check if head touches top border if (y[0] < 0) { running = false; } // check if head touches bottom border if (y[0] > SCREEN_HEIGHT) { running = false; } if (!running) { timer.stop(); } } public void gameOver(Graphics g) { // Score g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 40)); FontMetrics metrics1 = getFontMetrics(g.getFont()); g.drawString("Score: " + applesEaten, (SCREEN_WIDTH - metrics1.stringWidth("Score: " + applesEaten)) / 2, g.getFont().getSize()); // Game Over text g.setColor(Color.red); g.setFont(new Font("Ink Free", Font.BOLD, 75)); FontMetrics metrics2 = getFontMetrics(g.getFont()); g.drawString("Game Over", (SCREEN_WIDTH - metrics2.stringWidth("Game Over")) / 2, SCREEN_HEIGHT / 2); } @Override public void actionPerformed(ActionEvent e) { if (running) { move(); checkApple(); checkCollisions(); } repaint(); } public void closeRunningWindow(KeyEvent e) { JComponent comp = (JComponent) e.getSource(); Window win = SwingUtilities.getWindowAncestor(comp); win.dispose(); } public void startAgain() { EventQueue.invokeLater(() -> { GamePanel game = new GamePanel(); game.createGUI(); }); } public class MyKeyAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_A: if (direction != 'R') { direction = 'L'; } break; case KeyEvent.VK_D: if (direction != 'L') { direction = 'R'; } break; case KeyEvent.VK_W: if (direction != 'D') { direction = 'U'; } break; case KeyEvent.VK_S: if (direction != 'U') { direction = 'D'; } break; case KeyEvent.VK_ENTER: closeRunningWindow(e); startAgain(); break; } } } public static void main(String[] args) { EventQueue.invokeLater(() -> { GamePanel game = new GamePanel(); game.createGUI(); }); } }