Kamis, 01 Juni 2017

EAS PBO Game Snake

Pada kesempatan EAS kali ini saya membuat Final Project tentang sebuah Snake Game, pastinya semua orang pasti mengenal game snake yaitu gameplaynya yang hanya menggunakan arrow atas,kanan,bawah,kiri untuk memakan makanan ular guna ular bertambah panjang dan menambah score. game ini membutuhkan dua kelas yaitu kelas render panel dan kelas snake.
dibawah ini adalah source code dari game snake :

Class RenderPanel : Digunakan untuk mengatur interface dari game snake ini.
  1. package snake;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Point;
  5. import javax.swing.JPanel;
  6. @SuppressWarnings("serial")
  7. public class RenderPanel extends JPanel
  8. {
  9.     public static final Color GREEN = new Color(1666073);
  10.     @Override
  11.     protected void paintComponent(Graphics g)
  12.     {
  13.         super.paintComponent(g);
  14.        
  15.         Snake snake = Snake.snake;
  16.         g.setColor(GREEN);
  17.        
  18.         g.fillRect(0, 0, 800, 700);
  19.         g.setColor(Color.BLUE);
  20.         for (Point point : snake.snakeParts)
  21.         {
  22.             g.fillRect(point.x * Snake.SCALE, point.y * Snake.SCALE, Snake.SCALE, Snake.SCALE);
  23.         }
  24.        
  25.         g.fillRect(snake.head.x * Snake.SCALE, snake.head.y * Snake.SCALE, Snake.SCALE, Snake.SCALE);
  26.        
  27.         g.setColor(Color.RED);
  28.        
  29.         g.fillRect(snake.cherry.x * Snake.SCALE, snake.cherry.y * Snake.SCALE, Snake.SCALE, Snake.SCALE);
  30.        
  31.         String string = "Score: " + snake.score + ", Length: " + snake.tailLength + ", Time: " + snake.time / 20;
  32.        
  33.         g.setColor(Color.white);
  34.        
  35.         g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), 10);
  36.         string = "Game Over!";
  37.         if (snake.over)
  38.         {
  39.             g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), (int) snake.dim.getHeight() / 4);
  40.         }
  41.         string = "Paused!";
  42.         if (snake.paused && !snake.over)
  43.         {
  44.             g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f), (int) snake.dim.getHeight() / 4);
  45.         }
  46.     }
  47. }

Class Snake : Digunakan untuk memberikan logika game snake
  1. package snake;
  2. import java.awt.Dimension;
  3. import java.awt.Point;
  4. import java.awt.Toolkit;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.KeyListener;
  9. import java.util.ArrayList;
  10. import java.util.Random;
  11. import javax.swing.JFrame;
  12. import javax.swing.Timer;
  13. public class Snake implements ActionListener, KeyListener
  14. {
  15.     public static Snake snake;
  16.     public JFrame jframe;
  17.     public RenderPanel renderPanel;
  18.     public Timer timer = new Timer(20, this);
  19.     public ArrayList<Point> snakeParts = new ArrayList<Point>();
  20.     public static final int UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3, SCALE = 10;
  21.     public int ticks = 0, direction = DOWN, score, tailLength = 10, time;
  22.     public Point head, cherry;
  23.     public Random random;
  24.     public boolean over = false, paused;
  25.     public Dimension dim;
  26.     public Snake()
  27.     {
  28.         dim = Toolkit.getDefaultToolkit().getScreenSize();
  29.         jframe = new JFrame("Snake");
  30.         jframe.setVisible(true);
  31.         jframe.setSize(805, 700);
  32.         jframe.setResizable(false);
  33.         jframe.setLocation(dim.width / 2 - jframe.getWidth() / 2, dim.height / 2 - jframe.getHeight() / 2);
  34.         jframe.add(renderPanel = new RenderPanel());
  35.         jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  36.         jframe.addKeyListener(this);
  37.         startGame();
  38.     }
  39.     public void startGame()
  40.     {
  41.         over = false;
  42.         paused = false;
  43.         time = 0;
  44.         score = 0;
  45.         tailLength = 14;
  46.         ticks = 0;
  47.         direction = DOWN;
  48.         head = new Point(0, -1);
  49.         random = new Random();
  50.         snakeParts.clear();
  51.         cherry = new Point(random.nextInt(79), random.nextInt(66));
  52.         timer.start();
  53.     }
  54.     @Override
  55.     public void actionPerformed(ActionEvent arg0)
  56.     {
  57.         renderPanel.repaint();
  58.         ticks++;
  59.         if (ticks % 2 == 0 && head != null && !over && !paused)
  60.         {
  61.             time++;
  62.             snakeParts.add(new Point(head.x, head.y));
  63.             if (direction == UP)
  64.             {
  65.                 if (head.y - 1 >= 0 && noTailAt(head.x, head.y - 1))
  66.                 {
  67.                     head = new Point(head.x, head.y - 1);
  68.                 }
  69.                 else
  70.                 {
  71.                     over = true;
  72.                 }
  73.             }
  74.             if (direction == DOWN)
  75.             {
  76.                 if (head.y + 1 < 67 && noTailAt(head.x, head.y + 1))
  77.                 {
  78.                     head = new Point(head.x, head.y + 1);
  79.                 }
  80.                 else
  81.                 {
  82.                     over = true;
  83.                 }
  84.             }
  85.             if (direction == LEFT)
  86.             {
  87.                 if (head.x - 1 >= 0 && noTailAt(head.x - 1, head.y))
  88.                 {
  89.                     head = new Point(head.x - 1, head.y);
  90.                 }
  91.                 else
  92.                 {
  93.                     over = true;
  94.                 }
  95.             }
  96.             if (direction == RIGHT)
  97.             {
  98.                 if (head.x + 1 < 80 && noTailAt(head.x + 1, head.y))
  99.                 {
  100.                     head = new Point(head.x + 1, head.y);
  101.                 }
  102.                 else
  103.                 {
  104.                     over = true;
  105.                 }
  106.             }
  107.             if (snakeParts.size() > tailLength)
  108.             {
  109.                 snakeParts.remove(0);
  110.             }
  111.             if (cherry != null)
  112.             {
  113.                 if (head.equals(cherry))
  114.                 {
  115.                     score += 10;
  116.                     tailLength++;
  117.                     cherry.setLocation(random.nextInt(79), random.nextInt(66));
  118.                 }
  119.             }
  120.         }
  121.     }
  122.     public boolean noTailAt(int x, int y)
  123.     {
  124.         for (Point point : snakeParts)
  125.         {
  126.             if (point.equals(new Point(x, y)))
  127.             {
  128.                 return false;
  129.             }
  130.         }
  131.         return true;
  132.     }
  133.     public static void main(String[] args)
  134.     {
  135.         snake = new Snake();
  136.     }
  137.     @Override
  138.     public void keyPressed(KeyEvent e)
  139.     {
  140.         int i = e.getKeyCode();
  141.         if ((i == KeyEvent.VK_A || i == KeyEvent.VK_LEFT) && direction != RIGHT)
  142.         {
  143.             direction = LEFT;
  144.         }
  145.         if ((i == KeyEvent.VK_D || i == KeyEvent.VK_RIGHT) && direction != LEFT)
  146.         {
  147.             direction = RIGHT;
  148.         }
  149.         if ((i == KeyEvent.VK_W || i == KeyEvent.VK_UP) && direction != DOWN)
  150.         {
  151.             direction = UP;
  152.         }
  153.         if ((i == KeyEvent.VK_S || i == KeyEvent.VK_DOWN) && direction != UP)
  154.         {
  155.             direction = DOWN;
  156.         }
  157.         if (i == KeyEvent.VK_SPACE)
  158.         {
  159.             if (over)
  160.             {
  161.                 startGame();
  162.             }
  163.             else
  164.             {
  165.                 paused = !paused;
  166.             }
  167.         }
  168.     }
  169.     @Override
  170.     public void keyReleased(KeyEvent e)
  171.     {
  172.     }
  173.     @Override
  174.     public void keyTyped(KeyEvent e)
  175.     {
  176.     }
  177. }

Dua kelas diatas sudah dipaparkan dan jika sudah tidak ada error maka sudah bisa dijalankan atau dieksekusi, maka ini dia hasil game snake yang sudah dijalankan


Dibagian atas terdapat fitur untuk menampilkan score, panjang ular, dan durasi mainnya

Sekian dari final project game snake
Terima Kasih!