Tugas 8 PBO C Pong
Nama : Dewangga Dharmawan
NRP : 05111940000029
Dosen : Pak Fajar Baskoro
Diagram Class
Class Pong
/**
* Main Class untuk permainan Pong, dan sekaligus display permainan
* selain paddle dan bolanya
*
* @author (Dewangga Dharmawan)
* @version (14/12/2020)
*/
//Beberapa library java yang digunakan
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; //Variabel class Pong
public int width = 700, height = 700; //Luas layar
public Renderer renderer; //Variabel class Renderer
//Variabel Paddle yang digunakan
public Paddle player1;
public Paddle player2;
//Variabel bola
public Ball ball;
//Variabel ada atau tidaknya pemain robot
//Dan pemilihan kesulitan robotnya
public boolean bot = false, selectingDifficulty;
//Kendali paddle
public boolean w, s, up, down;
//Status permainan, batas nilai, dan menangnya pemain
public int gameStatus = 0, scoreLimit = 7, playerWon;
//Keahlian robotnya, serta gerak-geriknya
public int botDifficulty, botMoves, botCooldown = 0;
public Random random; //Keacakan bola
public JFrame jframe; //Layar yang digunakan
//Mendefinisikan beberapa display, sebelum start
public Pong()
{
Timer timer = new Timer(20, this);
random = new Random();
jframe = new JFrame("Pong Ping");
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();
}
//Memulai permainan
public void start()
{
gameStatus = 2;
player1 = new Paddle(this, 1);
player2 = new Paddle(this, 2);
ball = new Ball(this);
}
//Keadaan permainan, apakah dua orang, atau dengan robot
//Serta menang atau tidaknya pemain
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);
}
//Layar utama dari permainan Pong
public void render(Graphics2D g)
{
g.setColor(Color.BLUE);
g.fillRect(0,0,width, height);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Layar utama
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("Tekan Space untuk Main", width / 2 - 150, height / 2 - 25);
g.drawString("Tekan Shift untuk Main dengan Robot", width / 2 - 200, height / 2 + 25);
g.drawString("<< Batas Nilai : " + scoreLimit + ">>", width / 2 - 150, height / 2 + 75);
}
}
//Pemilihan kesulitan
if(selectingDifficulty)
{
String string = botDifficulty == 0 ? "Mudah" : (botDifficulty == 1 ? "Medium" : "Hard");
g.setFont(new Font("Arial", 1, 30));
g.drawString("<< Level Keahlian Robot : " + string + " >>", width / 2 - 180, height / 2 - 25);
g.drawString("Tekan untuk Main", width / 2 - 150, height / 2 + 25);
}
//Jika statusnya 1, maka game tertahankan (Pause)
if(gameStatus == 1)
{
g.setColor(Color.WHITE);
g.setFont(new Font("Arial", 1, 50));
g.drawString("Game Halted", width / 2 - 103, height / 2 - 25);
}
//Menampilkan lapangan yang digunakan untuk bermain
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);
}
//Menangnay seorang pemain atau robot
if(gameStatus == 3)
{
g.setColor(Color.WHITE);
g.setFont(new Font("Arial", 1, 50));
g.drawString("PONG PING", width / 2 - 75, 50);
if(bot && playerWon == 2)
g.drawString("Robotnya menang" , width / 2 - 170, 200);
else
g.drawString("Player " + playerWon + " menang", width / 2 -165, 200);
g.setFont(new Font("Arial", 1, 30));
g.drawString("Tekan Space untuk main lagi", width / 2 - 185, height / 2 - 25);
g.drawString("Tekan ESC untuk kembali ke menu", width / 2 - 140, height / 2 + 25);
}
}
//Gerakan yang dilakukan
@Override
public void actionPerformed(ActionEvent e)
{
if(gameStatus == 2)
update();
renderer.repaint();
}
//Permainan baru lagi
public static void main(String[] args)
{
pong = new Pong();
}
//Tombol keyboard yang akan digunakan
@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;
}
}
//Jika tombol keyboard tidak ditekan
@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;
}
//Sub-class kosong
@Override
public void keyTyped(KeyEvent e )
{
}
}
Class Renderer
/**
* Class yang berfungsi untuk menghubungkan antara UIComponent
* dengan output respons dari pengguna
*
* @author (Dewangga Dharmawan)
* @version (14/12/2020)
*/
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Renderer extends JPanel
{
//Memastikan bahwa class yang ada pas dengan serial yang ada
private static final long serialVersionUID = 1L;
//Mengoverride method dari berbagai Class jika ada
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Pong.pong.render((Graphics2D) g);
}
}
Class Paddle
/**
* Class ini untuk menampilkan paddle pada permainan Pong
*
* @author (Dewangga Dharmawan)
* @version (14/12/2020)
*/
import java.awt.Color;
import java.awt.Graphics;
public class Paddle
{
public int paddleNumber,
x, y,
width = 50, height = 250, //Besar paddle
score;
//Menenutkan posisi paddle
public Paddle(Pong pong, int paddleNumber)
{
this.paddleNumber = paddleNumber;
if(paddleNumber == 1)
this.x = 0;
if(paddleNumber == 2)
this.x = pong.width - width;
}
//Menentukan warna paddle
public void render(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(x, y, width, height);
}
//Menentukan kecepatan gerak paddle
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 Ball
/**
* Class untuk membuat bola yang akan dimainkan dalam Pong
*
* @author (Dewangga Dharmawan)
* @version (14/12/2020)
*/
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
public class Ball
{
public int x, y, //Posisi bola
width = 25, height = 25, //Besar bola
motionX, motionY; //Percepatan bola
public Random random; //Keacakan arah bola
private Pong pong; //Menginisialisasi variable class Pong
public int amountOfHits; //Banyak kalinya bola mengenai paddle
//Memunculkan bolanya saat permainan dimulai
public Ball(Pong pong)
{
this.pong = pong;
this.random = new Random();
spawn();
}
//Mempercepat (atau memperlambat) gerak bola tiap pukulan
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();
}
}
//Method memunculkan bola
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;
}
//Mengecek apakah bolanya mengenai paddlenya
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;
else if((paddle.x > x && paddle.paddleNumber == 1) || (paddle.x < x - width && paddle.paddleNumber == 2))
return 2;
return 0;
}
//Mewarnai bola tersebut
public void render(Graphics g)
{
g.setColor(Color.WHITE);
g.fillOval(x, y, width, height);
}
}
Komentar
Posting Komentar