Nama :Rian
Oscar Jonathan
NPM :57413565
Kelas :3ia14
Mata Kuliah :Pengantar Teori Game
NPM :57413565
Kelas :3ia14
Mata Kuliah :Pengantar Teori Game
Penjelasan pembuatan Game Sokoban menggunakan Bahasa pemrograman Java.
Sokoban
Sokoban merupakan game bertipe strategi, dimana pemain
diharuskan menggeser kotak yang ada ke titik-titik tujuan yang sudah ditentukan
menggunakan 1 pemain utama. Jadi kesulitan pada permainan ini adalah dimana
pemain diharusnya berfikir bagaimana caranya memindahkan semua kota ke dalam
titik-titik final, yang sudah ditentukan, dimana di setiap level tipe dari map
yang digunakan berbeda-beda.
Kodingan
game sokoban menggunakan Java
Fungsi yang
harus dideklarasikan pada program java
package sokoban;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
variable
yang terlebih dahulu di deklarasikan pada game sokoban, dengan wall image 20 x
20 px, offset itu merupakan jarak antara jendela program dengan game. Dengan 4
tipe collision setiap collison di representasikan dengan numerical constant
private final int OFFSET = 30;
private final int SPACE = 20;
private final int LEFT_COLLISION = 1;
private final int RIGHT_COLLISION = 2;
private final int TOP_COLLISION = 3;
private final int BOTTOM_COLLISION = 4;
pendeklarasian
variable walls baggs dan aeras kedalam suatu array
private ArrayList walls = new ArrayList();
private ArrayList baggs = new ArrayList();
private ArrayList areas = new ArrayList();
Merupakan
gambaran dari map yang akan dibuat game, di sini (#) melambangkan tembok pada
game tersebut, ($) merepresentasikan box yang akan di dorong, dan (.) merupakan
tempat tujuan dimana kotak harus diletakan, (@) sebagai pemain utama yaitu yang
dapat digerakan bebas yang terakhir karakter
/n yang berfungsi untuk berpindah
ke baris selanjutnya.
private String level =
" ######\n"
+ " ## #\n"
+ " ##$ #\n"
+ " #### $##\n"
+ " ## $ $ #\n"
+ "#### # ## # ######\n"
+ "## # ## ##### ..#\n"
+ "## $ $ ..#\n"
+ "###### ### #@## ..#\n"
+ " ## #########\n"
+ " ########\n";
Mendeklarasikan methode initWorld
public final void initWorld() {
int x = OFFSET;
int y = OFFSET;
...
Kita membuat
baggage objek didalam fungsi $, object
ini untuk menambahkan dari baggs list dengan variable x yang bertambah terus
} else if (item == '$') {
b = new Baggage(x, y);
baggs.add(b);
x += SPACE;
membuat
method yang memunculkan game world kedalam windows
public void buildWorld(Graphics g) {
...
Membuat world
list dimana sudah termasuk semua object dari game.
ArrayList world = new ArrayList();
world.addAll(walls);
world.addAll(areas);
world.addAll(baggs);
world.add(soko);
kita
iterasikan melalui world container dan memunculkan objek. Pemain dan baggage
images lebih kecil sedikit , kita tambahkan 2px untuk membuat mereka berada
pada kordinat tengah.
for (int i = 0; i < world.size(); i++) {
Actor item = (Actor) world.get(i);
if ((item instanceof Player)
|| (item instanceof Baggage)) {
g.drawImage(item.getImage(), item.x() + 2, item.y() + 2, this);
} else {
g.drawImage(item.getImage(), item.x(), item.y(), this);
}
...
Jika level selesai
maka akan memunculkan tulisan completed dipojok kiri atas.
if (completed) {
g.setColor(new Color(0, 0, 0));
g.drawString("Completed", 25, 20);
}
Didalam
keyPressed() method kita mengecek tombol apa yang ditekan. Kita menggendalikan
objek sokoban cursor keys. Jika kita menekan tombol kiri maka akan di check
dari collison dari wall dan baggages jika tidak ada apapa maka objek dapat berpindah ke kiri.
if (key == KeyEvent.VK_LEFT) {
if (checkWallCollision(soko,
LEFT_COLLISION)) {
return;
}
if (checkBagCollision(LEFT_COLLISION)) {
return;
}
soko.move(-SPACE, 0);
...
Membuat
tombol reset dengan menekan R pada keyboard.
} else if (key == KeyEvent.VK_R) {
restartLevel();
}
Pada mehod
checkWallCollision() yang kita buat untuk memastikan bahwa objek sokoban atau
objek baggage tidak dapat menembus wall, dimana terdapat 4 tipe collisions,
baris dibawah ini untuk mengecek left collision
if (type == LEFT_COLLISION) {
for (int i = 0; i < walls.size(); i++) {
Wall wall = (Wall) walls.get(i);
if (actor.isLeftCollision(wall)) {
return true;
}
}
return false;
...
Method
dimana mengatur collision dari baggage, dimana baggage hanya bisa didorog oleh
object sokoban, jika baggage berpindah maka selanjutnya untuk mengecek apakah
level sudah selesai dengan memanggil method iscomplete()
private boolean checkBagCollision(int type) {
}
Method
isCompleted()
mencek jika level sudah selesai. Kita
dapatkan nomor dari bags. Kita bandingkan kordinat x, y dari semua bags dan
destination area.for (int i = 0; i < num; i++) {
Baggage bag = (Baggage) baggs.get(i);
for (int j = 0; j < num; j++) {
Area area = (Area) areas.get(j);
if (bag.x() == area.x()
&& bag.y() == area.y()) {
compl += 1;
}
}
}
Permainan
sudah berakhir, ketika completed variable sama dengan jumlah dari bags didalam
permainan.
if (compl == num) {
completed = true;
repaint();
}
Jika kita salah melakukan pergerakan, kita dapat mengulang kembal level tersebut. kita hapus semua objek yang penting pada game tersebut. atur completed variable menjadi false.
public void restartLevel() {
areas.clear();
baggs.clear();
walls.clear();
initWorld();
if (completed) {
completed = false;
}
}
Merupakan
class actor class ini merupakan class dasar untuk actors lain di dala permainan.kelas ini
mengenkapsulasi fungsi-fungsi dasar dari objek di game sokoban ini.
package sokoban;
import java.awt.Image;
public class Actor {
private
final int SPACE = 20;
private int
x;
private int
y;
private
Image image;
public
Actor(int x, int y) {
this.x =
x;
this.y =
y;
}
public Image
getImage() {
return
this.image;
}
public void
setImage(Image img) {
image =
img;
}
public int
x() {
return
this.x;
}
public int
y() {
return
this.y;
}
public void
setX(int x) {
this.x =
x;
}
public void
setY(int y) {
this.y =
y;
}
public
boolean isLeftCollision(Actor actor) {
if
(((this.x() - SPACE) == actor.x()) &&
(this.y() == actor.y())) {
return true;
} else {
return
false;
}
}
public
boolean isRightCollision(Actor actor) {
if
(((this.x() + SPACE) == actor.x())
&& (this.y() == actor.y())) {
return true;
} else {
return false;
}
}
public
boolean isTopCollision(Actor actor) {
if
(((this.y() - SPACE) == actor.y()) &&
(this.x() == actor.x())) {
return true;
} else {
return false;
}
}
public
boolean isBottomCollision(Actor actor) {
if
(((this.y() + SPACE) == actor.y())
&& (this.x() == actor.x())) {
return true;
} else {
return false;
}
}
}
Method ini
mencek jika aktor bertabrakan dengan aktor lain(wall, baggage, sokoban)
public boolean isLeftCollision(Actor actor) {
if (((this.x() - SPACE) == actor.x()) &&
(this.y() == actor.y())) {
return true;
} else {
return false;
}
}
Merupakan
class dari wall yang menginheritence dari actor class kodingan dbawah berfungsi
untuk memunculkan gambar wall dari filesystem.
package sokoban;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
public class Wall extends Actor {
private Image image;
public Wall(int x, int y) {
super(x, y);
URL loc = this.getClass().getResource("wall.png");
ImageIcon iia = new ImageIcon(loc);
image = iia.getImage();
this.setImage(image);
}
}
Merupakan class player, class ini untuk membuat objek
sokoban.
Player.java
package sokoban;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
public class Player extends Actor {
public
Player(int x, int y) {
super(x,
y);
URL loc
= this.getClass().getResource("sokoban.png");
ImageIcon iia = new ImageIcon(loc);
Image
image = iia.getImage();
this.setImage(image);
}
public void
move(int x, int y) {
int nx =
this.x() + x;
int ny =
this.y() + y;
this.setX(nx);
this.setY(ny);
}
}
Method move()yang menggerakan objek didalam permainan.
public void move(int x, int y) {
int nx = this.x() + x;
int ny = this.y() + y;
this.setX(nx);
this.setY(ny);
}
Merupakan
class dari objek baggage. Objek ini dapat digerakan jadi terdapat method move()
juga.
Baggage.java
package sokoban;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
public class Baggage extends Actor {
public
Baggage(int x, int y) {
super(x,
y);
URL loc
= this.getClass().getResource("baggage.png");
ImageIcon iia = new ImageIcon(loc);
Image
image = iia.getImage();
this.setImage(image);
}
public void
move(int x, int y) {
int nx =
this.x() + x;
int ny =
this.y() + y;
this.setX(nx);
this.setY(ny);
}
}
Ini
merupakan class area, ini merupakan objek yang diatasnya kita coba letakan
baggages.
package sokoban;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
public class Area extends Actor {
public Area(int x, int y) {
super(x, y);
URL loc = this.getClass().getResource("area.png");
ImageIcon iia = new ImageIcon(loc);
Image image = iia.getImage();
this.setImage(image);
}
}
Merupakan
main classnya.
Sokoban.java
package sokoban;
import javax.swing.JFrame;
public final class Sokoban extends JFrame {
private
final int OFFSET = 30;
public
Sokoban() {
InitUI();
}
public void
InitUI() {
Board
board = new Board();
add(board);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(board.getBoardWidth() + OFFSET,
board.getBoardHeight() + 2*OFFSET);
setLocationRelativeTo(null);
setTitle("Sokoban");
}
public
static void main(String[] args) {
Sokoban
sokoban = new Sokoban();
sokoban.setVisible(true);
}
}