Game pong
Nama : Yasinta Yusniawati
NRP : 05111740000054
Kelas : PBO - B
Tugas kali ini adalah membuat 'Game Pong' menggunakan BlueJ. Class yang dibutuhkan untuk membuat game tersebuat ada pada gambar di bawah ini :
Source codenya :
1. Ball
/** * Class Ball * * Yasinta Yusniawati * 3-12-12018 */ 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); } }
2. Paddle
/** * Class Paddle * * Yasinta Yusniawati * 3-12-12018 */ 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; } } } }
3. Pong
/** * Class Pong * * Yasinta Yusniawati * 3-12-12018 * */ 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) { } }
4. Renderer
/** * Class Renderer * * Yasinta Yusniawati * 3-12-12018 * */ 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); } }
CARA MENGGUNAKAN :
klik kanan class pong, klik void main, lalu klik OK
pilih mode permainan
bisa menentukan tingkat kesulitan dari easy - medium - hard
Let's play
Tidak ada komentar:
Posting Komentar