diff --git a/RenderPanel.java b/RenderPanel.java new file mode 100644 index 0000000..a43697f --- /dev/null +++ b/RenderPanel.java @@ -0,0 +1,62 @@ +package snake; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Point; + +import javax.swing.JPanel; + +@SuppressWarnings("serial") +/** + * @author Stephen Smith + */ +public class RenderPanel extends JPanel +{ + + public static final Color GREEN = new Color(1666073); + + @Override + protected void paintComponent(Graphics g) + { + super.paintComponent(g); + + Snake snake = Snake.snake; + + g.setColor(GREEN); + + g.fillRect(0, 0, 800, 700); + + g.setColor(Color.BLUE); + + for (Point point : snake.snakeParts) + { + g.fillRect(point.x * Snake.SCALE, point.y * Snake.SCALE, Snake.SCALE, Snake.SCALE); + } + + g.fillRect(snake.head.x * Snake.SCALE, snake.head.y * Snake.SCALE, Snake.SCALE, Snake.SCALE); + + g.setColor(Color.RED); + + g.fillRect(snake.cherry.x * Snake.SCALE, snake.cherry.y * Snake.SCALE, Snake.SCALE, Snake.SCALE); + + String string = "Score: " + snake.score + ", Length: " + snake.tailLength + ", Time: " + snake.time / 20; + + g.setColor(Color.white); + + g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), 10); + + string = "Game Over!"; + + if (snake.over) + { + g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), (int) snake.dim.getHeight() / 4); + } + + string = "Paused!"; + + if (snake.paused && !snake.over) + { + g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), (int) snake.dim.getHeight() / 4); + } + } +} diff --git a/Snake.java b/Snake.java new file mode 100644 index 0000000..7f65a4f --- /dev/null +++ b/Snake.java @@ -0,0 +1,218 @@ +package snake; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.ArrayList; +import java.util.Random; + +import javax.swing.JFrame; +import javax.swing.Timer; + +/** + * @author Stephen Smith + */ +public class Snake implements ActionListener, KeyListener +{ + + public static Snake snake; + + public JFrame jframe; + + public RenderPanel renderPanel; + + public Timer timer = new Timer(20, this); + + public ArrayList snakeParts = new ArrayList(); + + public static final int UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3, SCALE = 10; + + public int ticks = 0, direction = DOWN, score, tailLength = 10, time; + + public Point head, cherry; + + public Random random; + + public boolean over = false, paused; + + public Dimension dim; + + public Snake() + { + dim = Toolkit.getDefaultToolkit().getScreenSize(); + jframe = new JFrame("Snake"); + jframe.setVisible(true); + jframe.setSize(805, 700); + jframe.setResizable(false); + jframe.setLocation(dim.width / 2 - jframe.getWidth() / 2, dim.height / 2 - jframe.getHeight() / 2); + jframe.add(renderPanel = new RenderPanel()); + jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + jframe.addKeyListener(this); + startGame(); + } + + public void startGame() + { + over = false; + paused = false; + time = 0; + score = 0; + tailLength = 14; + ticks = 0; + direction = DOWN; + head = new Point(0, -1); + random = new Random(); + snakeParts.clear(); + cherry = new Point(random.nextInt(79), random.nextInt(66)); + timer.start(); + } + + @Override + public void actionPerformed(ActionEvent arg0) + { + renderPanel.repaint(); + ticks++; + + if (ticks % 2 == 0 && head != null && !over && !paused) + { + time++; + + snakeParts.add(new Point(head.x, head.y)); + + if (direction == UP) + { + if (head.y - 1 >= 0 && noTailAt(head.x, head.y - 1)) + { + head = new Point(head.x, head.y - 1); + } + else + { + over = true; + + } + } + + if (direction == DOWN) + { + if (head.y + 1 < 67 && noTailAt(head.x, head.y + 1)) + { + head = new Point(head.x, head.y + 1); + } + else + { + over = true; + } + } + + if (direction == LEFT) + { + if (head.x - 1 >= 0 && noTailAt(head.x - 1, head.y)) + { + head = new Point(head.x - 1, head.y); + } + else + { + over = true; + } + } + + if (direction == RIGHT) + { + if (head.x + 1 < 80 && noTailAt(head.x + 1, head.y)) + { + head = new Point(head.x + 1, head.y); + } + else + { + over = true; + } + } + + if (snakeParts.size() > tailLength) + { + snakeParts.remove(0); + + } + + if (cherry != null) + { + if (head.equals(cherry)) + { + score += 10; + tailLength++; + cherry.setLocation(random.nextInt(79), random.nextInt(66)); + } + } + } + } + + public boolean noTailAt(int x, int y) + { + for (Point point : snakeParts) + { + if (point.equals(new Point(x, y))) + { + return false; + } + } + return true; + } + + public static void main(String[] args) + { + snake = new Snake(); + } + + @Override + public void keyPressed(KeyEvent e) + { + int i = e.getKeyCode(); + + if ((i == KeyEvent.VK_A || i == KeyEvent.VK_LEFT) && direction != RIGHT) + { + direction = LEFT; + } + + if ((i == KeyEvent.VK_D || i == KeyEvent.VK_RIGHT) && direction != LEFT) + { + direction = RIGHT; + } + + if ((i == KeyEvent.VK_W || i == KeyEvent.VK_UP) && direction != DOWN) + { + direction = UP; + } + + if ((i == KeyEvent.VK_S || i == KeyEvent.VK_DOWN) && direction != UP) + { + direction = DOWN; + } + + if (i == KeyEvent.VK_SPACE) + { + if (over) + { + startGame(); + } + else + { + paused = !paused; + } + } + } + + @Override + public void keyReleased(KeyEvent e) + { + } + + @Override + public void keyTyped(KeyEvent e) + { + } + +}