---
# System prepended metadata

title: Pembahasan CS2 Alprog Selasa
tags: [Published]

---

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

