Rabu, Juni 02, 2010

Pembuatan Game Mobile Puzzle Geser




Pembuatan Game Mobile Puzzle Geser menggunakan J2ME

A. Software yang digunakan penulis antara lain:

1. Java versi jdk1.60_18

2. Netbeans IDE 6.8

3. J2ME Wireless Toolkit 2.5.2_01

4. Microsoft Windows XP professional (5.1, Build 2600)

B. Hardware yang digunakan penulis antara lain:

1. Processor Intel Core 2 Duo T6400 2.0 GHz 2MB L2 Cache 800MHz

2. RAM 1GB DDR2 PC6400

3. Sis Mirage 3 128MB

4. SATA 160GB HDD

Gambaran Umum

Aplikasi pembuatan game PuzzleGeser ini ditujukan untuk telepon selular yang yang mendukung java. Game ini dibuat menggunakan bahasa pemrograman J2ME (Java 2 Micro Edition), dengan editor yang dipakai adalah Netbeans IDE 6.8. Game ini tergolong sebagai game asah otak yang membutuhkan kreatifitas serta daya pikir bagi pemainnya karena pemain harus menyusun kembali susunan angka dan huruf yang telah diacak..

Cara memainkan game ini adalah menyusun angka atau huruf yang telah diacak dengan menggesernya yang ada di sekitar ruang yang kosong secara vertical atau horizontal. Untuk menggesernya kita gunakan tombol navigasi. Menu yang tersedia di pada game ini diantaranya adalah :

· Options

o Mulai (untuk memulai game dan susunan diacak)

o Pilihan (konfigurasi Game)

§ Reverse Arrows (menukar fungsi navigasi, kiri menjadi kanan, atas menjadi bawah, dan sebaliknya)

§ Mudah (untuk tipe permainan yang mudah)

§ Sulit (untuk tipe permainan yang susah)

o Reset (untuk mengembalikan urutan angka)

o Unlock (Untuk Memulai Game dan susunan tidak diacak)

· Keluar (Untuk keluar dari permainan)

· Author (Untuk melihat author)


Lampiran Koding

package jajal;

import java.util.Random;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;


public class Papan extends Canvas implements CommandListener {
// command
static final int CMD_EXIT= 1;
static final int CMD_OPTIONS = 2;
static final int CMD_RESET = 3;
static final int CMD_START = 4;
static final int CMD_UNLOCK = 5;
static final int CMD_ZLAST = 6; // must be ze last, of course

// variabel state
static final int INITIALIZED = 0;
static final int PLAYING = 1;
static final int WON = 2;
MIDlet midlet;
Display dpy;
Options options;

// jumlah string harus sebanyak 15 karakter
String letters = "12345678ABCDEFG";
Font font;
Piece blankp;
Piece[] all;
Piece[][] grid;
Random rand;

// deklarasi grid kedalam pixel
int gridx;
int gridy;

// deklarasi grid lebar dan tinggi kedalama cells
int gridw;
int gridh;

// deklarasi cell geometry didalam pixel
int cellw;
int cellh;
int cellyoff;
int cellxoff;
Command[] cmd;
int gameState;
boolean cheated;

public Papan(MIDlet midlet_) {
int i;

// variabel global
midlet = midlet_;
dpy = Display.getDisplay(midlet);
gridw = 4;
gridh = 4;

font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);

// update ketika metrics font mendapatkan implementasi
cellw = font.charWidth('M') + 7;
cellh = font.getHeight() + 1;
cellxoff = 3;
cellyoff = 0;

gridx = (getWidth() - (gridw * cellw) + 1) / 2;
gridy = 10;

cheated = false;
rand = new Random();

// membuat grid array
grid = new Piece[gridw][];

for (i = 0; i < all =" new" i =" 0;" x =" i" y =" i" s =" letters.substring(i," blankp =" new" cmd =" new" options =" new" t =" grid[x1][y1];" i =" 0;" j =" 0;" r =" rand.nextInt()" i =" 0;" dx =" dy" v =" (rand.nextInt()" dx =" v;" dy =" v;" dx =" 1;" dx =" -1;" dy =" 1;" dy =" -1;" limit =" (gridw" ta =" new" i =" 0;" j =" randRange(limit);" temp =" ta[j];" i =" 0;" ra =" 0;" rb =" 7;" ra =" 7;" rb =" 0;" x =" rand.nextInt()" y =" rand.nextInt()" x ="="" y ="="" x =" 2;" y =" 0;" temp =" new" n =" 0;" i =" 0;" j =" 0;" p =" grid[j][i];" p ="="" k =" 0;" temp =" new" k =" 0;" i =" 0;" j =" 0;" k =" 0;" gamestate =" ns;" cheated =" false;" cheated =" false;" cheated =" true;" j =" 0;" k =" 0;" gamestate ="="" game =" getGameAction(code);" swapx =" blankp.x;" swapy =" blankp.y;" direction =" (options.reversed">= gridw) || (swapy <>= gridh)) {
return;
}

moveBlank(swapx, swapy);
repaint();

if (isSolved()) {
setState(WON);
}
}

class Piece {
String label;
boolean inv;
int serial;
int ix;
int iy;
int x;
int y;

Piece(String str, int ser, int nx, int ny, boolean v) {
label = str;
serial = ser;
x = ix = nx;
y = iy = ny;
inv = v;
}

void setLocation(int nx, int ny) {
x = nx;
y = ny;
}

boolean isHome() {
return (x == ix) && (y == iy);
}

void goHome() {
setGrid(this, ix, iy);
}

// asumsi background = putih
void paint(Graphics g) {
int px = x * cellw;
int py = y * cellh;

if (label != null) {
if (inv) {
// garisluar hitam, kotak putih dan hitam
g.setColor(0);
g.setFont(font);
g.drawRect(px, py, cellw - 2, cellh - 2);
g.drawString(label, px + cellxoff, py + cellyoff, Graphics.TOP | Graphics.LEFT);
} else {
// kotak hitam engan tulisan putih
g.setColor(0);
g.fillRect(px, py, cellw - 1, cellh - 1);
g.setColor(0xFFFFFF);
g.setFont(font);
g.drawString(label, px + cellxoff, py + cellyoff, Graphics.TOP | Graphics.LEFT);
}
}
}
}

class PapanCommand extends Command {
int tag;

PapanCommand(String label, int type, int pri, int tag_) {
super(label, type, pri);
tag = tag_;
}
}
}


package jajal;

import javax.microedition.lcdui.*;


public class Options extends Form implements CommandListener {
boolean reversed;
boolean funny;
boolean hard;
Command ok;
Command cancel;
Display dpy;
Displayable prev;
ChoiceGroup cg1;
ChoiceGroup cg2;
boolean[] scratch;

Options(Display dpy_, Displayable prev_) {
super("Pilihan");

dpy = dpy_;
prev = prev_;

scratch = new boolean[2];

// menset harga awal
reversed = false;
funny = false;
hard = true;

cg1 = new ChoiceGroup(null, Choice.MULTIPLE);
cg1.append("reverse arrows", null);
cg1.append("funny shuffle", null);
append(cg1);


append("Tingkat");

cg2 = new ChoiceGroup(null, Choice.EXCLUSIVE);
cg2.append("Mudah", null);
cg2.append("Susah", null);
append(cg2);

loadUI();

ok = new Command("OK", Command.OK, 0);
cancel = new Command("Batal", Command.CANCEL, 1);

addCommand(ok);
addCommand(cancel);
setCommandListener(this);
}

public void commandAction(Command c, Displayable d) {
if (c == ok) {
readUI();
} else if (c == cancel) {
loadUI();
}

dpy.setCurrent(prev);
}

void loadUI() {
cg1.setSelectedIndex(0, reversed);
cg1.setSelectedIndex(1, funny);

cg2.setSelectedIndex((hard ? 1 : 0), true);
}

void readUI() {
reversed = cg1.isSelected(0);
funny = cg1.isSelected(1);

hard = cg2.isSelected(1);
}
}



package jajal;

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;


public class PuzzleGeser extends MIDlet {
Papan p;

public PuzzleGeser() {
p = new Papan(this);
}

public void startApp() {
Display.getDisplay(this).setCurrent(p);
}

public void pauseApp() {
}

public void destroyApp(boolean unc) {
}
}


Lampiran Output