Rabu, 08 Juli 2020

SOFTSKILL TUGAS 4 : PENGANTAR TEKNOLOGI GAME


Tugas membuat game sederhana dengan implementasi AI

Tugas Pengantar Teknologi Game


"Game tic tac toe"

Kelas 3IA09

Anggota :
Akbar Ghazalli Yunaz (56417612)
Ananda Putri K (50417650)
Ardhi Winahyu Putra (50417908)
Arief Dwi Pangestu (50417936)
Asima Megawati Purba (51417009)

-- Problem Statement--
Pemain harus mengisi angka pada papan permainan, dengan cara memilih angka antara 1 sampai 9. Pemain harus menang dari komputer (AI).
 -- Mechanics: Gameplay, Rule, and Control  --
Gameplay
Game tic tac toe adalah game turn-based dimana dua pemain saling bergantian mengisi kotak yang ada  pada papan permainan. Pada permainan Game tic tac toe yang telah dibuat ini, terdapat 2 player, yaitu manusia dan AI. Dimana tujuan dari game ini adalah mengalahkan AI. Pemain (manusia) di simbolkan dengan tanda "O" sedangkan AI ditandakan dengan "X" .

Rule
1. Pemain harus mengisi kotak yang tersedia pada papan permainan.
2. Pemain tidak bisa mengisi kotak yang sudah diisi oleh kedua player.
3. Salah satu pemain akan menang jika tanda yang mereka isi lurus horizontal, vertikal                          

ataupun  menyamping. Contoh seperti foto :


          Control

Pemain bisa memilih angka dengan cara menekan angka 1 sampai 9  pada keyboard, jika sudah memilih angka, pemain diharuskan menekan tombol enter. 

Pada akhir permainan pemain akan ditanya ingin memulai game dari awal atau tidak, jika ya tekan tombol y dan jika tidak tekan tombol n, setelah itu tekan enter. 


Tutorial membuat game tic tac toe


Berikut adalah list program yang sudah dibuat
--------------------------------------------------------------------------------------------------------------------------

#include <iostream>
#include <algorithm>

using namespace std;

const char tandaAI = 'X';
const char tandaPlayer = 'O';

struct MoveIndex
{
    int row, col;
};

void printGameBoard(char gameBoard[3][3])
{
    cout<<"__________________"<<endl;

    for(int i = 0; i < 3; i++)
    {
        cout<<endl;
        for(int j = 0; j < 3; j++)
        {
            cout<<"  "<<gameBoard[i][j]<<"  |";
        }

        cout<<endl;
        cout<<"__________________"<<endl;
    }
}

bool isPemenang(char playerSign, char gameBoard[3][3])
{
    // dalam loop memeriksa kemenangan game vertikal dan horizontal.
    for(int i = 0; i < 3; i++)
    {
        if(gameBoard[i][0] == playerSign && gameBoard[i][1] == playerSign && gameBoard[i][2] == playerSign)
        {
            return true;
        }

        if(gameBoard[0][i] == playerSign && gameBoard[1][i] == playerSign && gameBoard[2][i] == playerSign)
        {
            return true;
        }
    }

    //permainan diagonal menang memeriksa
    if(gameBoard[0][0] == playerSign && gameBoard[1][1] == playerSign && gameBoard[2][2] == playerSign)
    {
        return true;
    }

    if(gameBoard[2][0] == playerSign && gameBoard[1][1] == playerSign && gameBoard[0][2] == playerSign)
    {
        return true;
    }

    return false;
}

bool isTempatBelomTerisi(char gameBoardIndexChar)
{
    if( (gameBoardIndexChar == tandaAI) || (gameBoardIndexChar == tandaPlayer) )
    {
        return false;
    }
    else return true;
}

bool isKalah(char gameBoard[3][3])
{
    if( isPemenang(tandaAI, gameBoard) )
    {
        return true;
    }

    if( isPemenang(tandaPlayer, gameBoard) )
    {
        return true;
    }

    // Mengecek ketersediaan papan untuk pergerakan selanjutnya.
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            if( isTempatBelomTerisi(gameBoard[i][j]) )
            {
                return false;
            }
        }
    }

    return true;
}


// mengembalikan skor game setelah menyelesaikan game
int getGameScore(char gameBoard[3][3])
{
    if(isPemenang(tandaAI, gameBoard))
    {
        return 10;
    }

    else if(isPemenang(tandaPlayer, gameBoard))
    {
        return -10;
    }
    else return 0;
}

int miniMaxAlgo(char playerSign, char gameBoard[3][3])
{
    if(isKalah(gameBoard))
    {
        return getGameScore(gameBoard);
    }

    // Pemain AI memaksimalkan nilai peluang kemenangan

    if(playerSign == tandaAI)
    {
        int bestMoveValue = -10000;

        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                if( isTempatBelomTerisi(gameBoard[i][j]) )
                {
                    char tempIndexValue = gameBoard[i][j];
                    gameBoard[i][j] = playerSign;
                    bestMoveValue = max(bestMoveValue, miniMaxAlgo(tandaPlayer, gameBoard));
                    gameBoard[i][j] = tempIndexValue;
                }
            }
        }

        return bestMoveValue;
    }
    else
    {
        // pemain manusia meminimalkan peluang kemenangan pemain AI.

        int bestMoveValue = 10000;

        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                if( isTempatBelomTerisi(gameBoard[i][j]) )
                {
                    char tempIndexValue = gameBoard[i][j];
                    gameBoard[i][j] = playerSign;
                    bestMoveValue = min(bestMoveValue, miniMaxAlgo(tandaAI, gameBoard));
                    gameBoard[i][j] = tempIndexValue;
                }
            }
        }

        return bestMoveValue;
    }
}

// temukan langkah terbaik untuk komputer menggunakan algoritma minimax.
MoveIndex findBestMove(char playerSign, char gameBoard[3][3])
{
    int bestMoveValue = -10000;
    MoveIndex bestMoveIndex;

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            if( isTempatBelomTerisi(gameBoard[i][j]) )
            {
                char tempIndexValue = gameBoard[i][j];
                gameBoard[i][j] = playerSign;

                int tempMoveValue = miniMaxAlgo(tandaPlayer, gameBoard);

                gameBoard[i][j] = tempIndexValue;

                if(bestMoveValue < tempMoveValue)
                {
                    bestMoveValue = tempMoveValue;

                    bestMoveIndex.row = i;
                    bestMoveIndex.col = j;
                }
            }
        }
    }

    return bestMoveIndex;
}

void mulaiGame(char gameBoard[3][3])
{
    bool humanPlayerTurn = true;

    while(!isKalah(gameBoard))
    {
        if(humanPlayerTurn)
        {
            int indexNumber, row, col;

            // loop sampai pemain manusia memasukkan posisi yang valid.
            while(true)
            {
                cout<<"\nMasukkan angka yang ingin anda pilih (contohnya 1 atau 2 atau angka yang tersedia) : ";
                cin>>indexNumber;

                row = (indexNumber - 1)/3;
                col = (indexNumber - 1)%3;

                if(isTempatBelomTerisi(gameBoard[row][col]))
                {
                    gameBoard[row][col] = tandaPlayer;
                    printGameBoard(gameBoard);


                    cout<<"Giliran kamu."<<endl;
                    cout<<endl<<"........................................"<<endl<<endl;

                    break;
                }
                else
                {
                    cout<<endl<<"Tempat ini sudah terisi. Tolong lihat papan game yang ada dibawah"<<endl;
                    printGameBoard(gameBoard);
                    cout<<endl;
                }
            }

            humanPlayerTurn = false;

        }
        else
        {
            MoveIndex aiMoveIndex = findBestMove(tandaAI, gameBoard);
            gameBoard[aiMoveIndex.row][aiMoveIndex.col] = tandaAI;
            humanPlayerTurn = true;
            printGameBoard(gameBoard);

            cout<<"Giliran komputer."<<endl;
            cout<<endl<<"........................................"<<endl<<endl;
            cout<<endl<<"........................................"<<endl<<endl;
        }
    }

    if(isPemenang(tandaAI, gameBoard))
    {
        cout<<"Komputer Menang..."<<endl;
    }
    else if( isPemenang(tandaPlayer, gameBoard))
    {
        cout<<"Selamat!!!\nKamu Menang"<<endl;
    }
    else cout<<"Pertandingan ini seri."<<endl;



}

int main()
{
    label_mulai:
    system("cls");
    char pilihan;
    char gameBoard[3][3];

    int counter = 49; //Nilai ASCII 1.

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            gameBoard[i][j] = counter;
            counter++;
        }
    }

    cout<<"Selamat datang di game tic tac toe "<<endl;
    cout<< endl;
    cout<<"-Kelompok 1 Kelas 3IA09-"<<endl;
    cout<<"Ananda Putri K       50417650"<<endl;
    cout<<"Akbar Ghazalli Yunaz 56417612"<<endl;
    cout<<"Ardhi Winahyu Putra  50417908"<<endl;
    cout<<"Arief Dwi Pangestu   50417936"<<endl;
    cout<<"Asima Megawati Purba 51417009"<<endl;
    cout<< endl;
    cout<<"Memulai game...."<<endl;

    printGameBoard(gameBoard);
    mulaiGame(gameBoard);

    

    cout <<"Akhir dari permainan..."<<endl;
    cout << endl;
    cout << "Apakah anda ingin mulai dari awal?" <<endl;
    cout << "Tekan y untuk mulai lagi, atau tekan n nuntuk keluar: ";
    cin >> pilihan;

    if((pilihan == 'y') | (pilihan =='Y')){
        goto label_mulai;
    }
    else if((pilihan == 'n') | (pilihan =='N')){
        goto label_selesai;
    }

    label_selesai:
   
    return 0;
}


--------------------------------------------------------------------------------------------------------------------------

Jika sudah ditulis seperti diatas, maka kita harus mengcompilenya dengan compiler C++ (dengan mingw)



Karena pada pembuatan game ini menggunakan code editor sublime, kita hanya perlu menekan tombol "CTRL + B" untuk mengcompile. Maka exe file akan keluar




Ketika kita menjalankan aplikasi "Kelompok1_3ia09.exe" maka akan terbuka seperti ini :
Berikut adalah video cara bermain game tic tac toe

Tidak ada komentar:

Posting Komentar