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);
}
}
barpackage 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><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>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 &gt; 0){
y-=speed;
}
else{
y=0;
}
}
else{
if(y + panjang + speed &lt; Pong.pong.panjang){
y+= speed;
}
else {
y= Pong.pong.panjang - panjang;
}
}
}
}
pongpackage 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
Posting Komentar