# 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!