Langsung ke konten utama

Game Pong

Dalam game ini terdapat 4 class, yaitu:
1. Class Pong
2. Class Ball
3. Class Paddle
4. Class Renderer

Map classnya akan terlihat seperti ini.


Berikut adalah source codenya.
1. Class 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;    
  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)    
   {    
   }    
  }    

2. Class Ball
  import java.awt.Color;    
  import java.awt.Graphics;    
  import java.util.Random;    
  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);    
   }    
  }    

3. Class Paddle
  import java.awt.Color;    
  import java.awt.Graphics;    
  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;    
      }    
     }    
   }    
  }    

4. Class Renderer
  import java.awt.Graphics;    
  import java.awt.Graphics2D;    
  import javax.swing.JPanel;    
  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);    
   }    
  }    

Berikut adalah hasilnya.

Sekian & Terima Kasih.

Komentar

Postingan populer dari blog ini

Analisa Sistem Informasi Traveloka

Tugas 1 Ahmad Syauqi 05111740000093 APSI - C Pada kesempatan kali ini saya akan membahas tentang bagaimana Sistem Informasi pada sebuah platform yang pastinya sudah tidak asing lagi di telinga kita semua, yaitu Traveloka. 1. Sejarah Singkat Traveloka Awalnya Traveloka  adalah perusahaan yang menyediakan layanan pemesanan  tiket pesawat  dan  hotel  secara daring dengan fokus perjalanan domestik di  Indonesia, namun seiring dengan berjalannya waktu, kini Traveloka juga menyediakan layanan pemesanan tiker kereta api, bus, rental mobil, rekreasi, dan masih banyak lainnya.  Traveloka memiliki basis operasional di  Jakarta . Traveloka didirikan pada tahun  2012   oleh   Ferry Unardi , Derianto Kusuma, dan Albert Zhang. Ide ini muncul disaat Ferry Unardi sering mengalami kesulitan dalam pemesanan pesawat, terutama disaat dia ingin pulang ke   Padang , Indonesia, dari Amerika Serikat. Pada awal konsepnya Traveloka berfungsi sebagai mesin pencari untuk membandingkan harg

Tugas APSI - Use Case Diagram

Nama : Ahmad Syauqi NRP : 05111740000093 Use Case Diagram adalah gambaran graphical dari beberapa atau semua actor, use case, dan interaksi diantaranya yang memperkenalkan suatu sistem. Use case diagram tidak menjelaskan secara detil tentang penggunaan use case, tetapi hanya memberi gambaran singkat hubungan antara usecase, aktor, dan sistem. Berikut adalah contoh use case diagram dari sistem penggajian di Kanisius

UTS-PBO-B-2018 Sistem Parkir Elektronik

Pada UTS PBO B pada tanggal 15 Oktober 2018, kami ditugaskan untuk membuat program Sistem Parkir Elektronik pada soal nomor 5. Berikut adalah hasil dan source code nya. 1. Class main /** * Write a description of class Main here. * * @author (your name) * @version (a version number or a date) */ import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner scan = new Scanner(System.in); int menu=0; String nopol; int price; PrintMasuk masuk = new PrintMasuk(); System.out.println("Masukkan Nomor Polisi Kendaraan Anda"); nopol=masuk.getNopol(); price=masuk.getPrice(); while(menu!=2) { System.out.println("1. Cetak Bukti Masuk"); System.out.println("2. Cetak Resi Keluar"); menu=scan.nextInt(); switch(menu) { case 1: masuk.printMasuk(); break