Game of Pong

 Game of Pong

Pong adalah permainan video generasi pertama yang dirilis sebagai permainan arkade yang dioperasikan dengan koin yang dikembangkan oleh Atari Inc. pada tanggal 29 November, 1972. Pong didasari dari permainan atau olahraga tenis meja, nama permainan ini berasal dari suara yang dihasilkan ketika memukul bola ping pong

disini kita menggunakan 4 class yaitu renderer, ball, paddle, dan pong

renderer
package pong;
 
import javax.swing.*;
import java.awt.*;
 
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);
    }
}
bar
package pong;
 
import java.awt.*;
import java.util.Random;
 
public class Ball {
    public int x,y,lebar = 40, panjang =40;
    public int motionX, motionY;
    public Random random;
    private Pong pong;
    public int amountOfHits;
 
    /**
     * contruktor untuk membuat bola saat
     * game mau dimulai
     * @param pong permintaan pong membuat bola
     */
    public Ball(Pong pong){
        this.pong = pong;
        this.random = new Random();
        spawn();
    }
 
    public void update(Paddle paddle1, Paddle paddle2){
        int speed = 8;
        this.x += motionX * speed;
        this.y += motionY * speed;
 
        if(this.y + panjang  - motionY  > pong.panjang || this.y + motionY < 0){
            if (this.motionY <0){
                this.y = 0;
                this.motionY = random.nextInt(5);
 
                if(motionY == 0) motionY = 1;
 
            }
            else {
                this.motionY = -random.nextInt(5);
                this.y = pong.panjang - panjang;
                if (motionY == 0) motionY = -1;
            }
        }
        if(checkCollision(paddle1) == 1){
            this.motionX = 1 + (amountOfHits/5);
            this.motionY = -2 + random.nextInt(5);
            if(motionY == 0) motionY =1;
 
            amountOfHits++;
        }
        else if(checkCollision(paddle2) == 1){
            this.motionX = -1 - (amountOfHits/5);
            this.motionY = -2 + random.nextInt(5);
            if(motionY == 0) motionY = 1;
 
            amountOfHits++;
        }
 
        if (checkCollision(paddle1) == 2){
            paddle2.score++;
            spawn();
        }
        else if (checkCollision(paddle2) == 2){
            paddle1.score++;
            spawn();
        }
    }
 
    /**
     * method yang membuat bola dispawn saat memulai game
     * atau sehabis mencetak skor
     */
    public void spawn(){
        this.amountOfHits =0;
        this.x = pong.lebar/2 - this.lebar/2;
        this.y = pong.panjang/2 - this.panjang/2;
 
        this.motionY = -2 + random.nextInt(5);
 
        if(motionY==0) motionY =1;
        if(random.nextBoolean()) motionX =1;
        else motionX = -1;
    }
 
    public  int checkCollision(Paddle paddle){
        if (this.x < paddle.x + paddle.lebar && this.x + lebar > paddle.x
                && this.y < paddle.y + paddle.panjang && this.y + panjang > paddle.y) return 1; // memantul
        else if ((paddle.x > x && paddle.paddleNumber ==1)
                || (paddle.x < x - lebar && paddle.paddleNumber ==2)) return 2; //skor
        return  0;//nothing
    }
 
    /**
     *  Method untuk membuat tampilan bola
     * @param g
     */
    public void  render(Graphics g){
        g.setColor(Color.YELLOW );
        g.fillOval(x,y,lebar,panjang);
    }
}
paddle

<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"><code>&lt;pre style=&quot;font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%&quot;&gt;&lt;code&gt;package pong;
 
import java.awt.*;
 
public class Paddle {
 
    public int paddleNumber, score;
    public int x,y,lebar =50, panjang= 250;
 
    /**
     * construktor paddle
     * @param pong
     * @param paddleNumber jumlah player
     */
    public Paddle(Pong pong, int paddleNumber){
        this.paddleNumber = paddleNumber;
        if(paddleNumber ==1){
            this.x =0;
        }
        if(paddleNumber ==2){
            this.x = pong.lebar -lebar;
        }
 
        this.y = pong.panjang/2 - this.panjang/2;
    }
 
    public void render(Graphics g){
        g.setColor(Color.BLUE );
        g.fillRect(x,y,lebar,panjang);
    }
 
    /**
     *  method yang mengatur pergerakan paddle
     * @param up kondisi tombol yang dipakai untuk bergerak tombol up == true,
     *           dan sebaliknya
     */
    public void move(Boolean up){
        int speed = 20;
 
        if(up){
            if (y-speed &amp;gt; 0){
                y-=speed;
            }
            else{
                y=0;
            }
        }
        else{
            if(y + panjang + speed &amp;lt; Pong.pong.panjang){
                y+= speed;
            }
            else {
                y= Pong.pong.panjang - panjang;
            }
        }
        }
}
pong

package pong;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
 
public class Pong implements ActionListener, KeyListener{
 
    public static Pong pong;
    public int lebar =  1280, panjang = 720 ; //lebar-panjang panel
    public Renderer renderer;
    public Paddle player1, player2;
    public Ball ball;
    public boolean bot = false, selectingDifficulty;
    public boolean w, s, up, down;
    public int gameStatus = 0, scoreLimit = 3, playerWon; //0 = Menu, 1 = Paused, 2 = Playing, 3 = Over
    public int botDifficulty, botMoves, botCooldown = 0;
    public Random random;
    public JFrame jframe;
 
    /**
     * contructor
     */
    public Pong(){
        Timer timer = new Timer(20,this);
        random = new Random();
        jframe = new JFrame("PONG PING");
        renderer = new Renderer();
 
        jframe.setSize(lebar + 15, panjang + 35);
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
        jframe.add(renderer);
        jframe.addKeyListener(this);
 
        timer.start();
        }
 
    /**
     * constructor saat mau mulai main
     */
    public void start(){
        gameStatus =2;
        player1 = new Paddle(this, 1);
        player2 = new Paddle(this, 2);
        ball = new Ball(this);
    }
 
 
    public void update(){
        //cek skor setiap pemain
        if (player1.score >= scoreLimit){
            playerWon =1;
            gameStatus = 3;
        }
 
        if(player2.score >= scoreLimit){
            playerWon = 2;
            gameStatus = 3;
        }
 
        //pergerakan paddle1
        if(w) player1.move(true);
        if(s) player1.move(false);
 
 
        if(!bot){
            //membaca pergerakan padlle2
            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.panjang/2 < ball.y){
                    player2.move(false);
                    botMoves++;
                }
                if(player2.y + player2.panjang/2 > ball.y){
                    player2.move(true);
                    botMoves++;
                }
 
                if(botDifficulty == 0) botCooldown = 25;
                if(botDifficulty == 1) botCooldown = 15;
                if(botDifficulty == 2) botCooldown = 8;
            }
        }
        ball.update(player1,player2);
    }
 
    /**
     * method yang membuat UI
     * @param g
     */
    public void render(Graphics2D g){
 
        //untuk background
        g.setColor(Color.BLACK);
        g.fillRect(0,0, lebar, panjang);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
        //tampilan menu
        if(gameStatus ==0){
            g.setColor(Color.MAGENTA);
            g.setFont(new Font("Arial", 1, 75));
            g.drawString("PONG PING",lebar/2 - 230, 200);
 
            if(!selectingDifficulty){
                g.setColor(Color.PINK);
                g.setFont(new Font("Arial", 1, 30));
                g.drawString("TEKAN SPACE UNTUK BERMAIN/PAUSE", lebar/2 - 320, panjang/2 - 25);
                g.drawString("TEKAN SHIFT UNTUK BERMAIN DENGAN BOT", lebar/2 - 360, panjang/2 + 25);
                g.drawString("<< SCORE LIMIT: " + scoreLimit + " >>",lebar/2-176, panjang/2 + 75);
            }
        }
        if(selectingDifficulty){
            g.setColor(Color.ORANGE);
            String string = botDifficulty == 0 ? "EZ" : (botDifficulty == 1 ? "MEDIUM" : "Hard");
 
            g.setFont(new Font("Arial", 1, 30));
            if(botDifficulty == 0 )
                g.drawString("<< BOT DIFFICULTY: " + string + " >>",lebar/2 - 219, panjang/2 - 25);
            else if(botDifficulty == 1)
                g.drawString("<< BOT DIFFICULTY: " + string + " >>",lebar/2 - 257, panjang/2 - 25);
            else if(botDifficulty == 2)
                g.drawString("<< BOT DIFFICULTY: " + string + " >>",lebar/2 - 294, panjang/2 - 25);
            g.drawString("PRESS SPACE TO PLAY/PAUSE", lebar/2 - 260 , panjang/2 + 25);
        }
 
        //membuat arena permainan
        if(gameStatus == 1 || gameStatus == 2){
            g.setColor(Color.GREEN);
 
            g.setStroke(new BasicStroke(5f));
            g.drawLine(lebar/2, 0,lebar/2,panjang);
 
            g.setStroke(new BasicStroke(2f));
            g.drawOval(lebar/2 -125, panjang /2-120, 250,250);
 
            //untuk skor
            g.setFont(new Font("Arial", 1, 50));
            g.drawString(String.valueOf(player1.score), lebar/2 - 90, 100);
            g.drawString(String.valueOf(player2.score), lebar/2 + 65, 100);
 
            player1.render(g);
            player2.render(g);
            ball.render(g);
        }
 
        // ketika game di pause
        if(gameStatus == 1){
            g.setColor(Color.RED);
            g.setFont(new Font("Arial", 1, 50));
            g.drawString("PAUSE", lebar/2 - 89, panjang/2+20);
        }
 
        //maka ini saat menang
        if(gameStatus ==3){
            g.setColor(Color.MAGENTA);
            g.setFont(new Font("Arial", 1, 75));
            g.drawString("PONG PING",lebar/2 - 230, 200);
 
            if(bot && playerWon == 2) g.drawString("BOT MENANG!", lebar/2-283, 300);
            else g.drawString("PLAYER " + playerWon + " MENANG!", lebar/2-390, 330);
 
            g.setColor(Color.CYAN);
            g.setFont(new Font("Arial", 1, 30));
            g.drawString("TEKAN SPACE UNTUK BERMAIN", lebar/2 - 260, panjang/2 + 100);
            g.drawString("TEKAN SHIFT UNTUK BERMAIN DENGAN BOT", lebar/2 - 360, panjang/2 + 150);
        }
    }
 
    @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){}
}

Komentar

Postingan populer dari blog ini

ETS PBKK

EAS PBKK

Notepad Sederhana