# Pembahasan CS2 Alprog Selasa > Waktu pengerjaan ~37 menit ## Author: Misc/Dwi ### Pendekatan: Kita akan membahas implementasi permainan Tic-Tac-Toe seperti yang diperintahkan. Pada dasarnya hanya ada beberapa langkah utama yang harus kita lakukan: - Inisialisasi papan permainan - Menampilkan papan permainan - Memproses input pemain - Memeriksa kemenangan --- ### 1. Inisialisasi Papan Permainan Sebelum permainan dimulai, kita perlu memastikan bahwa papan permainan kosong. Hal ini dilakukan dengan mengisi seluruh elemen array `board` dengan karakter kosong `' '`. ```c void initializeBoard() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { board[i][j] = ' '; } } } ``` Fungsi ini memastikan bahwa semua sel dalam matriks 3x3 berisi spasi kosong sebelum permainan dimulai. --- ### 2. Menampilkan Papan Permainan Agar pemain dapat melihat keadaan permainan, kita memerlukan fungsi untuk mencetak papan permainan dengan format yang rapi. ```c void printBoard() { printf(" %c | %c | %c \n", board[0][0], board[0][1], board[0][2]); printf("---+---+---\n"); printf(" %c | %c | %c \n", board[1][0], board[1][1], board[1][2]); printf("---+---+---\n"); printf(" %c | %c | %c \n", board[2][0], board[2][1], board[2][2]); } ``` Fungsi ini mencetak papan permainan dalam format Tic-Tac-Toe dengan garis pemisah antar sel. --- ### 3. Memeriksa Kemenangan Setelah setiap giliran, kita perlu mengecek apakah ada pemain yang menang. Kita memeriksa 3 kondisi: - Apakah ada tiga simbol yang sama dalam satu baris - Apakah ada tiga simbol yang sama dalam satu kolom - Apakah ada tiga simbol yang sama dalam diagonal utama atau diagonal sekunder ```c int checkVictory() { for (int i = 0; i < SIZE; i++) { // Cek baris if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; } // Cek kolom if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; } } // Cek diagonal utama if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } // Cek diagonal sekunder if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } return 0; } ``` Fungsi ini akan memeriksa 3 kondisi tersebut dengan menggunakan operator pembanding `==` sebanyak 3 kali, dihubungkan dengan operator dan `&&` karena kita tidak bisa melakukan `a == b == c` di c, kita harus hati hati juga dan memeriksa bahwa cell yang sama terisi `!= ' '` --- ### 4. Logika Permainan (Fungsi utama/main) Di dalam fungsi `main`, permainan berlangsung dalam 9 langkah atau hingga ada pemenang. Pemain secara bergantian memilih koordinat untuk mengisi simbol mereka. ```c int main() { initializeBoard(); for (int i = 0; i < 9; i++) { int coordinatesRow, coordinatesCol; char currentPlayer = (i % 2 == 0) ? 'O' : 'X'; printBoard(); printf("\n%c to move, pick coordinates on board (row col): ", currentPlayer); scanf("%d %d", &coordinatesRow, &coordinatesCol); // Validasi input if (coordinatesRow < 1 || coordinatesRow > 3 || coordinatesCol < 1 || coordinatesCol > 3 || board[coordinatesRow - 1][coordinatesCol - 1] != ' ') { printf("Invalid move! Try again.\n"); i--; // Ulangi langkah ini continue; } board[coordinatesRow - 1][coordinatesCol - 1] = currentPlayer; char winner = checkVictory(); if (winner) { printBoard(); printf("\nCongratulations, %c Won the game!\n", winner); return 0; } } printBoard(); printf("\nIt's a draw!\n"); return 0; } ``` Kode ini bekerja dengan: 1. Menginisialisasi papan permainan. 2. Menggunakan loop untuk menerima input hingga 9 kali atau sampai ada pemenang. 3. Memvalidasi input agar tidak terjadi pemilihan kotak yang sudah terisi. 4. Menggunakan `checkVictory()` untuk mengevaluasi apakah permainan sudah berakhir. 5. Jika tidak ada pemenang setelah 9 langkah, hasilnya adalah seri. --- ### Full Code: ```c #include <stdio.h> #include <stdlib.h> #define SIZE 3 char board[SIZE][SIZE]; void initializeBoard() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { board[i][j] = ' '; } } } void printBoard() { printf(" %c | %c | %c \n", board[0][0], board[0][1], board[0][2]); printf("---+---+---\n"); printf(" %c | %c | %c \n", board[1][0], board[1][1], board[1][2]); printf("---+---+---\n"); printf(" %c | %c | %c \n", board[2][0], board[2][1], board[2][2]); } int checkVictory() { for (int i = 0; i < SIZE; i++) { // Check rows if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { printf("\nCongratulations, %c Won the game!\n", board[i][0]); return 1; } // Check columns if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { printf("\nCongratulations, %c Won the game!\n", board[0][i]); return 1; } } // Check diagonals if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { printf("\nCongratulations, %c Won the game!\n", board[0][0]); return 1; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { printf("\nCongratulations, %c Won the game!\n", board[0][2]); return 1; } return 0; } int main() { initializeBoard(); for (int i = 0; i < 9; i++) { int coordinatesRow, coordinatesCol; char currentPlayer = (i % 2 == 0) ? 'O' : 'X'; printBoard(); printf("\n%c to move, pick coordinates on board (row col): ", currentPlayer); scanf("%d %d", &coordinatesRow, &coordinatesCol); // Validate input if (coordinatesRow < 1 || coordinatesRow > 3 || coordinatesCol < 1 || coordinatesCol > 3 || board[coordinatesRow - 1][coordinatesCol - 1] != ' ') { printf("Invalid move! Try again.\n"); i--; // Retry this move continue; } board[coordinatesRow - 1][coordinatesCol - 1] = currentPlayer; if (checkVictory()) { printBoard(); return 0; } } printBoard(); printf("\nIt's a draw!\n"); return 0; } ``` --- ## Terima Kasih!