Belajar Membuat Game Tic Tac Toe Simpel Dengan Java

Membuat game Tic Tac Toe dengan Java dapat dilakukan dengan metode pemrograman berorientasi objek. Terkadang belajar Java bagi pemula bisa menjadi hal yang sulit, terutama dalam penerapan algoritmanya.

Oleh karena itu dengan memahaminya melalui pembuatan game sederhana tanpa GUI ini, diharapkan bisa menambah pemahaman anda mengenai Java programming.


game_tic_tac_toe_java

Aturan dari permainan ini adalah:
  • Terdiri dari dua player di mana masing-masing player menggunakan karakter x atau o.
  • Papan Tic tac toe terdiri dari 9 kotak kosong saat game dimulai 
  • Pemenangnya adalah player yang lebih dulu bisa menempatkan karakter yang digunakan dalam posisi kotak vertikal, horizontal maupun diagonal. 
  • Jika tidak ada pemenang dan papan sudah terisi penuh maka permainan berakhir draw.



Bila anda perhatikan, array dua dimensi ukuran 3 x 3 bisa merepresentasikan data pada papan Tic tac toe tersebut, seperti gambar di bawah ini:

array_2D_java_tic_tac_toe

Mulai Membuat Game Tic Tac Toe

Program game Tic Tac Toe yang dibuat dengan program Java ini terdiri dari 2 class,  yaitu class MyTicTacToe dan class TestGame untuk mendemonstrasikan.

Permainan ini dimainkan oleh 2 pemain, masing-masing memilih karakter x atau o. Karakter yang dimainkan itu disimpan dalam array dua dimensi.

Pada line 14-18, status game yaitu game ketika ada pemenang, draw ataupun sedang berjalan dikelompokkan dalam enum. Dalam program java, enum adalah list dari constant-constant.

Pada line 22 - 48 adalah konstruktor dari objek class MyTicTacToe. Konstruktor ini akan memastikan bahwa ketika objek itu dibuat, maka objek array dua dimensi yang terdiri dari 3 kolom dan 3 baris juga dibuat (line 24). Kemudian pemain akan diminta memilih karakter yang akan dimainkan (line 28 - 44) menggunakan do while loop.

Konstruktor ini juga akan menginisialisasi  papan game (line 45). Inisialisasi ini bisa diartikan dengan mengosongkan papan game, dalam hal ini area pada papan yang kosong diberi karakter '?'.  Kemudian  setelah diinisilisasi papan akan ditampilkan (line 46).

Method untuk menginisialisasi papan adalah inisialisasiPapan() pada line 51 - 71.

Pada line 76 - 84 ada method cekPilihKarakter() dengan tipe boolean yang akan mengembalikan nilai true atau false. Method ini akan memastikan pemain hanya memilih karakter dengan benar.

Untuk menampilkan papan Tic Tac Toe menggunakan method tampilkanPapan() pada line 88 - 98. Hal yang penting dalam method ini adalah harus dapat mengaitkan array papanGame ketika papan ditampilkan, (perhatikan line 93).

Pergantian pemain dalam hal ini misalnya ketika pemain x telah menandai papan maka ia akan di ganti oleh pemain o, diatur oleh method gantiPemain pada line 102 - 109.

class MyTicTacToe
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
package com.bahasaJava.ticTacToe;

import java.util.Scanner;

public class MyTicTacToe {
 
 private char papanGame [][];
 
 private final int JUMLAH_BARIS = 3;
 private final int JUMLAH_KOLOM = 3;
 
 private char giliranPemain;
 
 private enum statusGame{
  WINNER,
  DRAW,
  PROCESS
 }
 
 private static Scanner input = new Scanner (System.in);
 
 public MyTicTacToe(){
  
  papanGame = new char [JUMLAH_BARIS] [JUMLAH_KOLOM];
  System.out.println("Welcome To Tic Tac Toe Game");
  System.out.println("***************************");
  
  do{
  System.out.print("Silakan masukkan 1 untuk memilih karakter x\n"
    + "atau 2 untuk memilih karakter o\n"
    + "kemudian tekan Enter: ");
  int pilihKarakter = input.nextInt();
  if(pilihKarakter == 1){
   giliranPemain = 'x';
   System.out.println("Papan telah diinisilisasi\n"
     + "**************************");
   }else if(pilihKarakter == 2){
   giliranPemain = 'o';
   System.out.println("Papan telah diinisilisasi\n"
     + "**************************");
    }else{System.out.println("Pilihan anda tidak valid!\n"
      + "*************************");
     }
  } while (cekPilihKarakter(giliranPemain) == false);
  inisialisasiPapan();
  tampilkanPapan();
  
 }
         //**********************************INISIALISASI*************************
         //Method untuk inisialisasi..................................OK
  private void inisialisasiPapan(){
   for (int i = 0; i < JUMLAH_BARIS; i ++){
    for (int j = 0; j < JUMLAH_KOLOM; j++){
     papanGame [i][j] = '?';
    }
   }
   char playerSatu;
   char playerDua;
   if(giliranPemain == 'x'){
    playerSatu = 'x';
    playerDua = 'o';
    System.out.println("PLAYER SATU: " + playerSatu);
    System.out.println("PLAYER DUA: " + playerDua);
   }else if(giliranPemain == 'o'){
    playerSatu = 'o';
    playerDua = 'x';
    System.out.println("PLAYER SATU: " + playerSatu);
    System.out.println("PLAYER DUA: " + playerDua);
   }
     
  }//Akhir method inisilaisasiPapan()
  
  //*************************CEK PILIH KARAKTER*****************************//
  //Method untuk mengecek pemain memilih karakter
  //untuk dimainkan dengan valid.................................OK
  private boolean cekPilihKarakter (char giliranPemain){
   boolean pilihKarakter = false;
   if(giliranPemain == 'x' || giliranPemain =='o'){
    pilihKarakter = true;
    }else{
     pilihKarakter = false;
     }
   return pilihKarakter;
  }//Akhir method cekPilihKarakter
  
  //************************************TAMPILKAN PAPAN***********************//
  //Method untuk menampilkanPapan.................................OK
  private void tampilkanPapan(){
   System.out.println("=============");
   for (int i = 0; i < JUMLAH_BARIS; i ++){
    System.out.print("| ");
    for (int j = 0; j < JUMLAH_KOLOM; j++){
     System.out.print(papanGame[i][j] + " | ");
    }
    System.out.println();
    System.out.println("=============");
   }
  }//Akhir method tampilkan papan
  
  //*************************GANTI PEMAIN*************************************//
  //Method untuk mengecek giliranPemain.............................OK
  private void gantiPemain(){
   if(giliranPemain == 'x'){
    giliranPemain = 'o';
   }else{
    giliranPemain = 'x';
   }
   
  }//Akhir method gantiPemain
  
  //**************************CEK PEMENANG*************************************//
  //Method untuk mengecek jika ada pemenang
  private boolean cekPemenang(){
   return(cekBarisPemenang() || cekKolomPemenang() 
     || cekDiagonalPemenang());
   
  }//Akhir method cekPemenang
  
  //Method untuk mengecek baris pemenang
  private boolean cekBarisPemenang(){
   for(int i = 0; i < JUMLAH_BARIS; i++){
    if(cekBarisKolom(papanGame[i][0], papanGame[i][1], 
      papanGame[i][2]) == true){
     return true;
    }
   }
   return false;
  }//Akhir method cekBarisPemenang
  
  //Method untuk mengecek kolom pemenang
  private boolean cekKolomPemenang(){
   for(int i = 0; i < JUMLAH_KOLOM; i++){
    if(cekBarisKolom(papanGame[0][i], papanGame[1][i], 
      papanGame[2][i]) == true){
     return true;
    }
   }
   return false;
  }//Akhir method cekKolomPemenang
  
  
  //Method untuk mengecek diagonal pemenang
  private boolean cekDiagonalPemenang(){
   return((cekBarisKolom(papanGame[0][0], papanGame[1][1], 
     papanGame[2][2]) == true)
     || (cekBarisKolom(papanGame[0][2], papanGame[1][1], 
       papanGame[2][0]) == true) );
  }//Akhir method cekDiagonalPemenang
  
  
  //Method untuk mengecek tiga nilai adalah sama
  //dan tidak kosong pada baris atau kolom
  private boolean cekBarisKolom(char a1, char a2, char a3){
   return ((a1 != '?') && (a1 == a2) && (a2 == a3));
  }//Akhir method cekBarisKolom
  
  //************************AKHIR CEK PEMENANG***********************************//
  
  
  //******************************CEK DRAW***************************************//
  //Method untuk mengecek kondisi papan game
  //sudah penuh atau belum
  private boolean cekDraw(){
   boolean draw = true;
   for(int i = 0; i < JUMLAH_BARIS; i++){
    for (int j = 0; j < JUMLAH_KOLOM; j++){
     if(papanGame[i][j] == '?'){
      draw = false;
     }
    }
   }
   return draw;
  }//Akhir method cekPapanPenuh
  //******************************AKHIR CEK DRAW**********************************//
  
                //************************CEk STATUS GAME************************************//
  private statusGame statusSekarang(){
   if(cekPemenang() == true)
    return statusGame.WINNER;
   else if(cekDraw() == true)
    return statusGame.DRAW;
   else
    return statusGame.PROCESS;
  }
  
  private void tampilkanStatus(){
         statusGame status = statusSekarang();
         if (status == statusGame.WINNER)
             System.out.println("PEMAIN " + giliranPemain +" MENANG!!");
         else if (status == statusGame.DRAW)
             System.out.println("PERMAINAN BERAKHIR DRAW!!");
  }
  //******************************AKHIR CEK STATUS GAME*****************************//
  
  //***********************************INPUT KARAKTER******************************//
  //Method untuk menginput karakter
  private void inputKarakter(){
   
     cekPemenang();
        cekDraw();
        statusSekarang();
   
    System.out.print("Pemain " + giliranPemain +
      " silakan pilih baris (0-2): ");
    int row = input.nextInt();
    System.out.print("Pemain " + giliranPemain +
      " silakan pilih kolom (0-2): ");
    int col = input.nextInt();
   
             if ((row < 0) || (row > 2))
                 System.out.println("Baris tidak valid, coba lagi");
             else if ((col < 0) || (col > 2))
                 System.out.println("Kolom tidak valid, coba lagi!");

             
             else if (papanGame[row][col] != '?')
                 System.out.println("Area ini sudah terisi, coba lagi!");
             
             else {
                 tandaiPapan(row, col, giliranPemain);
                 tampilkanPapan();
                 if(statusSekarang() == statusGame.PROCESS){
                  gantiPemain();
                 }
            
             }
  }//Akhir method input karakter
  
     //***********************************MENANDAI PAPAN********************************//
            // Pemain menandai papan
     private void tandaiPapan(int baris, int kolom, char c) {
         papanGame[baris][kolom] = c;
     }//Akhir method tandaiPapan
  
     //************************************START GAME***********************************//
     public void start(){
      do{
       inputKarakter();
      }while(statusSekarang() == statusGame.PROCESS);
      tampilkanStatus();
     }
}

Lantas bagaimana jika kita mengetahui jika telah ada pemenang dalam permainan ini? Pada kode program diatas pada line 113 - 155 terdapat method - method yang saling berkaitan, dan semuanya disimpulkan dalam method cekPemenang().

Game Tic Tac Toe juga bisa berada dalam kondisi draw, artinya ketika semua area pada papan sudah terisi oleh karakter-karakter x dan o, dan tidak ada pemenang. Untuk mengecek draw ini menggunakan method cek draw (), (line 163 - 173).

Pada line 177 - 192 terdapat method statusSekarang() dan method tampilkanStatus(). Method statusSekarang() akan memeriksa apakah sudah ada pemenang, draw atau permainan masih berjalan. Dan method ini akan mengembalikan constant dalam enum sesuai dengan status tersebut.

Ketika salah satu status tercapai dalam hal ini ada pemenang ataupun permainan berakhir draw, maka method tampilkanStatus() akan menampilkan pesan sesuai dengan kondisi tersebut.

Pada line 197 - 233 terdapat method inputKarakter() dan tandaiPapan(). Method inputKarakter() akan  memvalidasi apakah user sudah memilih baris dan kolom yang sesuai dan tidak menempatkannya pada area yang sudah terisi oleh karakter x atau o lainnya. Method ini akan memanggil method tandaiPapan() untuk menandai papan dengan karakter.

Pada line 236 - 241 terdapat method start(). Method ini akan terus memanggil method inputKarakter selama status game masih berjalan. Kemudian akan menampilkan pesan jika ada pemenang ataupun permainan berakhir draw.

Untuk mendemonstrasikannya, dengan class TestGame seperti di bawah ini:

class TestGame
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package com.bahasaJava.ticTacToe;

public class TestGame {
 
 public static void main(String[] args) {
  MyTicTacToe ticTacToe = new MyTicTacToe();
  ticTacToe.start();
 }

}

Contoh output:

membuat_game_tic_tac_toe_java
Contoh ouput game Tic tac Toe simpel dengan pemrograman Java
Semoga belajar membuat game Tic Tac Toe simpel ini dapat membantu anda dalam memhami pemrograman Java. Please feel free to comment, thanks.

No comments

Bahasa Java. Powered by Blogger.