Tugas 8 PBO C Pong

Tugas 8 PBO C Pong

Nama : Dewangga Dharmawan

NRP : 05111940000029

Dosen : Pak Fajar Baskoro

Diagram Class

Class Pong

 /**  
  * Main Class untuk permainan Pong, dan sekaligus display permainan  
  * selain paddle dan bolanya  
  *  
  * @author (Dewangga Dharmawan)  
  * @version (14/12/2020)  
  */  
 //Beberapa library java yang digunakan  
 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; //Variabel class Pong  
   public int width = 700, height = 700; //Luas layar  
   public Renderer renderer; //Variabel class Renderer  
   //Variabel Paddle yang digunakan  
   public Paddle player1;  
   public Paddle player2;  
   //Variabel bola  
   public Ball ball;  
   //Variabel ada atau tidaknya pemain robot  
   //Dan pemilihan kesulitan robotnya  
   public boolean bot = false, selectingDifficulty;  
   //Kendali paddle  
   public boolean w, s, up, down;  
   //Status permainan, batas nilai, dan menangnya pemain  
   public int gameStatus = 0, scoreLimit = 7, playerWon;  
   //Keahlian robotnya, serta gerak-geriknya  
   public int botDifficulty, botMoves, botCooldown = 0;  
   public Random random; //Keacakan bola  
   public JFrame jframe; //Layar yang digunakan  
   //Mendefinisikan beberapa display, sebelum start  
   public Pong()  
   {  
     Timer timer = new Timer(20, this);  
     random = new Random();  
     jframe = new JFrame("Pong Ping");  
     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();  
   }  
   //Memulai permainan  
   public void start()  
   {  
     gameStatus = 2;  
     player1 = new Paddle(this, 1);  
     player2 = new Paddle(this, 2);  
     ball = new Ball(this);  
   }  
   //Keadaan permainan, apakah dua orang, atau dengan robot  
   //Serta menang atau tidaknya pemain  
   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);  
   }  
   //Layar utama dari permainan Pong  
   public void render(Graphics2D g)  
   {  
     g.setColor(Color.BLUE);  
     g.fillRect(0,0,width, height);  
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
     //Layar utama  
     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("Tekan Space untuk Main", width / 2 - 150, height / 2 - 25);  
         g.drawString("Tekan Shift untuk Main dengan Robot", width / 2 - 200, height / 2 + 25);  
         g.drawString("<< Batas Nilai : " + scoreLimit + ">>", width / 2 - 150, height / 2 + 75);  
       }  
     }  
     //Pemilihan kesulitan  
     if(selectingDifficulty)  
     {  
       String string = botDifficulty == 0 ? "Mudah" : (botDifficulty == 1 ? "Medium" : "Hard");  
       g.setFont(new Font("Arial", 1, 30));  
       g.drawString("<< Level Keahlian Robot : " + string + " >>", width / 2 - 180, height / 2 - 25);  
       g.drawString("Tekan untuk Main", width / 2 - 150, height / 2 + 25);  
     }  
     //Jika statusnya 1, maka game tertahankan (Pause)  
     if(gameStatus == 1)  
     {  
       g.setColor(Color.WHITE);  
       g.setFont(new Font("Arial", 1, 50));  
       g.drawString("Game Halted", width / 2 - 103, height / 2 - 25);  
     }  
     //Menampilkan lapangan yang digunakan untuk bermain  
     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);  
     }  
     //Menangnay seorang pemain atau robot  
     if(gameStatus == 3)  
     {  
       g.setColor(Color.WHITE);  
       g.setFont(new Font("Arial", 1, 50));  
       g.drawString("PONG PING", width / 2 - 75, 50);  
       if(bot && playerWon == 2)  
       g.drawString("Robotnya menang" , width / 2 - 170, 200);  
       else  
       g.drawString("Player " + playerWon + " menang", width / 2 -165, 200);  
       g.setFont(new Font("Arial", 1, 30));  
       g.drawString("Tekan Space untuk main lagi", width / 2 - 185, height / 2 - 25);  
       g.drawString("Tekan ESC untuk kembali ke menu", width / 2 - 140, height / 2 + 25);  
     }  
   }  
   //Gerakan yang dilakukan  
   @Override  
   public void actionPerformed(ActionEvent e)  
   {  
     if(gameStatus == 2)  
     update();  
     renderer.repaint();  
   }  
   //Permainan baru lagi  
   public static void main(String[] args)  
   {  
     pong = new Pong();  
   }  
   //Tombol keyboard yang akan digunakan  
   @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;  
     }  
   }  
   //Jika tombol keyboard tidak ditekan  
   @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;  
   }  
   //Sub-class kosong  
   @Override  
   public void keyTyped(KeyEvent e )  
   {  
   }  
 }  

Class Renderer

 /**  
  * Class yang berfungsi untuk menghubungkan antara UIComponent  
  * dengan output respons dari pengguna  
  *  
  * @author (Dewangga Dharmawan)  
  * @version (14/12/2020)  
  */  
 import java.awt.Graphics;  
 import java.awt.Graphics2D;  
 import javax.swing.JPanel;  
 public class Renderer extends JPanel  
 {  
   //Memastikan bahwa class yang ada pas dengan serial yang ada  
   private static final long serialVersionUID = 1L;  
   //Mengoverride method dari berbagai Class jika ada  
   @Override  
   protected void paintComponent(Graphics g)  
   {  
     super.paintComponent(g);  
     Pong.pong.render((Graphics2D) g);  
   }  
 }  

Class Paddle

 /**  
  * Class ini untuk menampilkan paddle pada permainan Pong  
  *  
  * @author (Dewangga Dharmawan)  
  * @version (14/12/2020)  
  */  
 import java.awt.Color;  
 import java.awt.Graphics;  
 public class Paddle  
 {  
   public int paddleNumber,  
   x, y,  
   width = 50, height = 250, //Besar paddle  
   score;  
   //Menenutkan posisi paddle  
   public Paddle(Pong pong, int paddleNumber)  
   {  
     this.paddleNumber = paddleNumber;  
     if(paddleNumber == 1)  
     this.x = 0;  
     if(paddleNumber == 2)  
     this.x = pong.width - width;  
   }  
   //Menentukan warna paddle  
   public void render(Graphics g)  
   {  
     g.setColor(Color.WHITE);  
     g.fillRect(x, y, width, height);  
   }  
   //Menentukan kecepatan gerak paddle  
   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;  
     }  
   }  
 }  

Class Ball

 /**  
  * Class untuk membuat bola yang akan dimainkan dalam Pong  
  *  
  * @author (Dewangga Dharmawan)  
  * @version (14/12/2020)  
  */  
 import java.awt.Color;  
 import java.awt.Graphics;  
 import java.util.Random;  
 public class Ball  
 {  
   public int x, y,  //Posisi bola  
   width = 25, height = 25, //Besar bola  
   motionX, motionY; //Percepatan bola  
   public Random random;  //Keacakan arah bola  
   private Pong pong; //Menginisialisasi variable class Pong  
   public int amountOfHits; //Banyak kalinya bola mengenai paddle  
   //Memunculkan bolanya saat permainan dimulai  
   public Ball(Pong pong)  
   {  
     this.pong = pong;  
     this.random = new Random();  
     spawn();  
   }  
   //Mempercepat (atau memperlambat) gerak bola tiap pukulan  
   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();  
     }  
   }  
   //Method memunculkan bola  
   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;  
   }  
   //Mengecek apakah bolanya mengenai paddlenya  
   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;  
     else if((paddle.x > x && paddle.paddleNumber == 1) || (paddle.x < x - width && paddle.paddleNumber == 2))  
     return 2;  
     return 0;  
   }  
   //Mewarnai bola tersebut  
   public void render(Graphics g)  
   {  
     g.setColor(Color.WHITE);  
     g.fillOval(x, y, width, height);  
   }  
 }  

Implementasi

Komentar

Postingan populer dari blog ini

Tugas 5 PBO C Tech Support System

Tugas 10 PBO C Text Editor

Tugas 2 PBO C