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

Tugas Integra PBO-B

Pada kesempatan kali ini saya akan mencoba membuat sistem integra. Disini saya nantinya akan membuat 8 class dengan menggunakan metode inheritance. Berikut adalah penggambaran classnya dengan menggunakan Blue J. Berikut adalah source code tiap classnya. Database /** * Write a description of class Database here. * * @author (your name) * @version (a version number or a date) */ import java.util.ArrayList; public class Database { private ArrayList<ID>id; public Database() { id=new ArrayList<ID>(); } public void addID(ID theID) { id.add(theID); } public void list() { for (ID id:id){ id.print(); System.out.println(); } } } ID /** * Write a description of class ID here. * * @author (your name) * @version (a version number or a date) */ public class ID { public String status; public String kode; p...

Membuat Jam Digital

Nama : Ahmad Syauqi NRP : 05111740000093 Kelas : PBO B Disini ada 2 class yang digunakan, yaitu class Executor untuk menjalankan programnya, dan class time untuk menampilkan waktunya. Berikut source codenya: Executor: /** * @author (Ahmad Syauqi) * @version (30/09/2018) */ public class Executor { public static void main(String[]args){ new Executor(); } public Executor(){ new time(); } } time: /** * @author (Ahmad Syauqi) * @version (30/09/2018) */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Calendar; import java.util.Date; import java.text.*; public class time extends JFrame { private static final long serialVersionUID = 1L; JTextField clockF; JTextField dateF; JPanel panel; public time(){ super("Java Clock by Ahmad Syauqi"); setSize(500,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLO...