Browser tidak support SVG
Info
Selamat datang di Syabon-dev ....
Rabu, 27 Agustus 2014



     Kali ini aku akan membuat game sederhana seperti gambar di atas yaitu Tic Tac Toe. Sebelumnya aku membuat konsep untuk GUI nya sebagai berikut:


Keterangan:
- Panel utara    : akan diisi oleh komponen menu game dengan layout FlowLayout
- Panel tengah  : akan diisi oleh papan tombol 1 - 9 dengan layout GridLayout
- Panel selatan : akan diisi oleh label pemain dengan layout FlowLayout
Untuk layout utamanya, aku menggunakan layout BorderLayout agar mudah dalam penempatan komponen.


Source Code
     Untuk membuat game ini aku membuat 3 kelas yaitu Kelas GameFrames, GameObjects dan TicTacToeGame.


A. Kelas GameFrames
package com.syabon.dev;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

///// kelas GameFrames
public class GameFrames{

    ///////////////////////////////////////////////
    ///// Deklarasi komponen
    ///////////////////////////////////////////////

    protected JFrame frame; ///// frame game
    protected Container contentPane; ///// kontainer untuk meletakkan panel
    protected JPanel pnlNorth; ///// untuk meletakkan komponen menu bar
    protected JPanel pnlCenter; ///// untuk meletakkan komponen button 1-9
    protected JPanel pnlSouth; ///// untuk meletakkan label giliran permainan
    protected JMenuBar menuBar; ///// menu bar
    protected JMenu menu; ///// untuk meletakkan menu
    protected JMenuItem itemReset; ///// untuk reset game
    protected JMenuItem itemInfo; ///// untuk info game
    protected JMenuItem itemExit; ///// untuk keluar game
    protected JButton btn1; ///// tombol 1
    protected JButton btn2; ///// tombol 2
    protected JButton btn3; ///// tombol 3
    protected JButton btn4; ///// tombol 4
    protected JButton btn5; ///// tombol 5
    protected JButton btn6; ///// tombol 6
    protected JButton btn7; ///// tombol 7
    protected JButton btn8; ///// tombol 8
    protected JButton btn9; ///// tombol 9
    protected JButton btnTemp; ///// tombol kosong
    protected JLabel lblTurn; ///// label giliran permainan
    ///////////////////////////////////////////////
   
    public GameFrames(String title) {
        ///// set judul game
        frame = new JFrame(title);
        ///// mendapatkan container dari awt
        contentPane = frame.getContentPane();
       
        ///// method panelComponent untuk komponen panel
        panelComponent();
        ///// method menuComponent untuk komponen menu
        menuComponent();
        ///// method buttonComponent untuk komponen tombol

        buttonComponent();
        ///// method labelComponent untuk komponen label

        labelComponent();
    }

    ///// method menuComponent

    protected void menuComponent() {
        ///// menuBar untuk meletakkan menu utama

        menuBar = new JMenuBar();
       
        ///// menu utama (File)

        menu = new JMenu("File");
        ///// shortcut menu Alt+F

        menu.setMnemonic(KeyEvent.VK_F);
        ///// tooltip saat pointer menunjuk menu utama

        menu.setToolTipText("Menu pilihan...");
       
        ///// menu reset game

        itemReset = new JMenuItem("Reset", 1);
        ///// shortcut reset game Alt+R

        itemReset.setMnemonic(KeyEvent.VK_R);
        ///// tooltip saat pointer menunjuk menu reset

        itemReset.setToolTipText("Reset Game");
       
        ///// menu info game

        itemInfo = new JMenuItem("Info", 2);
        ///// shortcut info game Alt+I

        itemInfo.setMnemonic(KeyEvent.VK_I);
        ///// tooltip saat pointer menunjuk menu info

        itemInfo.setToolTipText("Info Game");
       
        ///// menu exit game

        itemExit = new JMenuItem("Exit", 3);
        ///// shortcut exit game Alt+E

        itemExit.setMnemonic(KeyEvent.VK_E);
        ///// tooltip saat pointer menunjuk menu exit

        itemExit.setToolTipText("Exit Game");
    }

    ///// method buttonComponent

    protected void buttonComponent() {
        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();
        btnTemp = new JButton();
    }
   
    ///// method labelComponent

    protected void labelComponent() {
        lblTurn = new JLabel();
    }
   
    ///// method panelComponent

    protected void panelComponent() {
        pnlNorth = new JPanel();
        pnlCenter = new JPanel();
        pnlSouth = new JPanel();
    }
   
    ///// method launchFrame

    public void launchFrame(){
        ///// panel utara

        panelNorth();
        ///// panel tengah

        panelCenter();
        ///// panel selatan

        panelSouth();
       
        ///// menambahkan panel ke kontainer

        contentPane.add(pnlNorth, BorderLayout.NORTH);
        contentPane.add(pnlCenter, BorderLayout.CENTER);
        contentPane.add(pnlSouth, BorderLayout.SOUTH);
       
        ///// tidak bisa dirubah ukuran window nya

        frame.setResizable(false);
        ///// set ukuran 300x300

        frame.setSize(300, 300);
        ///// terlihat

        frame.setVisible(true);
    }

    ///// method panelNorth

    protected void panelNorth() {
        ///// set panel layout dengan flow layout
        ///// align = left
        ///// hgap = vgap = 3

        pnlNorth.setLayout(new FlowLayout(FlowLayout.LEFT, 3, 3));
        ///// tambahkan menu reset ke menu utama

        menu.add(itemReset);
        ///// tambahkan menu info ke menu utama

        menu.add(itemInfo);
        ///// tambahkan menu exit ke menu utama

        menu.add(itemExit);
        ///// tambahkan menu utama ke menu bar

        menuBar.add(menu);
        ///// tambahkan menu bar ke panel utara

        pnlNorth.add(menuBar);
    }

    ///// method panelCenter

    protected void panelCenter() {
        ///// set panel layout dengan grid layout
        ///// ukuran 3x3
        ///// hgap = vgap = 3

        pnlCenter.setLayout(new GridLayout(3, 3, 3, 3));
        ///// warna background = 238, 238, 238(R,G,B)

        pnlCenter.setBackground(new Color(238, 238, 238));
        ///// tambahkan tombol 1 - 9 ke panel tengah

        pnlCenter.add(btn1);
        pnlCenter.add(btn2);
        pnlCenter.add(btn3);
        pnlCenter.add(btn4);
        pnlCenter.add(btn5);
        pnlCenter.add(btn6);
        pnlCenter.add(btn7);
        pnlCenter.add(btn8);
        pnlCenter.add(btn9);
    }

    ///// method panelSouth

    protected void panelSouth() {
        ///// set panel layout dengan flow layout
        ///// align = center

        pnlSouth.setLayout(new FlowLayout(FlowLayout.CENTER));
        ///// tambahkan label giliran ke panel selatan

        pnlSouth.add(lblTurn);
    }
}

B. Kelas GameObjects
package com.syabon.dev;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JOptionPane;

///// kelas GameObjects turunan kelas GameFrames dan mengimplementasikan ActionListener

public class GameObjects extends GameFrames implements ActionListener{

    ///////////////////////////////////////////////
    ///// Deklarasi variabel
    ///////////////////////////////////////////////
    ///// player sekarang

    protected int player = 1;
    ///// ganti giliran

    protected boolean changeTurn = false;
    ///// cek menang

    protected boolean win = false;
    ///// judul game

    protected String title;
    ///////////////////////////////////////////////

   
    ///// konstruktor GameObjects

    protected GameObjects(String title) {
        ///// konstruktor super class

        super(title);
        this.title = title;
    }
   
    ///// method setComponent

    protected void setComponent(){
        ///// untuk mereset komponen

        resetComponent();       
        ///// untuk mengganti giliran

        changeTurnPlayer();
    }
   
    ///// method resetComponent

    protected void resetComponent(){
        ///// set player sekarang = player 1

        setPlayer(1);
        ///// set menang = salah

        setWin(false);
        ///// set ganti giliran = salah

        setChangeTurn(false);
       
        ///// perulangan untuk set tombol 1 - 9
        ///// gunakan tombol kosong untuk mencetak satu per satu

        for(int i = 0; i < 9; i++){
            ///// mengecek tombol sekarang

            switchButton(i);
            ///// set tombol sekarang = ""

            btnTemp.setText("");
        }
    }
   
    ///// method changeTurnPlayer

    protected void changeTurnPlayer() {
        ///// variabel playerTurn untuk mencetak player sekarang

        String playerTurn;
       
        ///// jika player 1 maka

        if(getPlayer() == 1)
            ///// variabel playerTurn = "one"

            playerTurn = "one";
        ///// jika tidak maka

        else
            ///// variabel playerTurn = "two"

            playerTurn = "two";
       
        //// set label giliran sekarang

        lblTurn.setText("Player " + playerTurn + "s' turn");
    }

    ///// method eventComponent

    protected void eventComponent() {
        ///// perulangan untuk menambahkan Action Listener

        for(int i = 0; i < 9; i++){
            ///// mengecek tombol sekarang

            switchButton(i);
            ///// tambahkan Action Listener untuk tombol sekarang

            btnTemp.addActionListener(this);
        }
       
        ///// tambahkan Action Listener untuk menu reset

        itemReset.addActionListener(this);
        ///// tambahkan Action Listener untuk menu info

        itemInfo.addActionListener(this);
        ///// tambahkan Action Listener untuk menu exit

        itemExit.addActionListener(this);
       
        ///// Listener jika menekan exit

        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent evt){
                ///// keluar dari game

                System.exit(0);
            }
        });
    }
   
    ///// method switchButton

    protected void switchButton(int index){
        switch(index){
            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;
        }
    }
   
    ///// get nilai player

    protected int getPlayer() {
        return player;
    }

    ///// set nilai player

    protected void setPlayer(int player) {
        this.player = player;
    }
   
    ///// ganti giliran

    protected boolean isChangeTurn() {
        return changeTurn;
    }

    ///// set ganti giliran

    protected void setChangeTurn(boolean changeTurn) {
        this.changeTurn = changeTurn;
    }
   
    ///// menang

    protected boolean isWin(){
        return win;
    }
   
    ///// set menang

    protected void setWin(boolean win){
        this.win = win;
    }
   
    //// set menang

    protected void setWin(JButton btn1, JButton btn2, JButton btn3){
        ///// jika btn1 = btn2 = btn3
        ///// dan tidak kosong atau "" maka

        if(btn1.getText().equals(btn2.getText()) &&
        btn2.getText().equals(btn3.getText()) &&
        !btn1.getText().equals("")){
            ///// menang = true

            win = true;
        }
    }
   
    ///// method isNoMoreRoom

    protected boolean isNoMoreRoom(){
        ///// variabel untuk mengecek tombol jika sudah penuh

        boolean cek = true;
       
        ///// perulangan mengecek tombol 1 - 9

        for(int i = 0;i < 9; i++){
            switchButton(i);
            ///// jika tombol sekarang kosong maka

            if(btnTemp.getText().equals("")){
                ///// cek = false/salah

                cek = false;
            }
        }
       
        ///// kembalikan nilai cek

        return cek;
    }
   
    ///// method checkStatus

    protected void checkStatus(){       
        ///// cek tombol mendatar

        checkHorizontal();
        ///// cek tombol lurus

        checkVertical();
        ///// cek tombol miring

        checkDiagonal();
       
        ///// jika menang = true
        ///// atau tombol sudah penuh

        if(isWin() || isNoMoreRoom()){
            ///// variabel playerWin untuk pemenang

            String playerWin;
           
            ///// jika ganti giliran = true maka

            if(isChangeTurn())
                ///// player menang = "one"

                playerWin = "one";
            //// jika tidak maka

            else
                ///// player menang = "two"

                playerWin = "two";
           
            ///// tampilkan pemenang

            JOptionPane.showMessageDialog(null, "player " + playerWin + "s' win");
            ///// set komponen

            setComponent();
        }
    }

    ///// method checkHorizontal
    ///// mengecek tombol mendatar

    protected void checkHorizontal() {
        ///// cek tombol 1, 2, 3

        setWin(btn1, btn2, btn3);
        ///// cek tombol 4, 5, 6

        setWin(btn4, btn5, btn6);
        ///// cek tombol 7, 8, 9

        setWin(btn7, btn8, btn9);
    }

    ///// method checkVertical
    ///// mengecek tombol tegak

    protected void checkVertical() {
        ///// cek tombol 1, 4, 7

        setWin(btn1, btn4, btn7);
        ///// cek tombol 2, 5, 8

        setWin(btn2, btn5, btn8);
        ///// cek tombol 3, 6, 9

        setWin(btn3, btn6, btn9);
    }

    ///// method checkDiagonal
    ///// mengecek tombol miring

    protected void checkDiagonal() {
        ///// cek tombol 1, 5, 9

        setWin(btn1, btn5, btn9);
        ///// cek tombol 3, 5, 7

        setWin(btn3, btn5, btn7);
    }
   
    ///// method actionPerformed

    @Override
    public void actionPerformed(ActionEvent evt) {
        ///// mengecek tombol yang ditekan

        for(int i = 0; i < 9; i++){
            switchButton(i);
            ///// jika tombol yang ditekan sama dengan tombol sekarang maka

            if(evt.getSource() == btnTemp){
                ///// jika tombol sekarang belum digunakan maka

                if(btnTemp.getText() == ""){
                    ///// jika player 1 dan belum ganti giliran maka

                    if(getPlayer() == 1 && !isChangeTurn()){
                        ///// set Tombol sekarang dengan X

                        btnTemp.setText("X");
                        ///// set player = 2

                        setPlayer(2);
                        ///// ganti giliran

                        setChangeTurn(true);
                        ///// panggil method ganti giliran

                        changeTurnPlayer();
                    ///// jika tidak maka atau giliran player 2

                    } else {
                        ///// set Tombol sekarang dengan O

                        btnTemp.setText("O");
                        ///// set player = 1

                        setPlayer(1);
                        ///// ganti giliran

                        setChangeTurn(false);
                        ///// panggil method ganti giliran

                        changeTurnPlayer();
                    }
                }
                ///// panggil method checkStatus sekarang

                checkStatus();
            }
        }
       
        ///// jika menu reset maka

        if(evt.getSource() == itemReset){
            //// panggil method setComponent
            //// atau mereset kembali komponen

            setComponent();
        }
       
        ///// jika menu info maka tampilkan info game

        if(evt.getSource() == itemInfo){
            JOptionPane.showMessageDialog(null, "Dibuat oleh : Ahmad Sya'bani\n"+
            "----------------------------------------------\n" +
            "syabon-dev.blogspot.com", title, JOptionPane.INFORMATION_MESSAGE);
        }
       
        ///// jika menu exit maka

        if(evt.getSource() == itemExit){
            ///// keluar dari game

            System.exit(0);
        }
    }
}

C. Kelas TicTacToeGame
package com.syabon.dev;

///// kelas TicTacToeGame turunan dari kelas GameObjects

public class TicTacToeGame extends GameObjects{
   
    ///// konstruktor TicTacToeGame

    public TicTacToeGame(String title) {
        ///// konstruktor super class

        super(title);
        ///// set seluruh komponen

        setComponent();
        ///// panggil eventComponent

        eventComponent();
    }
   
    public static void main(String[] args) {
        ///// memberi nilai konstruktor dan memanggil method launchFrame

        new TicTacToeGame("Tic Tac Toe").launchFrame();
    }
}

Keterangan:
            : package disesuaikan kebutuhan
            : penjelasan dari source code

Untuk source codenya dapat download link di bawah ini:
Tic Tac Toe Game
Next
This is the most recent post.
Previous
Posting Lama

2 komentar: