Pong

Edgar Andrew Hutauruk
05111740000166
PBO B



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;    
    }   
    public void render(Graphics g)   
    {   
       g.setColor(Color.WHITE);   
       g.fillOval(x, y, width, height);   
    }   
  }   

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;   
     }   
    }   
   }   
  }   

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);   
   }   
  }   

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 = 1;   
            }   
            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)   
    {   
    }   
  }   

Komentar