Akhirnya kelar sudah lanjutan artikel Program Dasar Game Tic Tac Toe dengan Java AWT ini. Artikel ini bukan sambungannya lho... tapi perkembangannya... istilah kerennya : beda level! hehehe. Sebelum dilanjoootttt... mau minta maaf dulu soalnya source codenya acak-acakan karena desain web-nya kurang (eh yang desain orang lain lho) ;)
Oke kelengkapan yang dikembangkan dari program dasar sebelumnya :
- new game
- skor
- pop up message (message box gitu loh)
- milih X atau O
- artificial intelligence / kecerdasan buatan (manusia vs komputer)
- status bar
- menu bar
Program masih dalam tampilan standar, pop message masih menggunakan Java AWT dan pakai class MsgBox buatan Real's How To. Class ini untuk menampilkan pop up message. Kemudian untuk AI-nya atawa kecerdasan buatan masih pakai fungsi random (acak) jadi kalau main lawan komputer bego hihihi. Menu dan Status juga masih sederhana bin simpel.
Untuk kecerdasan buatan atau artificial intelligence pada permainan tic tac toe, pada umumnya menggunakan algoritma kecerdasan buatan yang biasa digunakan pada permainan catur yaitu algoritma Alpha-Beta atau MinMax, yang termasuk kategori algoritma pencarian. Namun algoritma pencarian tersebut tidak diterapkan pada program ini.
Yuk liat source code-nya :
/*
* TikTakTuk3.java
*
* Created on November 8, 2011, 12:49 PM
*
* Author : ilmubiner
import java.awt.*;
import java.awt.event.*;
public class TikTakTuk3 extends Frame implements ActionListener {
Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9;
String giliran, pemain;
int modeMain, skorX, skorO;
Panel pnlBtn = new Panel(); // kontainer utk Button
Label lblStatus = new Label(); // utk menampilkan status
MenuBar mnuBar = new MenuBar(); // kontainer utk Menu
Menu mnuGame = new Menu("Permainan");
Menu mnuNew = new Menu("Baru");
MenuItem mnuPvsP = new MenuItem("Manusia vs Manusia");
MenuItem mnuPvsC = new MenuItem("Manusia vs Komputer");
MenuItem mnuExit = new MenuItem("Keluar");
MsgBox pesan, pil;
boolean menang = false;
// konstruktor
public TikTakTuk3() {
super.setTitle("TikTakTuk v3");
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setMenuBar(mnuBar); //pasang objek MenuBar pd Frame
mnuBar.add(mnuGame); //pasang objek Menu pd MenuBar
mnuGame.add(mnuNew); //pasang objek (sub) Menu pd Menu
mnuPvsP.addActionListener(this); //registrasi ActionListener
mnuNew.add(mnuPvsP); //pasang objek MenuItem pd (sub) Menu
mnuPvsC.addActionListener(this); //registrasi ActionListener
mnuNew.add(mnuPvsC); //pasang objek MenuItem pd (sub) Menu
mnuGame.addSeparator(); //menambahkan garis pemisah horizontal
mnuExit.addActionListener(this); //registrasi ActionListener
mnuGame.add(mnuExit); // pasang objek MenuItem pd (sub) Menu
pnlBtn.setLayout(new GridLayout(3, 3)); // menentukan layout
btn1 = new Button(); // membuat objek Button
btn1.setFont(new Font("Dialog", 2, 40)); // mengubah font
btn1.addActionListener(this); // registrasi ActionListener
pnlBtn.add(btn1); // menambahkan Button ke Panel
btn2 = new Button();
btn2.setFont(new Font("Dialog", 2, 40));
btn2.addActionListener(this);
pnlBtn.add(btn2);
btn3 = new Button();
btn3.setFont(new Font("Dialog", 2, 40));
btn3.addActionListener(this);
pnlBtn.add(btn3);
btn4 = new Button();
btn4.setFont(new Font("Dialog", 2, 40));
btn4.addActionListener(this);
pnlBtn.add(btn4);
btn5 = new Button();
btn5.setFont(new Font("Dialog", 2, 40));
btn5.addActionListener(this);
pnlBtn.add(btn5);
btn6 = new Button();
btn6.setFont(new Font("Dialog", 2, 40));
btn6.addActionListener(this);
pnlBtn.add(btn6);
btn7 = new Button();
btn7.setFont(new Font("Dialog", 2, 40));
btn7.addActionListener(this);
pnlBtn.add(btn7);
btn8 = new Button();
btn8.setFont(new Font("Dialog", 2, 40));
btn8.addActionListener(this);
pnlBtn.add(btn8);
btn9 = new Button();
btn9.setFont(new Font("Dialog", 2, 40));
btn9.addActionListener(this);
pnlBtn.add(btn9);
this.setLayout(new BorderLayout(5, 5));
add(pnlBtn, BorderLayout.CENTER);
add(lblStatus, BorderLayout.SOUTH);
modeMain = 0; // 0 = blm ada mode, 1 = human vs human, 2 = human vs computer
skorX = 0;
skorO = 0;
//giliran = "X";
lblStatus.setText("Skor : X = " + skorX + " , O = " + skorO + " , giliran = " +
giliran);
btnEnabled(false);
}
public void actionPerformed(ActionEvent e) {
Boolean ganti = false;
/// awal : kontrol pemilihan MenuItem
String label = e.getActionCommand();
if (label.equals("Manusia vs Manusia")) {
menang = false;
resetSkor(1);
pilGacoan(1);
} else if (label.equals("Manusia vs Komputer")) {
menang = false;
resetSkor(2);
pilGacoan(2);
if (giliran.equals("X") && pemain.equals("K")) {
komputerJalan();
}
} else if (label.equals("Keluar")) {
System.exit(0);
}
/// akhir : kontrol pemilihan MenuItem
/// awal : deteksi Button yg diklik & pengecekan label pd Button
// ganti = true : flag utk menunjukkan ada perubahan pd label Button
// label Button yg sdh berisi tidak dapat diubah lagi labelnya
if (e.getSource() == btn1 && btn1.getLabel().equals("")) {
btn1.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn2 && btn2.getLabel().equals("")) {
btn2.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn3 && btn3.getLabel().equals("")) {
btn3.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn4 && btn4.getLabel().equals("")) {
btn4.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn5 && btn5.getLabel().equals("")) {
btn5.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn6 && btn6.getLabel().equals("")) {
btn6.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn7 && btn7.getLabel().equals("")) {
btn7.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn8 && btn8.getLabel().equals("")) {
btn8.setLabel(giliran);
ganti = true;
} else if (e.getSource() == btn9 && btn9.getLabel().equals("")) {
btn9.setLabel(giliran);
ganti = true;
}
/// akhir : deteksi Button yang diklik dan pengecekan label pd Button
if (pemain.equals("M")||pemain.equals("-")) cekMenangSeri();
if (ganti == true) {
if (giliran.equals("X")) giliran = "O"; else giliran = "X";
if (pemain.equals("M")) pemain = "K"; else pemain = "M";
}
lblStatus.setText("Skor : X = " + skorX + " , O = " + skorO + " , giliran = " +
giliran);
if (ganti==true && pemain.equals("K") && menang == false){
komputerJalan();
cekMenangSeri();
}
}
void resetSkor(int modeSkrg) {
if (modeMain != modeSkrg) {
skorX = 0;
skorO = 0;
} else {
MsgBox tanya = new MsgBox(this, "Reset skor?", true);
if (tanya.isOk) {
skorX = 0;
skorO = 0;
}
}
modeMain = modeSkrg;
btnClear();
btnEnabled(true);
}
void btnEnabled(boolean ss) {
btn1.setEnabled(ss);
btn2.setEnabled(ss);
btn3.setEnabled(ss);
btn4.setEnabled(ss);
btn5.setEnabled(ss);
btn6.setEnabled(ss);
btn7.setEnabled(ss);
btn8.setEnabled(ss);
btn9.setEnabled(ss);
}
void btnClear() {
btn1.setLabel("");
btn2.setLabel("");
btn3.setLabel("");
btn4.setLabel("");
btn5.setLabel("");
btn6.setLabel("");
btn7.setLabel("");
btn8.setLabel("");
btn9.setLabel("");
}
void pilGacoan(int n){
if (n==1){
MsgBox pil = new MsgBox(this, "Pemain pertama memilih X ??", true);
if (pil.isOk) giliran = "X";
else giliran = "O";
pemain = "-";
} else if (n==2){
int x = ((int)(Math.random()*1)) + 1; // menentukan Manusia atau Komputer jalan duluan
if (x==1){
MsgBox pil = new MsgBox(this, "Manusia jalan duluan.\nManusia memilih X ??", true);
if (pil.isOk) giliran = "X";
else giliran = "O";
pemain = "M";
} else {
MsgBox pil = new MsgBox(this, "Komputer jalan duluan.\nKomputer memilih X.", true);
giliran = "X";
pemain = "K";
}
}
}
void cekMenangSeri(){
/// awal : pengecekan menang atau seri
// tiga Button di setiap baris, kolom, & diagonal dicek apakah memiliki label ygsama
// jika tiga Button sebaris / sekolom / sediagonal, labelnya sama berarti pemain menang
if ((btn1.getLabel().equals(giliran) && btn2.getLabel().equals(giliran) &&
btn3.getLabel().equals(giliran))
|| (btn4.getLabel().equals(giliran) && btn5.getLabel().equals(giliran) &&
btn6.getLabel().equals(giliran))
|| (btn7.getLabel().equals(giliran) && btn8.getLabel().equals(giliran) &&
btn9.getLabel().equals(giliran))
|| (btn1.getLabel().equals(giliran) && btn4.getLabel().equals(giliran) &&
btn7.getLabel().equals(giliran))
|| (btn2.getLabel().equals(giliran) && btn5.getLabel().equals(giliran) &&
btn8.getLabel().equals(giliran))
|| (btn3.getLabel().equals(giliran) && btn6.getLabel().equals(giliran) &&
btn9.getLabel().equals(giliran))
|| (btn1.getLabel().equals(giliran) && btn5.getLabel().equals(giliran) &&
btn9.getLabel().equals(giliran))
|| (btn3.getLabel().equals(giliran) && btn5.getLabel().equals(giliran) &&
btn7.getLabel().equals(giliran))) {
MsgBox msgBox = new MsgBox(this, giliran + " menang!!", false);
menang = true;
btnEnabled(false);
if (giliran.equals("X")) {
++skorX;
} else {
++skorO;
}
} else if (!btn1.getLabel().equals("")&&!btn2.getLabel().equals("")
&& !btn3.getLabel().equals("")
&& !btn4.getLabel().equals("")
&& !btn5.getLabel().equals("")
&& !btn6.getLabel().equals("")
&& !btn7.getLabel().equals("")
&& !btn8.getLabel().equals("")
&& !btn9.getLabel().equals("")) {
MsgBox msgBox = new MsgBox(this, "Seri!!!", false);
}
/// akhir : pengecekan menang atau seri
}
void komputerJalan(){
/// awal : kecerdasan buatan
if (modeMain==2 && pemain.equals("K")){
boolean ada = true;
do {
int posBtn = ((int)(Math.random()*8)) + 1;
switch (posBtn){
case 1:
if (btn1.getLabel().equals("")) { btn1.setLabel(giliran); ada =
false; }
break;
case 2:
if (btn2.getLabel().equals("")) { btn2.setLabel(giliran); ada =
false; }
break;
case 3:
if (btn3.getLabel().equals("")) { btn3.setLabel(giliran); ada =
false; }
break;
case 4:
if (btn4.getLabel().equals("")) { btn4.setLabel(giliran); ada =
false; }
break;
case 5:
if (btn5.getLabel().equals("")) { btn5.setLabel(giliran); ada =
false; }
break;
case 6:
if (btn6.getLabel().equals("")) { btn6.setLabel(giliran); ada =
false; }
break;
case 7:
if (btn7.getLabel().equals("")) { btn7.setLabel(giliran); ada =
false; }
break;
case 8:
if (btn8.getLabel().equals("")) { btn8.setLabel(giliran); ada =
false; }
break;
case 9:
if (btn9.getLabel().equals("")) { btn9.setLabel(giliran); ada =
false; }
break;
default :
}
} while (ada==true);
if (giliran.equals("X")) giliran = "O"; else giliran = "X";
if (pemain.equals("M")) pemain = "K"; else pemain = "M";
lblStatus.setText("Skor : X = " + skorX + " , O = " + skorO + " , giliran = "
+ giliran);
}
/// akhir : kecerdasan buatan
}
public static void main(String[] args) {
TikTakTuk3 frm = new TikTakTuk3();
frm.setSize(300, 365);
frm.setVisible(true);
}
}
Update Contact :
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email : Fajarudinsidik@gmail.com
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email: Fajarudinsidik@gmail.com
atau Kirimkan Private messanger melalui email dengan klik tombol order dibawah ini :