Tugas 4. Pengantar Teknologi Game
Membuat Game Sederhana "Game Tic Tac Toe"
Anggota :
Anggota :
Akbar Ghazalli Yunaz (56417612)
Ananda Putri K (50417650)
Ardhi Winahyu Putra (50417908)
Arief Dwi Pangestu (50417936)
Asima Megawati Purba (51417009)
Kelas : 3IA09
-- 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" .
Rules
- Pemain harus mengisi kotak yang tersedia pada papan permainan.
- Pemain tidak bisa mengisi kotak yang sudah diisi oleh kedua player.
- Salah satu pemain akan menang jika tanda yang mereka isi lurus horizontal, vertikal ataupun menyamping.Contoh seperti gambar berikut :
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 file .exe akan muncul.
Ketika kita menjalankan aplikasi "Kelompok1_3ia09.exe" maka akan terbuka seperti ini :

Komentar
Posting Komentar