Posting kali ini adalah game sederhana dengan mengacak kata(Anagram). Inilah tampilannya dengan Java GUI:
Untuk membuatnya gunakan dua kelas yaitu MainClass dan Anagram. MainClass akan mewarisi method-method yang ada di kelas Anagram. Dengan source kode sebagai berikut:
A. Kelas Anagram
package com.syabon.dev;
import java.util.Random; public class Anagram { //////////////////////////////////////////////////////////// ///// Deklarasi dan inisialisasi variabel ///// rand dari kelas Random untuk variabel pengacakan Random rand = new Random(); ///// konstanta WIDTH dan HEIGHT untuk ukuran layar game ///// konstanta LINE untuk mencetak garis public static final int WIDTH = 520, HEIGHT = 250, LINE = 82; ///// cek sebagai penanda peringatan jika level > 5 ///// chLevel untuk penanda jika cheat level sudah digunakan ///// chHealth untuk penanda jika cheat health sudah digunakan protected boolean cek = true, chLevel = true, chHealth = true; ///// char charAcak[] untuk menyimpan pengacakan huruf protected char[] charAcak; ///// idxA dan idxB untuk indeks acak ///// idx untuk menyimpan indeks kata yang akan diacak ///// idxRand untuk menyimpan banyak penggeseran huruf ///// pos untuk meggeser huruf ke kiri atau ke kanan ///// level untuk menyimpan level sekarang ///// health untuk menyimpan nyawa sekarang protected int idxA, idxB, idx, idxRand, pos, level, health; ///// strAcak untuk menyimpan kata acak protected String strAcak; ///// String arrAcak[] untuk menyimpan pengacakan posisi array kata protected String[] arrAcak; ///// cheat level dan health protected String cheatLevel = "level ups"; protected String cheatHealth = "super boy"; //////////////////////////////////////////////////////////// ///// level 1 dan 6 : "data", "pointer", "struct", "queue", "stack", "list", "string", "array", "null", "memory" ///// level 2 dan 7 : "acak","kaca","batu","buta","buku", "kubu","dalang","ladang","pura","rupa" ///// level 3 dan 8 : "otak","kota","okta","ruas","rusa", "arus","busa","sabu","buas","usab" ///// level 4 dan 9 : "kasur","rusak","sukar","kuras","ruas", "arus","rusa","suar","kitab","bakti" ///// level 5 dan 10 : "rusak", "rakus", "kuras", "sukar", "kasur", "tutorial ", "trial out", "ratu lito", "tali tour", "roti laut" protected String[][] kata = {{"data", "pointer", "struct", "queue", "stack", "list", "string", "array", "null", "memory"}, {"acak","kaca","batu","buta","buku", "kubu","dalang","ladang","pura","rupa"}, {"otak","kota","okta","ruas","rusa", "arus","busa","sabu","buas","usab"}, {"kasur","rusak","sukar","kuras","ruas", "arus","rusa","suar","kitab","bakti"}, {"rusak", "rakus", "kuras", "sukar", "kasur", "tutorial ", "trial out", "ratu lito", "tali tour", "roti laut"}}; ///// konstruktor kelas Anagram ///// memberi nilai awal level dan health public Anagram(int level, int health){ this.level = level; this.health = health; } ///// mengambil nilai index kata acak protected int getCurrIdx(){ return idx; } ///// mencari kata yang akan diacak ///// simpan index array di var idx protected void setCurrIdx(String[] str){ ///// memanggil method setArrAcak() untuk mengacak posisi kata setArrAcak(str); ///// pengacakan dimulai dari 0-10 idx = rand.nextInt(str.length); } ///// method setArrAcak() untuk mengacak posisi kata private void setArrAcak(String[] str){ ///// simpan array untuk level sekarang di array arrAcak arrAcak = str; ///// memanggil method tukar tukar(); } ///// memberikan array untuk level sekarang di array arrAcak protected String[] getArrAcak(){ return arrAcak; } ///// memberikan banyak penggeseran huruf protected int getRandIdx(){ return idxRand; } ///// method setCurrIdx untuk banyak penggeseran huruf protected void setCurrIdx(String str){ ///// simpan hasil pengacakan di var idxRand idxRand = rand.nextInt(str.length()); } ///// megambil posisi penggeseran protected String getMovePos(){ ///// jika pos == 1 ///// geser ke kiri if(pos == 1) return "kiri"; ///// jika pos == 0 ///// geser ke kanan else return "kanan"; } ///// method setCurrIdx untuk menentukan arah penggeseran protected void setCurrIdx(int pos){ ///// jika level > 7 maka ///// mengacak nilai pos kemudian dicari sisanya ///// jika sisa 1 maka akan ke kiri ///// jika sisa 0 maka akan ke kanan if(getLevel() > 7) this.pos = rand.nextInt(pos) % 2; ///// level <= 7 maka ///// sisa pembagian 0 ///// dan akan geser ke kanan else this.pos = pos % 2; } ///// method setKataAcak untuk kata acak sekarang protected void setKataAcak(String strAcak){ this.strAcak = strAcak; } ///// mengambil kata acak sekarang protected String getKataAcak(){ return strAcak; } ///// mengambil hasil dari proses pengacakan huruf protected String getAcakHuruf(){ return String.valueOf(charAcak); } ///// mengacak huruf di kata acak sekarang protected void setAcakHuruf(String str){ ///// charAcak memiliki panjang array sesuai panjang str charAcak = new char[str.length()]; ///// array intAcak untuk menyimpan sementara banyak indeks penggeseran huruf int[] intAcak = new int[str.length()]; //////////////////////////////////////////// ///// tambahan untuk mengecek method-method //////////////////////////////////////////// System.out.println("Level : " + getLevel() + ", Health : " + getHealth()); System.out.println("chLevel : " + isCheatLevel() + ", chHealth : " + isCheatHealth()); System.out.println("Rand idx : " + getRandIdx() + ", Rand pos : " + getMovePos()); System.out.print("Array : "); for(int i = 0; i < arrAcak.length; i++) System.out.print(arrAcak[i] + " "); System.out.println(); for(int i = 97; i < 123; i++) System.out.printf("%c ", i); System.out.println("\n"); /////////////////////////////////////////// ///// perulangan untuk inisialisasi str ke array charAcak for(int i = 0; i < charAcak.length; i++){ ///// Jika level sekarang > 5 maka ///// ditambah penyandian huruf ///////////////////////////////////////////// ///// Lihat ASCII ///// for(int i = 0; i < 255; i++){ ///// System.out.printf("%d : %c\n", i, i); ///// } ///////////////////////////////////////////// if(getLevel() > 5){ ///// Jika penggeseran ke kiri maka if(getMovePos().equals("kiri")){ ///// jika < 97(a) maka ///// 123 dikurangi (a(97) dikurangi ///// (ubah huruf sekarang ke integer ///// dikurangi banyak penggeseran huruf)) if(((int)str.charAt(i) - getRandIdx()) < 97){ intAcak[i] = 123 - (97 - ((int)str.charAt(i) - getRandIdx())); ///// jika tidak maka ///// ubah huruf sekarang ke integer ///// dikurangi banyak penggeseran huruf } else { intAcak[i] = (int)str.charAt(i) - getRandIdx(); } ///// jika penggeseran ke kanan maka } else { ///// jika > 122(z) maka ///// ubah huruf sekarang ke integer ///// ditambah banyak penggeseran huruf ///// dikurangi z(122) ditambah 96 if(((int)str.charAt(i) + getRandIdx()) > 122){ intAcak[i] = ((int)str.charAt(i) + getRandIdx() - 122) + 96; ///// jika tidak maka ///// ubah huruf sekarang ke integer ///// ditambah banyak penggeseran huruf } else { intAcak[i] = (int)str.charAt(i) + getRandIdx(); } } ///// jika bukan spasi maka ///// ubah hasil penggeseran ke char if(str.charAt(i) != ' ') charAcak[i] = (char)intAcak[i]; ///// jika tidak maka ///// huruf sekarang = spasi else charAcak[i] = str.charAt(i); ///// Jika level <= 5 maka ///// inisialisasi huruf ke charAcak } else{ charAcak[i] = str.charAt(i); } } ///// perulangan untuk pengacakan huruf ///// perulangan sebanyak panjang kata sekarang for(int i = 0; i < charAcak.length; i++){ ///// mengacak index dari 0 - panjang kata sekarang ///// menyimpan dalam idxA idxA = rand.nextInt(charAcak.length); ///// mengacak index dari 0 - panjang kata sekarang ///// menyimpan dalam idxB idxB = rand.nextInt(charAcak.length); ///// memanggil method tukar tukar(idxA, idxB); } } ///// mengambil nilai level sekarang protected int getLevel(){ return level; } ///// mengeset level sekarang protected void setLevel(int level){ this.level = level; } ///// mengambil nilai health sekarang protected int getHealth(){ return health; } ///// mengeset health sekarang protected void setHealth(int health){ this.health = health; } ///// mencetak garis protected String getLine(){ String strLine = ""; for(int i = 0; i < LINE; i++) strLine += "-"; return strLine; } ///// mengambil nilai cek protected boolean isCek() { return cek; } ///// mengeset cek protected void setCek(boolean cek) { this.cek = cek; } ///// mengambil nilai chLevel protected boolean isCheatLevel() { return chLevel; } ///// mengeset chLevel protected void setCheatLevel(boolean chLevel) { this.chLevel = chLevel; } ///// mengambil nilai chHealth protected boolean isCheatHealth() { return chHealth; } ///// mengeset chHealth protected void setCheatHealth(boolean chHealth) { this.chHealth = chHealth; } ///// method tukar() untuk menukar posisi kata private void tukar(){ ///// perulangan untuk menukar posisi kata for(int i = 0; i < arrAcak.length; i++){ ///// sama seperti pengacakan huruf ///// dengan bantuan variabel kosong untuk menukar nilai String temp = ""; ///// variabel untuk menukar nilai idxA = rand.nextInt(arrAcak.length); idxB = rand.nextInt(arrAcak.length); ///// var temp = kata di idxA ///// kata di idxA = kata di idxB ///// kata di idxB = var temp temp = temp.concat(arrAcak[idxA]); arrAcak[idxA] = arrAcak[idxB]; arrAcak[idxB] = temp; } } ///// method tukar() untuk menukar posisi kata private void tukar(int a, int b){ char c; ///// var c = huruf di idxA ///// huruf di idxA = huruf di idxB ///// huruf di idxB = var temp c = charAcak[a]; charAcak[a] = charAcak[b]; charAcak[b] = c; } } |
B. Kelas MainClass
package com.syabon.dev;
import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; ///// Kelas MainClass turunan dari kelas Anagram public class MainClass extends Anagram implements ActionListener, KeyListener { /////////////////////////////////////////////// ///// Deklarasi variabel /////////////////////////////////////////////// private JPanel PanelMain; ///// untuk panel private JButton Btn1; ///// menampilkan tombol 1 private JButton Btn2; ///// menampilkan tombol 2 private JButton Btn3; ///// menampilkan tombol 3 private JButton Btn4; ///// menampilkan tombol 4 private JButton Btn5; ///// menampilkan tombol 5 private JButton Btn6; ///// menampilkan tombol 6 private JButton Btn7; ///// menampilkan tombol 7 private JButton Btn8; ///// menampilkan tombol 8 private JButton Btn9; ///// menampilkan tombol 9 private JButton Btn10; ///// menampilkan tombol 10 private JButton BtnInfo; ///// menampilkan tombol info game private JButton BtnTemp; ///// tombol kosong private JButton BtnGanti; ///// tombol ganti private JLabel LblCek; ///// menampilkan acak huruf private JLabel LblLevel; ///// menampilkan level sekarang private JLabel LblHealth; ///// menampilkan health sekarang private JLabel LblCheat; ///// menampilkan label cheat private JLabel LblRand; ///// menampilakan label penggeseran private JLabel Line1, Line2; ///// menampilakan garis private JTextField TxtCheat; ///// menampilkan kotak cheat /////////////////////////////////////////////// ///// konstruktor MainClass public MainClass(int level, int health, String title){ ///// memanggil konstruktor super class super(level, health); PanelMain = new JPanel(); Btn1 = new JButton(); Btn2 = new JButton(); Btn3 = new JButton(); Btn4 = new JButton(); Btn5 = new JButton(); Btn6 = new JButton(); Btn7 = new JButton(); Btn8 = new JButton(); Btn9 = new JButton(); Btn10 = new JButton(); BtnInfo = new JButton(); BtnTemp = new JButton(); BtnGanti = new JButton(); Line1 = new JLabel(); Line2 = new JLabel(); LblCek = new JLabel(); LblRand = new JLabel(); LblLevel = new JLabel(); LblHealth = new JLabel(); LblCheat = new JLabel(); TxtCheat = new JTextField(); ///// method initFrameComponents untuk menampilkan frame dan komponen game initFrameComponents(title); } ///// method initFrameComponents() public void initFrameComponents(String title){ JFrame frame = new JFrame(); ///// memberi judul game frame.setTitle(title); ///// keluar dari game frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ///// set ukuran sesuai konstanta WIDTH dan HEIGHT frame.setSize(WIDTH, HEIGHT); ///// terlihat frame.setVisible(true); ///// tidak bisa di ubah ukuran windownya frame.setResizable(false); ///// set posisi game ke tengah window frame.setLocationRelativeTo(null); ///// frame di masukkan ke kontainer frame.getContentPane().setLayout(null); ///// set warna background PanelMain.setBackground(new Color(153, 153, 255)); ///// set Layout = null PanelMain.setLayout(null); ///// set ukuran Panel Main PanelMain.setBounds(0, 0, WIDTH, HEIGHT); ///// tambahkan Panel Main ke kontainer frame.getContentPane().add(PanelMain); ////////////////////////////////////////// //layout ////////////////////////////////////////// PanelMain.add(LblLevel); ///// menambahkan label level PanelMain.add(LblHealth); ///// menambahkan label health PanelMain.add(Line1); ///// menambahkan garis PanelMain.add(LblCek); ///// menambahkan label pengacakan huruf PanelMain.add(LblRand); ///// menambahkan penggeseran huruf PanelMain.add(LblCheat); ///// menambahkan label cheat PanelMain.add(TxtCheat); ///// menambahkan kotak cheat PanelMain.add(Line2); ///// menambahkan garis PanelMain.add(BtnInfo); ///// menambahkan tombol info game PanelMain.add(BtnGanti); ///// menambahkan tombol ganti kata acak for(int i = 0; i < 10; i++){///// perulangan untuk menampilakan tombol 1 - 10 switchBut(i); ///// memanggil method switchBut PanelMain.add(BtnTemp); ///// menambahkan hasil perulangan ke panel } ////////////////////////////////////////// ///// set text tombol info BtnInfo.setText("Info"); ///// set ukuran dan posisi tombol BtnInfo.setBounds(210, 185, 100, 30); ///// tambahkan Action Listener BtnInfo.addActionListener(this); ////////////////////////////////////////// ///// letak dan ukuran komponen ////////////////////////////////////////// BtnGanti.setText("[ Ganti ]"); BtnGanti.setBounds(410, 185, 90, 30); BtnGanti.addActionListener(this); LblLevel.setFont(new Font("Tahoma", 1, 15)); LblLevel.setBounds(10, 10, 100, 30); LblHealth.setFont(new Font("Tahoma", 1, 15)); LblHealth.setBounds(410, 10, 100, 30); Line1.setText(getLine()); ///// menampilkan garis Line1.setFont(new Font("Tahoma", 1, 15)); Line1.setBounds(10, 40, WIDTH, 10); Line2.setText(getLine()); ///// menampilkan garis Line2.setFont(new Font("Tahoma", 1, 15)); Line2.setBounds(10, 175, WIDTH, 10); LblCek.setFont(new Font("Tahoma", 1, 20)); LblCek.setBounds(25, 135, 200, 40); LblRand.setFont(new Font("Tahoma", 1, 15)); LblRand.setBounds(10, 190, 200, 20); ////////////////////////////////////////// ///// memanggil method cheat ///// tambahkan cheat jika diperlukan cheat(); ///// memanggil method buttonComponent ///// untuk set letak dan lain-lain buttonComponent(); ///// memanggil method initComponent ///// untuk memberi nilai initComponents(); } ///// method cheat public void cheat(){ LblCheat.setText("Cheat"); LblCheat.setFont(new Font("Tahoma", 1, 12)); LblCheat.setBounds(280, 140, 50, 30); TxtCheat.setFont(new Font("Tahoma", 1, 12)); TxtCheat.setBounds(330, 140, 170, 25); ///// jika dirasa memerlukan cheat ///// setEnabled = true TxtCheat.setEnabled(true); ///// menambahkan KeyListener TxtCheat.addKeyListener(this); } ///// method buttonComponent ///// untuk menambahkan tombol 1 - 10 dan aksinya public void buttonComponent(){ int xx = 90; int yy = 30; int idx = 0; for(int y = 60; y <= 100; y += 40){ for(int x = 10; x <= 410; x += 100, idx++){ switchBut(idx); BtnTemp.setBounds(x, y, xx, yy); BtnTemp.addActionListener(this); } } } ///// method initComponents ///// method ini akan selalu dipanggil ///// jika naik level, salah tombol dan lain-lain public void initComponents(){ cekChoice(); setComponent(); } ///// method cekChoice() untuk mengecek pilihan ///// method ini akan dieksekusi jika game selesai public void cekChoice(){ ///// jika level == 10 atau health == 0 maka if((getLevel() > kata.length*2) || (getHealth() < 1)){ ///// lakukan perulangan jika user memilih opsi cancel atau close for(int cek = JOptionPane.CANCEL_OPTION; cek == JOptionPane.CANCEL_OPTION || cek == JOptionPane.CLOSED_OPTION;){ cek = JOptionPane.showConfirmDialog(null, "Restart?", "Game Selesai", JOptionPane.YES_NO_CANCEL_OPTION); ///// jika opsi ya maka if(cek == JOptionPane.YES_OPTION){ setLevel(1); ///// set level = 1 setHealth(3); ///// set health = 3 setCek(true); ///// set peringatan = true setCheatLevel(true); ///// set cheat level = true setCheatHealth(true); ///// set cheat health = true ///// jika opsi tidak maka } else if(cek == JOptionPane.NO_OPTION){ ///// tampilkan pesan JOptionPane.showMessageDialog(null, "Terima Kasih telah bermain..", "syabon-dev.blogspot.com", JOptionPane.INFORMATION_MESSAGE); ///// keluar dari game System.exit(0); } } } } ///// method setComponent() public void setComponent(){ int levelIdx = 1; ///// jika level > 5 maka if(getLevel() > 5){ ///// jika peringatan belum ditampilkan maka if(isCek()){ JOptionPane.showMessageDialog(null, "Untuk level 6 ke atas ditambah penyandian huruf !!"); setCek(false); } ///// lakukan penyandian huruf levelIdx = 6; setCurrIdx(1000); LblRand.setText("Geser ke "+ getMovePos() + " " + getRandIdx()); ///// jika tidak label penyandian = null } else { LblRand.setText(null); } ///// mengambil array di level sekarang setCurrIdx(kata[getLevel() - levelIdx]); ///// mengacak kata yang akan ditampilkan setKataAcak(kata[getLevel() - levelIdx][getCurrIdx()]); ///// mengacak posisi huruf setAcakHuruf(getKataAcak()); ///// penggeseran huruf setCurrIdx(getKataAcak()); ///// menampilkan level sekarang LblLevel.setText("Level : " + String.valueOf(getLevel())); ///// menampilkan health sekarang LblHealth.setText("Health : " + String.valueOf(getHealth())); ///// tampilkan huruf acak LblCek.setText(getAcakHuruf()); TxtCheat.setText(null); ///// menampilkan kata acak di tombol untuk level sekarang for(int i = 0; i < 10; i++){ switchBut(i); BtnTemp.setText(getArrAcak()[i]); } } ///// method switchBut akan mengecek tombol yang ditekan public void switchBut(int i){ switch(i){ case 0: BtnTemp = Btn1; break; case 1: BtnTemp = Btn2; break; case 2: BtnTemp = Btn3; break; case 3: BtnTemp = Btn4; break; case 4: BtnTemp = Btn5; break; case 5: BtnTemp = Btn6; break; case 6: BtnTemp = Btn7; break; case 7: BtnTemp = Btn8; break; case 8: BtnTemp = Btn9; break; case 9: BtnTemp = Btn10; break; } } ///// method test untuk aksi jika tombol 1 - 10 ditekan public void test(JButton btn){ ///// jika tombol == kata yang di acak maka if(btn.getText().equals(getKataAcak())){ ///// tampilkan pesan benar JOptionPane.showMessageDialog(null, "Tebakan Benar" ,"Anagram (Acak Kata)", JOptionPane.INFORMATION_MESSAGE); ///// level naik 1 setLevel(getLevel() + 1); ///// panggil method initComponents initComponents(); ///// jika tidak sama maka } else { ///// tampilkan pesan salah dan tampilakan kata yang benar JOptionPane.showMessageDialog(null, "Tebakan Salah\n" + "--------------------------------------\nKata Acak : " + getKataAcak() , "Anagram (Acak Kata)", JOptionPane.ERROR_MESSAGE); ///// health - 1 setHealth(getHealth() - 1); ///// panggil method initComponents initComponents(); } } @Override public void actionPerformed(ActionEvent evt){ for(int i = 0; i < 10; i++){ ///// method switchBut akan mengecek tombol yang ditekan ///// gunakan perulangan untuk mengecek 1 per 1 ///// hasil tombol yang ditekan dimisalkan BtnTemp switchBut(i); ///// pengecekan tombol if(evt.getSource() == BtnTemp) ///// panggil method test test(BtnTemp); } ///// Jika tombol info ditekan ///// tampilkan informasi game if(evt.getSource() == BtnInfo) { JOptionPane.showMessageDialog(null, "Dibuat oleh : Ahmad Sya'bani\n"+ "----------------------------------------------\n" + "syabon-dev.blogspot.com", "Anagram Info", JOptionPane.INFORMATION_MESSAGE); } ///// Jika tombol ganti ditekan ///// initComponents if(evt.getSource() == BtnGanti){ initComponents(); } } @Override public void keyPressed(KeyEvent evt) { ///// jika menekan enter if(evt.getKeyCode() == KeyEvent.VK_ENTER){ ///// jika text == cheatHealth maka if(TxtCheat.getText().equals(cheatHealth)){ ///// jika cheat Health belum digunakan / true if(isCheatHealth()){ ///// setHealth = 3 setHealth(3); ///// set cheat health menjadi false / sudah digunakan setCheatHealth(false); ///// memanggil method initComponents() initComponents(); ///// jika tidak } else { ///// tampilkan pesan JOptionPane.showMessageDialog(null, "Cheat tidak bisa digunakan lagi !!"); TxtCheat.setText(null); } ///// jika text == cheatLevel maka } else if (TxtCheat.getText().equals(cheatLevel)){ ///// jika cheat Level belum digunakan / true if(isCheatLevel()){ ///// level + 1 setLevel(getLevel() + 1); ///// set cheat level menjadi false / sudah digunakan setCheatLevel(false); ///// memanggil method initComponents() initComponents(); ///// jika tidak maka } else{ ///// tampilkan pesan JOptionPane.showMessageDialog(null, "Cheat tidak bisa digunakan lagi !!"); TxtCheat.setText(null); } } } } @Override public void keyReleased(KeyEvent evt) {} @Override public void keyTyped(KeyEvent evt) {} public static void main(String[] args){ ///// jika diperlukan set menjadi true JFrame.setDefaultLookAndFeelDecorated(false); ///// memberi nilai awal konstruktor new MainClass(1, 3, "Anagram (Acak Kata) v.2"); } } |
Keterangan:
: package disesuaikan dengan kebutuhan
: opsional jika diperlukan untuk testing dan debuging
: penjelasan
Banyak ya source codenya, tenang saja untuk download source codenya bisa klik link download di bawah ini. Selain dalam bahasa Java, juga terdapat source code dalam bahasa C:
0 komentar:
Posting Komentar