Tugas 8 PBO-C "Membuat Game Pong"

December 13, 2020 0

    Bermain game adalah suatu hal yang menyenangkan untuk dilakukan bagi sebagian besar orang, apalagi jika mampu membuat sendiri gamenya. Nah, pada kesempatan kali ini saya akan mencoba membuat game sederhana yang bernama game Pong. 

    Game Pong adalah permainan video generasi pertama yang dirilis sebagai permainan arkade yang dioperasikan dengan koin yang dikembangkan oleh Atari Inc. Saya akan membuat game ini dengan mengimplementasikan bahasa pemrograman java dan menggunakan konsep OOP. 

Program ini menggunakan 4 class yaitu :

  1. Class Ball, berfungsi untuk mengatur semua yang berkaitan dengan bola pong nya
  2. Class Paddle, berfungsi untuk mengatur semua yang berkaitan dengan pemukul / alas nya
  3. Class Renderer, berfungsi untuk mengatur grafik dari gamenya
  4. Class Pong, berfungsi untuk meload seluruh class yang ada pada program ini
  • Sourcecode 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.RED);
            g.fillOval(x, y, width, height);
        }
     
    }
    
  • Sourcecode 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.BLACK);
            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;
                }
            }
        }
     
    }
    
  • Sourcecode 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);
        }
     
    }
    
    
  • Sourcecode 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.WHITE);
    g.fillRect(0, 0, width, height);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    if (gameStatus == 0)
    {
    g.setColor(Color.BLACK);
    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.BLACK);
    g.setFont(new Font("Arial", 1, 50));
    g.drawString("PAUSED", width / 2 - 103, height / 2 - 25);
    }
    if (gameStatus == 1 || gameStatus == 2)
    {
    g.setColor(Color.BLACK);
    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.BLACK);
    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)
    {
    }
    }
    

Screenshot akhir program ketika dijalankan:


Terima kasih telah berkunjung. Mohon maaf apabila ada kesalahan dalam penulisan. 👾👾

0 Comments for "Tugas 8 PBO-C "Membuat Game Pong" "