Jumat, 20 Mei 2016

Tugas Softskill 3 (Pengantar Teori Game)



Nama                    :Rian Oscar Jonathan
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);
    }
}