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 {   ...

Ticketing Machine

Pembuatan simulasi Ticketing Machine menggunakan OOP Class yang digunakan di dalam Project terdiri atas : Main class TicketMachine class Destination class Library yang digunakan di dalam Project adalah java.util.Scanner Source code Destination class /**  * A class which describes Destination  *  * @author Satria Ade Veda Karuniawan  * @version version 1.0  */ public class Destination {     private String Station;     private int PriceAdult;     private int PriceChild;     //Struct destination       public Destination(String name)     {         Station = name;         PriceAdult = 0;         PriceChild = 0;     }       public void SetInfo(int pa, int pc)     {         PriceAdult = pa;         PriceChild = pc;   ...

Image Viewer GUI

Implementasi Object-Oriented Programming dari Image Viewer yang berfungsi untuk melakukan load sebuah gambar dan memungkinkan dilakukannya manipulasi gambar. Library Java yang digunakan dalam project ini antara lain : Awt (Event, Image) 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) Source Code ImageViewer import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import java.io.File; /**  *  * @author Satria Ade Veda Karuniawan  * @version 1.0  */ public class ImageViewer {     // static fields:     private static final String VERSION = "Version 1.0";     private st...