Cara Menulis Program Tic-Tac-Toe di Jawa

Pengantar:

Tic-Tac-Toe adalah gim yang sangat umum dan cukup mudah dimainkan. Aturan mainnya sederhana dan terkenal. Karena hal-hal ini, Tic-Tac-Toe cukup mudah untuk dikodekan. Dalam tutorial ini, kita akan melihat bagaimana cara membuat kode game Tic-Tac-Toe yang berfungsi di Jawa. Tutorial ini mengasumsikan bahwa Anda memiliki pengetahuan tentang sintaks dasar Java, dan akses ke kompiler Java yang berfungsi. Tutorial ini akan menggunakan Eclipse IDE.

Garis Besar Umum:

Ada banyak cara untuk mengimplementasikan permainan Tic-Tac-Toe di Jawa, jadi sebelum kita mulai membuat kode, kita harus berpikir tentang bagaimana kita akan mengimplementasikan permainan secara khusus. Untuk tutorial ini, kita akan mengkode versi Tic-Tac-Toe berbasis teks. Tic-Tac-Toe kami akan mulai dengan mencetak papan, dan kemudian meminta masukan dari pemain pertama yang akan menentukan di mana di papan untuk menempatkan tanda pemain itu. Setelah menempatkan tanda, kami akan mencetak status papan lagi dan kemudian meminta pemain lain untuk pindah. Proses itu akan dilanjutkan sampai satu pemain menang atau papan diisi (menunjukkan bahwa pertandingan terjadi). Input yang akan diambil untuk menentukan di mana menempatkan tanda akan berada dalam format dua bilangan bulat, yang menentukan baris dan kolom di mana tanda itu akan ditempatkan. Di bawah ini adalah contoh permainan yang akan dimainkan.

Langkah 1: Membuat Proyek Anda

Langkah pertama dalam pengkodean apa pun adalah membuat proyek baru! Di IDE Anda, buat proyek Java baru bernama TicTacToe. Dalam Instructable ini, paket default adalah apa yang akan digunakan. Di dalam paket proyek Anda, buat dua kelas: Main.java, dan TTT.java. Main.java akan meng-host metode utama dan akan digunakan untuk menjalankan kode di TTT.java. TTT.java akan berisi objek Tic-Tac-Toe yang berisi keadaan papan dan metode untuk memanipulasi permainan.

Langkah 2: Memulai Kelas TTT

Sebelum kita dapat membuat kode untuk menjalankan objek TTT kita, kita perlu membuat objek TTT yang berfungsi. Karena objek TTT mewakili satu permainan dari Tic-Tac-Toe, itu harus mengandung dua variabel anggota. Di bawah ini adalah variabel anggota yang harus ditempatkan ke dalam kelas TTT diikuti oleh deskripsi mengapa mereka diperlukan.

papan pribadi char [] [];

Variabel ini adalah array karakter 2D yang akan mewakili papan tiga-tiga dari permainan Tic-Tac-Toe. Ini akan menyimpan status permainan di dalam objek TTT pada waktu tertentu.

currentPlayerMark private char;

Variabel ini akan memiliki 'x' atau 'o', mewakili giliran pemain mana pada titik waktu tertentu. Metode kelas TTT akan menggunakan ini ketika menandai papan untuk menentukan jenis tanda yang akan ditempatkan.

Langkah 3: Inisialisasi Metode Prototipe di Kelas TTT

Berikut ini adalah pengaturan umum program. Di bawah ini adalah semua header metode untuk metode yang termasuk dalam kelas TTT. Metode ini akan bertindak atas variabel anggota kelas TTT untuk membuat permainan Tic-Tac-Toe bisa berubah. Masing-masing memiliki deskripsi singkat tentang apa metode yang akan dilakukan di bawahnya. Perilaku ini diperlukan untuk memainkan permainan penuh Tic-Tac-Toe.

TTT publik ()

Ini adalah konstruktornya. Ini akan bertanggung jawab untuk memastikan papan diinisialisasi dengan benar, dan untuk menentukan siapa pemain pertama akan.

public void initializeBoard ()

Metode ini akan menginisialisasi variabel papan sehingga semua slot kosong.

public void printBoard ()

Metode ini akan mencetak papan Tic-Tac-Toe ke output standar.

public boolean isBoardFull ()

Metode ini akan memeriksa apakah papan penuh atau tidak. Ini akan mengembalikan true jika papan penuh dan palsu sebaliknya.

public boolean checkForWin ()

Metode ini akan memeriksa untuk melihat apakah seorang pemain telah menang, dan jika demikian, itu akan mengembalikan true.

private boolean checkRowsForWin ()

Metode ini secara khusus akan memeriksa baris untuk menang.

private boolean checkColumnsForWin ()

Metode ini secara khusus akan memeriksa kolom untuk menang.

private boolean checkDiagonalsForWin ()

Metode ini secara khusus akan memeriksa kemenangan untuk diagonal.

boolean checkRowCol pribadi (char c1, char c2, char c3)

Metode ini akan memeriksa tiga karakter tertentu yang diambil untuk melihat apakah ketiganya adalah huruf 'x' atau 'o' yang sama. Jika demikian, itu akan mengembalikan true.

Catatan : Jika Anda mengkode stub metode untuk semua header metode ke kelas TTT Anda, kompiler Anda mungkin akan memberi tahu Anda bahwa kode Anda memiliki kesalahan. Ini normal. Kompilator hanya mengharapkan nilai yang akan dikembalikan untuk semua metode non-void.

Langkah 4: Inisialisasi Papan

public void initializeBoard ()

Ini akan mengatur papan untuk semua nilai kosong. Di dalam metode ini, Anda harus membuat 2 untuk loop di dalam satu sama lain yang akan melewati semua baris dan kolom pengaturan setiap ruang untuk '-'. Untuk mengulang melalui baris, buat loop untuk dan bilangan bulat, dalam hal ini bernama i, untuk mewakili baris mana yang saat ini kami amati.

untuk (int i = 0; i <3; i ++) {}

Di dalam ini untuk loop, kita akan membuat kedua untuk loop dengan integer j untuk mewakili kolom mana yang sedang kita amati.

untuk (int j = 0; j <3; j ++) {}

Di dalam lingkaran kedua untuk, kami mengatur lokasi papan ke '-'. Dengan kedua loop selesai dan bersarang dengan benar, kita dapat beralih melalui setiap tempat di dalam array 2D papan.

board [i] [j] = '-';

Terlampir pada langkah ini adalah gambar yang menunjukkan satu kemungkinan implementasi metode initializeBoard ().

Langkah 5: Mencetak Papan

Papan cetak awal akan terlihat seperti gambar pertama.

Ini akan ditangani dalam metode public void printBoard (), yang terletak di kelas TTT. Untuk mencetak papan, kita harus mengakses setiap tempat di papan 2D bernama papan di kelas TTT kita. Karena kita berurusan dengan array 2D, ini akan ditangani dengan nested for loop.

Pertama, kita hanya perlu mencetak garis garis (13 di antaranya dalam hal ini) menunjuk bagian atas papan. Di bawah itu, kita memerlukan loop for yang akan loop melalui masing-masing dari tiga baris. Loop ini akan berisi panggilan untuk mencetak '|' karakter, yang lain untuk loop untuk loop melalui kolom, dan panggilan ke fungsi System.out.println () untuk mencetak baris baru dan 13 berikutnya berlari ke layar.

Batin kami untuk loop juga hanya akan melewati tiga kolom. Karena bagian luar kami untuk loop sudah mencetak yang pertama | karakter setiap baris papan, kita dapat melanjutkan untuk mencetak karakter yang termasuk dalam kotak. Untuk melakukan ini, kita akan mencetak karakter pada baris dan kolom itu menggunakan papan [i] [j] (i menjadi variabel yang digunakan untuk luar untuk loop, yang merupakan baris, dan j adalah variabel yang digunakan untuk loop dalam, yang merupakan kolom.) Pernyataan cetak ini juga akan berisi gabungan | karakter, untuk memisahkan kotak.

Satu-satunya yang tersisa adalah mencetak panggilan terakhir untuk mencetak baris baru untuk memisahkan setiap baris, diikuti oleh 13 tanda hubung. Gambar terlampir kedua menunjukkan contoh seperti apa fungsi cetak yang diuraikan.

Langkah 6: Memeriksa Pemenang (Bagian 1)

Ada tiga fungsi berbeda untuk memeriksa kemenangan: baris, kolom, dan diagonal. Komputer harus memisahkan ini ke dalam kondisi yang berbeda karena mereka semua berbeda dalam hal array. checkForWin () akan menjadi fungsi utama kami untuk menguji semua 3 fungsi ini untuk setiap skenario yang dipengaruhi oleh input pengguna.

Untuk metode checkForWin (): Anda hanya perlu pernyataan kembali yang memanggil tiga fungsi yang berbeda. Jika memeriksa baris untuk menang tidak menghasilkan true maka periksa kolom untuk menang, dll. Di dalam pernyataan kembali akan terlihat seperti: checkRowsForWin () || checkColumnsForWin () || checkDiagonalsForWin ()

Untuk metode checkRowsForWin (): Kami mengulang-ulang baris untuk melihat apakah ada pemenang. Ini akan membutuhkan satu untuk loop dengan pernyataan if di dalamnya. For loop akan bertambah melalui integer i untuk memeriksa setiap baris. for (int i = 0; i <3; i ++) Pernyataan if membandingkan setiap spasi dalam baris satu sama lain dan memberikan nilai 'true' jika semuanya sama. Sebagai contoh jika baris memiliki tiga x berturut-turut, metode ini akan mengembalikan true. if (checkRowCol (board [i] [0], board [i] [1], board [i] [2]) == true) Jadi, di dalam pernyataan if ini, harus ada: return true; Dan setelah loop for, jika metode tidak pernah berhenti, maka metode perlu kembali bahwa baris ini tidak memiliki tiga simbol yang cocok berturut-turut. Karenanya, tepat sebelum menutup metode dengan '}' finalnya, kita akan menulis: return false; Memenuhi kebutuhan untuk mengembalikan boolean.

Untuk metode checkColumnsForWin (): Salin dan tempel konten metode checkRowsForWin (). Satu-satunya perubahan akan berada di dalam pernyataan if. Alih-alih menambah melalui baris, kita akan menambah melalui kolom. Jadi ketika di checkRowsForWin memiliki pernyataan if yang mengatakan: if (checkRowCol (board [i] [0], board [i] [1], board [i] [2]) == true) checkColumnsForWin () akan memiliki if pernyataan yang mengatakan: if (checkRowCol (board [0] [i], board [1] [i], board [2] [i]) == true) Selain itu, semua hal lain dalam metode ini tetap sama.

Untuk metode checkDiagonalsForWin (): Semua yang ditulis dapat dimasukkan di dalam tanda kurung dari pernyataan return (). Pemeriksaan pertama yang akan kami lakukan adalah diagonal dari sudut kiri atas ke sudut kanan bawah. Untuk melakukan ini, kami memeriksa semua ruang yang akan dimasukkan di bagian ini. checkRowCol (board [0] [0], board [1] [1], board [2] [2]) == true) Kemudian kita akan memiliki satu pernyataan lagi, tetapi kita akan memisahkan keduanya dengan simbol ATAU: ' || ' Pernyataan kedua akan memeriksa dari sudut kanan atas ke sudut kiri bawah. checkRowCol (board [0] [2], board [1] [1], board [2] [0]) == true) Jadi produk akhir Anda dari metode checkDiagonalsForWin () harus berupa return (), dan di dalamnya harus berisi pernyataan pertama ATAU pernyataan kedua.

Langkah 7: Periksa untuk Pemenang (Bagian 2)

Sekarang kita harus memastikan jika seorang pemain mendapat tiga berturut-turut, dia menang. checkRowCol () akan menjadi fungsi yang akan membandingkan ketiga huruf satu sama lain, dan jika mereka cocok, maka mengembalikan true.

Untuk metode checkRowCol (): Metode ini digunakan oleh metode lain untuk mengirim tiga nilai. Kami pertama-tama memeriksa untuk memastikan bahwa nilai pertama bukan yang kosong seperti '-'. Kemudian kita membandingkan nilai pertama dengan yang kedua, dan yang kedua dengan yang ketiga, dan jika dan hanya jika ketiga nilai itu sama DAN mereka bukan pernyataan kosong, maka metode ini akan mengembalikan true. Jadi di dalam satu pernyataan return (), pernyataan pertama kami akan memeriksa ini bukan '-'. (c1! = '-') Pisahkan pernyataan pertama dan kedua dengan '&&' Pernyataan kedua akan melihat apakah nilai pertama sama dengan nilai kedua. (c1 == c2) Pisahkan pernyataan kedua dan ketiga dengan '&&' Pernyataan ketiga akan melihat apakah nilai kedua sama dengan yang ketiga. (c2 == c3) Jadi metode checkRowCol () terakhir Anda akan menjadi satu pengembalian () yang berisi pernyataan pertama && pernyataan kedua && pernyataan ketiga.

Langkah 8: Mengubah Antar Pemain (x dan O)

public void changePlayer ()

Metode changePlayer () akan menukar variabel currentPlayerMark antara x dan o. Untuk melakukan ini, cukup periksa apa variabel saat ini memegang. Jika variabel memegang 'x', maka ubah ke 'o'. Kalau tidak, ubah ke 'x'.

placeMark boolean publik (int row, int col)

Metode placeMark () akan menempatkan huruf yang benar ke baris yang ditentukan dan col di variabel papan (diambil sebagai parameter). Ini akan mengembalikan true jika itu penempatan yang valid. Kalau tidak, tidak ada modifikasi pada variabel papan akan dibuat, dan pemain harus mencoba dan menempatkan surat mereka di tempat yang berbeda, sebagai tempat yang tidak valid dipilih atau tempat di mana pemain sudah menempatkan surat mereka dipilih. Untuk mencapai perilaku ini, beberapa hal harus diperiksa. Pertama, pastikan (menggunakan pernyataan if) bahwa argumen baris antara 0 dan 2. Selanjutnya, periksa untuk memastikan bahwa argumen col adalah antara 0 dan 2. Akhirnya, periksa untuk memastikan bahwa tempat yang dimaksud saat ini berisi '- ', menandakan bahwa belum ada pembayar yang menandai tempat itu. Jika ketiga kondisi ini memeriksa, maka tempatkan tanda (tipe yang ditentukan oleh variabel kelas currentPlayerMark) di lokasi yang ditentukan oleh baris dan col dan kemudian mengembalikan true. Jika salah satu dari tiga kondisi tidak terpenuhi, maka pencatatan harus terjadi dan salah harus dikembalikan.

Terlampir pada langkah ini adalah gambar yang menunjukkan kemungkinan implementasi metode yang disebutkan di atas.

Langkah 9: Input Pemain dan Memainkan Game

Sekarang kelas TTT dan semua metodenya telah selesai, metode utama yang berjalan melalui seluruh permainan Tic-Tac-Toe menggunakan objek TTT harus dibuat. Metode utama harus melakukan beberapa hal untuk menjalankan permainan penuh Tic-Tac-Toe.

Pertama, ia harus membuat objek Scanner untuk mengambil input dari System.in. Selain itu, ia harus membuat instance objek TTT untuk memainkan game Tic-Tac-Toe. Setelah hal-hal ini, ia harus menginisialisasi papan objek TTT dengan memanggilnya metode initializeBoard ().

Setelah langkah-langkah ini selesai, permainan sebenarnya harus diperhitungkan. Untuk melewati belokan, loop do while diperlukan. Lingkaran harus keluar saat permainan selesai, artinya setiap kali papan objek TTT penuh atau memiliki pemenang. Di dalam loop, status board saat ini harus dicetak sebelum setiap belokan, jadi tunjukkan pemain ruang apa yang tersedia dan ruang apa yang diambil. Kemudian, dua input harus diambil dalam menandakan baris dan kolom untuk menempatkan tanda untuk belokan. Setelah input ini dimasukkan, tanda harus ditempatkan menggunakan metode objek TTT, dan pemain harus diubah juga menggunakan metode objek TTT.

Di bawah loop sementara yang menangani semua putaran hingga akhir permainan, Anda harus menyatakan siapa pemenang permainan (atau jika pertandingan itu seri). Untuk melakukan ini, periksa apakah permainan itu seri pertama dengan memeriksa apakah kedua papan sudah penuh dan tidak ada pemenang. Jika hal-hal ini terjadi, maka cetak bahwa permainan itu seri. Jika tidak, cetak siapa yang menang dengan mencetak kebalikan dari kondisi saat ini dari variabel currentPlayerMark objek TTT. Ini dapat dilakukan dengan terlebih dahulu memanggil metode changePlayer () objek TTT dan kemudian menggunakan metode getCurrentPlayerMark () objek TTT untuk mendapatkan status variabel currentPlayerMark. Mungkin juga bagus untuk mencetak papan sekali lagi untuk menunjukkan keadaan akhir papan.

Contoh metode utama telah dilampirkan sebagai gambar.

Langkah 10: Gunakan Kelas, Kompilasi, dan Jalankan

Setelah Anda sampai pada titik ini, proyek Anda harus cukup lengkap untuk dijalankan. Jika ada kesalahan atau tanda kurung atau titik koma yang hilang, sekaranglah saatnya untuk menemukan ini dan memperbaikinya. Jika Anda benar-benar bingung tentang bagaimana proyek Anda seharusnya terlihat, kami telah menyertakan file yang dapat diunduh untuk Anda membandingkan kode Anda dengan produk akhir yang berfungsi. Silakan kompilasi proyek Anda. Di Eclipse ada tombol putar yang terlihat seperti gambar yang dilampirkan pada langkah ini.

Lampiran

  • Bekerja Final Product.zip Unduh

Artikel Terkait