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

Foxes and Rabbit

Dalam program ini terdapat 9 Class, yaitu: 1. Simulator 2. Field 3. Randomizer 4. SimulatorView 5. Counter 6. FieldStats 7. Location 8. Rabbit 9. Fox Berikut adalah tampilan hubungan tiap class di BlueJ. Berikut adalah source code tiap classnya. 1. Simulator import java.util.Random; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import java.awt.Color; /** * A simple predator-prey simulator, based on a rectangular field * containing rabbits and foxes. * * @author David J. Barnes and Michael Kolling * @version 2008.03.30 */ public class Simulator { // Constants representing configuration information for the simulation. // The default width for the grid. private static final int DEFAULT_WIDTH = 50; // The default depth of the grid. private static final int DEFAULT_DEPTH = 50; // The probability that a fox will be created in an...

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