Skip to main content

Pong

Implementasi Pong Game metode Pemrograman Berbasis Objek dengan menggunakan BlueJ
Image result for pong


  • Class yang akan diimplementasi pada BlueJ :


  1. Pong (Class yang berfungsi sebagai main agar Game dapat dijalankan)
  2. Ball (Class yang berfungsi untuk mengatur pergerakan, tabrakan, dan perubahan arah bola)
  3. Paddle (Class yang berfungsi untuk mengatur pergerakan, kecepatan, dan input paddle dari tiap pemain)
  4. Renderer (Class yang berfungsi untuk mengatur hal yang berkaitan dengan fungsi grafis dari Game yang diimplementasi)

  • Source Code

Pong
 package pong;  
 import java.awt.BasicStroke;  
 import java.awt.Color;  
 import java.awt.Font;  
 import java.awt.Graphics2D;  
 import java.awt.RenderingHints;  
 import java.awt.event.ActionEvent;  
 import java.awt.event.ActionListener;  
 import java.awt.event.KeyEvent;  
 import java.awt.event.KeyListener;  
 import java.util.Random;  
 import javax.swing.JFrame;  
 import javax.swing.Timer;  
 /**  
  * Main Class dari Game  
  *   
  * @author Satria Ade Veda Karuniawan  
  * @version 0.1  
  */  
 public class Pong implements ActionListener, KeyListener  
 {  
      public static Pong pong;  
      public int width = 700, height = 700;  
      public Renderer renderer;  
      public Paddle player1;  
      public Paddle player2;  
      public Ball ball;  
      public boolean bot = false, selectingDifficulty;  
      public boolean w, s, up, down;  
      public int gameStatus = 0, scoreLimit = 7, playerWon; //0 = Menu, 1 = Paused, 2 = Playing, 3 = Over  
      public int botDifficulty, botMoves, botCooldown = 0;  
      public Random random;  
      public JFrame jframe;  
      public Pong()  
      {  
           Timer timer = new Timer(20, this);  
           random = new Random();  
           jframe = new JFrame("Pong");  
           renderer = new Renderer();  
           jframe.setSize(width + 15, height + 35);  
           jframe.setVisible(true);  
           jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
           jframe.add(renderer);  
           jframe.addKeyListener(this);  
           timer.start();  
      }  
      public void start()  
      {  
           gameStatus = 2;  
           player1 = new Paddle(this, 1);  
           player2 = new Paddle(this, 2);  
           ball = new Ball(this);  
      }  
      public void update()  
      {  
           if (player1.score >= scoreLimit)  
           {  
                playerWon = 1;  
                gameStatus = 3;  
           }  
           if (player2.score >= scoreLimit)  
           {  
                gameStatus = 3;  
                playerWon = 2;  
           }  
           if (w)  
           {  
                player1.move(true);  
           }  
           if (s)  
           {  
                player1.move(false);  
           }  
           if (!bot)  
           {  
                if (up)  
                {  
                     player2.move(true);  
                }  
                if (down)  
                {  
                     player2.move(false);  
                }  
           }  
           else  
           {  
                if (botCooldown > 0)  
                {  
                     botCooldown--;  
                     if (botCooldown == 0)  
                     {  
                          botMoves = 0;  
                     }  
                }  
                if (botMoves < 10)  
                {  
                     if (player2.y + player2.height / 2 < ball.y)  
                     {  
                          player2.move(false);  
                          botMoves++;  
                     }  
                     if (player2.y + player2.height / 2 > ball.y)  
                     {  
                          player2.move(true);  
                          botMoves++;  
                     }  
                     if (botDifficulty == 0)  
                     {  
                          botCooldown = 20;  
                     }  
                     if (botDifficulty == 1)  
                     {  
                          botCooldown = 15;  
                     }  
                     if (botDifficulty == 2)  
                     {  
                          botCooldown = 10;  
                     }  
                }  
           }  
           ball.update(player1, player2);  
      }  
      public void render(Graphics2D g)  
      {  
           g.setColor(Color.BLACK);  
           g.fillRect(0, 0, width, height);  
           g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
           if (gameStatus == 0)  
           {  
                g.setColor(Color.WHITE);  
                g.setFont(new Font("Arial", 1, 50));  
                g.drawString("PONG", width / 2 - 75, 50);  
                if (!selectingDifficulty)  
                {  
                     g.setFont(new Font("Arial", 1, 30));  
                     g.drawString("Press Space to Play", width / 2 - 150, height / 2 - 25);  
                     g.drawString("Press Shift to Play with Bot", width / 2 - 200, height / 2 + 25);  
                     g.drawString("<< Score Limit: " + scoreLimit + " >>", width / 2 - 150, height / 2 + 75);  
                }  
           }  
           if (selectingDifficulty)  
           {  
                String string = botDifficulty == 0 ? "Easy" : (botDifficulty == 1 ? "Medium" : "Hard");  
                g.setFont(new Font("Arial", 1, 30));  
                g.drawString("<< Bot Difficulty: " + string + " >>", width / 2 - 180, height / 2 - 25);  
                g.drawString("Press Space to Play", width / 2 - 150, height / 2 + 25);  
           }  
           if (gameStatus == 1)  
           {  
                g.setColor(Color.WHITE);  
                g.setFont(new Font("Arial", 1, 50));  
                g.drawString("PAUSED", width / 2 - 103, height / 2 - 25);  
           }  
           if (gameStatus == 1 || gameStatus == 2)  
           {  
                g.setColor(Color.WHITE);  
                g.setStroke(new BasicStroke(5f));  
                g.drawLine(width / 2, 0, width / 2, height);  
                g.setStroke(new BasicStroke(2f));  
                g.drawOval(width / 2 - 150, height / 2 - 150, 300, 300);  
                g.setFont(new Font("Arial", 1, 50));  
                g.drawString(String.valueOf(player1.score), width / 2 - 90, 50);  
                g.drawString(String.valueOf(player2.score), width / 2 + 65, 50);  
                player1.render(g);  
                player2.render(g);  
                ball.render(g);  
           }  
           if (gameStatus == 3)  
           {  
                g.setColor(Color.WHITE);  
                g.setFont(new Font("Arial", 1, 50));  
                g.drawString("PONG", width / 2 - 75, 50);  
                if (bot && playerWon == 2)  
                {  
                     g.drawString("The Bot Wins!", width / 2 - 170, 200);  
                }  
                else  
                {  
                     g.drawString("Player " + playerWon + " Wins!", width / 2 - 165, 200);  
                }  
                g.setFont(new Font("Arial", 1, 30));  
                g.drawString("Press Space to Play Again", width / 2 - 185, height / 2 - 25);  
                g.drawString("Press ESC for Menu", width / 2 - 140, height / 2 + 25);  
           }  
      }  
      @Override  
      public void actionPerformed(ActionEvent e)  
      {  
           if (gameStatus == 2)  
           {  
                update();  
           }  
           renderer.repaint();  
      }  
      public static void main(String[] args)  
      {  
           pong = new Pong();  
      }  
      @Override  
      public void keyPressed(KeyEvent e)  
      {  
           int id = e.getKeyCode();  
           if (id == KeyEvent.VK_W)  
           {  
                w = true;  
           }  
           else if (id == KeyEvent.VK_S)  
           {  
                s = true;  
           }  
           else if (id == KeyEvent.VK_UP)  
           {  
                up = true;  
           }  
           else if (id == KeyEvent.VK_DOWN)  
           {  
                down = true;  
           }  
           else if (id == KeyEvent.VK_RIGHT)  
           {  
                if (selectingDifficulty)  
                {  
                     if (botDifficulty < 2)  
                     {  
                          botDifficulty++;  
                     }  
                     else  
                     {  
                          botDifficulty = 0;  
                     }  
                }  
                else if (gameStatus == 0)  
                {  
                     scoreLimit++;  
                }  
           }  
           else if (id == KeyEvent.VK_LEFT)  
           {  
                if (selectingDifficulty)  
                {  
                     if (botDifficulty > 0)  
                     {  
                          botDifficulty--;  
                     }  
                     else  
                     {  
                          botDifficulty = 2;  
                     }  
                }  
                else if (gameStatus == 0 && scoreLimit > 1)  
                {  
                     scoreLimit--;  
                }  
           }  
           else if (id == KeyEvent.VK_ESCAPE && (gameStatus == 2 || gameStatus == 3))  
           {  
                gameStatus = 0;  
           }  
           else if (id == KeyEvent.VK_SHIFT && gameStatus == 0)  
           {  
                bot = true;  
                selectingDifficulty = true;  
           }  
           else if (id == KeyEvent.VK_SPACE)  
           {  
                if (gameStatus == 0 || gameStatus == 3)  
                {  
                     if (!selectingDifficulty)  
                     {  
                          bot = false;  
                     }  
                     else  
                     {  
                          selectingDifficulty = false;  
                     }  
                     start();  
                }  
                else if (gameStatus == 1)  
                {  
                     gameStatus = 2;  
                }  
                else if (gameStatus == 2)  
                {  
                     gameStatus = 1;  
                }  
           }  
      }  
      @Override  
      public void keyReleased(KeyEvent e)  
      {  
           int id = e.getKeyCode();  
           if (id == KeyEvent.VK_W)  
           {  
                w = false;  
           }  
           else if (id == KeyEvent.VK_S)  
           {  
                s = false;  
           }  
           else if (id == KeyEvent.VK_UP)  
           {  
                up = false;  
           }  
           else if (id == KeyEvent.VK_DOWN)  
           {  
                down = false;  
           }  
      }  
      @Override  
      public void keyTyped(KeyEvent e)  
      {  
      }  
 }  

Ball
 package pong;  
 import java.awt.Color;  
 import java.awt.Graphics;  
 import java.util.Random;  
 /**  
  * Class yang mengatur pergerakan, tabrakan, dan kecepatan bola  
  *   
  * @author Satria Ade Veda Karuniawan  
  * @version 0.1  
  */  
 public class Ball  
 {  
      public int x, y, width = 25, height = 25;  
      public int motionX, motionY;  
      public Random random;  
      private Pong pong;  
      public int amountOfHits;  
      public Ball(Pong pong)  
      {  
           this.pong = pong;  
           this.random = new Random();  
           spawn();  
      }  
      public void update(Paddle paddle1, Paddle paddle2)  
      {  
           int speed = 5;  
           this.x += motionX * speed;  
           this.y += motionY * speed;  
           if (this.y + height - motionY > pong.height || this.y + motionY < 0)  
           {  
                if (this.motionY < 0)  
                {  
                     this.y = 0;  
                     this.motionY = random.nextInt(4);  
                     if (motionY == 0)  
                     {  
                          motionY = 1;  
                     }  
                }  
                else  
                {  
                     this.motionY = -random.nextInt(4);  
                     this.y = pong.height - height;  
                     if (motionY == 0)  
                     {  
                          motionY = -1;  
                     }  
                }  
           }  
           if (checkCollision(paddle1) == 1)  
           {  
                this.motionX = 1 + (amountOfHits / 5);  
                this.motionY = -2 + random.nextInt(4);  
                if (motionY == 0)  
                {  
                     motionY = 1;  
                }  
                amountOfHits++;  
           }  
           else if (checkCollision(paddle2) == 1)  
           {  
                this.motionX = -1 - (amountOfHits / 5);  
                this.motionY = -2 + random.nextInt(4);  
                if (motionY == 0)  
                {  
                     motionY = 1;  
                }  
                amountOfHits++;  
           }  
           if (checkCollision(paddle1) == 2)  
           {  
                paddle2.score++;  
                spawn();  
           }  
           else if (checkCollision(paddle2) == 2)  
           {  
                paddle1.score++;  
                spawn();  
           }  
      }  
      public void spawn()  
      {  
           this.amountOfHits = 0;  
           this.x = pong.width / 2 - this.width / 2;  
           this.y = pong.height / 2 - this.height / 2;  
           this.motionY = -2 + random.nextInt(4);  
           if (motionY == 0)  
           {  
                motionY = 1;  
           }  
           if (random.nextBoolean())  
           {  
                motionX = 1;  
           }  
           else  
           {  
                motionX = -1;  
           }  
      }  
      public int checkCollision(Paddle paddle)  
      {  
           if (this.x < paddle.x + paddle.width && this.x + width > paddle.x && this.y < paddle.y + paddle.height && this.y + height > paddle.y)  
           {  
                return 1; //bounce  
           }  
           else if ((paddle.x > x && paddle.paddleNumber == 1) || (paddle.x < x - width && paddle.paddleNumber == 2))  
           {  
                return 2; //score  
           }  
           return 0; //nothing  
      }  
      public void render(Graphics g)  
      {  
           g.setColor(Color.WHITE);  
           g.fillOval(x, y, width, height);  
      }  
 }  

Paddle
 package pong;  
 import java.awt.Color;  
 import java.awt.Graphics;  
 /**  
  * Class yang mengatur pergerakan, input paddle tiap player  
  *   
  * @author Satria Ade Veda Karuniawan  
  * @version 0.1  
  */  
 public class Paddle  
 {  
      public int paddleNumber;  
      public int x, y, width = 50, height = 250;  
      public int score;  
      public Paddle(Pong pong, int paddleNumber)  
      {  
           this.paddleNumber = paddleNumber;  
           if (paddleNumber == 1)  
           {  
                this.x = 0;  
           }  
           if (paddleNumber == 2)  
           {  
                this.x = pong.width - width;  
           }  
           this.y = pong.height / 2 - this.height / 2;  
      }  
      public void render(Graphics g)  
      {  
           g.setColor(Color.WHITE);  
           g.fillRect(x, y, width, height);  
      }  
      public void move(boolean up)  
      {  
           int speed = 15;  
           if (up)  
           {  
                if (y - speed > 0)  
                {  
                     y -= speed;  
                }  
                else  
                {  
                     y = 0;  
                }  
           }  
           else  
           {  
                if (y + height + speed < Pong.pong.height)  
                {  
                     y += speed;  
                }  
                else  
                {  
                     y = Pong.pong.height - height;  
                }  
           }  
      }  
 }  

Renderer
 package pong;  
 import java.awt.Graphics;  
 import java.awt.Graphics2D;  
 import javax.swing.JPanel;  
 /**  
  * Renderer yang berguna untuk memunculkan grafis pada window  
  *   
  * @author Satria Ade Veda Karuniawan  
  * @version 0.1  
  */  
 public class Renderer extends JPanel  
 {  
      private static final long serialVersionUID = 1L;  
      @Override  
      protected void paintComponent(Graphics g)  
      {  
           super.paintComponent(g);  
           Pong.pong.render((Graphics2D) g);  
      }  
 }  

  • Simulasi
Saat game dijalankan

Gameplay


Sekian implementasi dari Pong

Comments

Popular posts from this blog

House Drawing

Dalam pembuatan gambar Rumah digunakan beberapa library Java sebagai penunjang pemrograman grafis seperti : import javax.swing.* import java.awt.* import java.util.List import java.util.* Lalu class - class yang digunakan dalam pembuatan gambar Rumah ini terbagi menjadi : Shape class, digunakan untuk mengatur bentuk yang ingin ditampilkan. Terdiri atas: Circle Square Triangle Rectangles Library class, bernama Canvas, berfungsi sebagai utility yang memungkinkan untuk memunculkan gambar. Main class, bernama HousePicture, berfungsi untuk menyatukan class-class yang ada dan melakukan function serta variable control seperti ukuran, warna, dan posisi yang ingin dimunculkan pada Canvas. Tampilan workspace : Source code Class Circle import java.awt.*; import java.awt.geom.*; /**  * Write a description of class Circle here.  *  * @author Satria Ade Veda Karuniawan  * @version version 1.0  */ public class Circle {   ...

Image Viewer GUI 4.0 (Final Exam Project)

Rancangan Interface (Workspace) Project lanjutan dari Image Viewer GUI 3.0 dengan implementasi menggunakan BlueJ, hal yang telah selesai diimplementasikan adalah : Frame Panel Button Label dll Dengan daftar class utama sebagai berikut : ImageViewer : merupakan class utama yang berfungsi untuk menampilkan dan menginisialisasi GUI (main class) OFImage : merupakan class yang mendefinisikan objek dari gambar ImagePanel : merupakan class yang salah satunya bertindak sebagai canvas gambar (berbeda dengan ImageViewer, ImagePanel hanya mengatur bagian panel foto saja) ImageFileManager : merupakan class yang bertindak sebagai file handler Dengan daftar inherited class ( Filter ) sebagai berikut : DarkerFilter : class Filter yang berfungsi untuk menggelapkan foto LighterFilter : class Filter yang berfungsi untuk menerangkan foto ThresholdFilter : class Filter yang berfungsi untuk merubah warna foto menjadi 3 tingkatan warna dari grayscale InvertFilter : class Fil...

Image Viewer GUI 3.0

Implementasi Object-Oriented Programming dari Image Viewer, merupakan modifikasi dari postingan Image Viewer GUI yang sebelumnya, library yang dibutuhkan : Awt (Event, Image, Color, Event) Swing File IO Class yang diimplementasikan antara lain : ImageViewer (Sebagai main class yang melakukan display image pada aplikasi GUI) ImagePanel (Sebagai class yang menampilkan OFImage serta menambah functionality) ImageFileManager (Sebagai class utility untuk melakukan load image) OFImage (Sebagai class yang mendefinisikan image sebagai object) Abstract Class   Filter (Sebagai class yang mengatur fungsional filter yang berguna untuk memanipulasi gambar) dioverride oleh : DarkerFilter (Sebagai class yang berfungsi untuk mengubah gambar menjadi lebih gelap) LighterFilter (Sebagai class yang berfungsi untuk mengubah gambar menjadi lebih terang) ThresholdFilter (Sebagai class yang berfungsi untuk mengubah gambar dari warna menjadi gambar grayscale) FishEyeFilter (Sebagai class ...