OLEH
Yehezkiel Prasetyo Afhanto
150312605580
PENDAHULUAN
1.1 Latar Belakang
Pada zaman sekarang, komputer sudah menjadi hal yang lazim ditemui pada
kehidupan sehari-hari. Komputer yang pada zaman dahulu hanya digunakan untuk
menulis suatu laporan atau surat dan untuk mengerjakan suatu tugas pekerjaan, sekarang
dapat digunakan sebagai sarana hiburan. Salah satu bentuk hiburan dari komputer adalah
games / permainan. Banyak permainan - permainan yang bersifat board game di perbarui
menjadi permainan PC, salah satunya adalah tic tac toe.
Permainan tic-tac-toe atau juga biasa disebut x-o-x adalah permainan yang dimana
pemain-pemainnya secara bergantian menempatkan simbol X atau O pada papan
berukuran 3x3. Misalkan pemain pertama memilih simbol ‘X’ dan jalan terlebih dahulu,
maka pemain kedua akan menempatkan simbol ‘O’ di tempat yang masih kosong, begitu
seterusnya. Pemain yang pertama kali berhasil menempatkan 3 simbol mereka dalam satu
baris baik secara vertikal, horizontal, atau diagonal, maka dia lah pemenangnya.
Berikut merupakan contoh permainan yang dimenangkan oleh pemain pertama
dengan simbol ‘X’ :
Permainan yang biasa dilakukan oleh 2 orang ini biasanya akan menghasilkan hasil
yang imbang karena kedua pemain akan dengan sigap menentukan lokasi terbaik untuk
menempatkan simbol mereka dengan menyesuaikan kondisi papan saat itu.
Tic tac toe yang dimainkan oleh 2 orang secara manual dengan cara ditulis di kertas
merupakan hal yang sudah biasa, namun lain halnya jika permainan tic tac toe diterapkan
pada komputer dan diatur untuk dimainkan oleh 1 orang saja. Sehingga permainan
dimainkan oleh manusia dan komputer. Akan menjadi hal yang menarik pula jika
komputer menjadi pemain yang tak pernah terkalahkan saat bertanding melawan manusia.
Untuk merealisasikan hal tersebut, komputer harus diberikan kecerdasan buatan atau
Artificial Intelligence (AI) tertentu. Komputer akan mencari beberapa langkah kedepan
yang kemungkinan untuk menangnya terbesar dan mengetahui apa yang akan dilakukan
apabila lawan akan mendapatkan kemenangan. Setiap langkah komputer dengan
kecerdasan buatan yang telah diberikan akan memilih 1 kotak dengan peluang untuk
menang terbesar dari 9 kotak yang ada dan memaksa manusia memilih kotak yang
tentunya tidak begitu menguntungkan baginya namun menguntungkan bagi komputer.
Untuk mewujudkan hal tersebut, maka akan dibuat permainan tic tac toe
menggunakan program Borland Delphi 7 dengan menerapkan konsep Game Tree. Yakni
konsep permainan yang disimbolkan dengan graf pohon dimana titik-titiknya menyimbolkan
posisi dan sisi-sisinya menyimbolkan aksi-aksi dalam permainan. Banyaknya titik/ daun pada
Game Tree menyimbolkan banyaknya cara berbeda yang mungkin yang dapat dipilih saat
memainkan permainan. Ilustrasi dari Graph Tree pada permainan tic tac toe dapat dilihat pada
gambar di bawah ini.
1.3 Tujuan
PEMBAHASAN
Tic tac toe pertama kali dimainkan di Kerajaan Roma. Dulu permainan ini
disebut Terni Lapilli. Jika pada tic tac toe sekarang setiap pemain memiliki jumlah
piece yang tidak terbatas, pada Terni Lapilli setiap pemain hanya memiliki 3 buah
piece yang nantinya akan dipindah-pindah ke kotak kosong agar permainan tetap
berlanjut. Papan permainan Terni Lapilli yang dibuat dengan kapur ini ditemukan di
seluruh Roma. Pada tahun 1884, anak-anak bermain di sebuah batu tulis dimana
mereka menutup mata sambil mencoretkan batu dengan dua simbol "X" dan "O"
membentuk satu barisan namun disertai suara tic dan tac dari anak-anak. Pada tahun
1952, Tic Tac Toe mulai marak diminati karena untuk pertama masuk ke dunia video
game OXO (or Noughts and Crosses) untuk komputer EDSAC. Pemain bisa
memainkan Tic-Tac-Toe dengan melawan komputer bahkan dapat multyplay
melawan manusia. Pada tahun 1975, Tic Tac Toe juga digunakan oleh siswa MIT
untuk menunjukkan kekuatan komputasi dari elemen Tinkertoy yang saat ini
dipamerkan di Museum of Science, Boston .
Pemain yang memiliki langkah ke-2 harus merespon secara tepat untuk
mencegah terjadinya forced win oleh pemain pertama. Jika pemain pertama menaruh
di posisi corner, maka pemain kedua harus merespon dengan menaruh di center. Jika
pemain pertama menaruh di posisi edge, maka pemain kedua dapat merespon dengan
menaruh piecenya di center, corner yang berada disebelah edge yang telah diisi atau
opposite edge. Walau permainan tic tac toe ini terlihat simple namun jika dihitung
dengan teori matematika, terdapat 19,683 layout yang mungkin dibuat dari pemainan
ini (termasuk kotak kosong) dan 362,880 kemungkinan games (jika urutan
pemasangan piece diperhatikan). Namun tidak semuanya dapat dicapai karena
biasanya sudah permainan sudah dimenangkan salah satu pemain dan constraint yaitu
jumlah X harus sama dengan atau lebih banyak 1 dari jumlah O.
B. Algoritma Minimax
Berbeda dengan permainan catur yang memerlukan rule yang banyak serta
knowledge base yang lengkap, Pada permainan tic-tac-toe ini mempunyai lebih
sedikit rule dan knowledge base yang cenderung lebih sedikit. Dari rule yang ada
mampu menghasilkan solusi-solusi yang dapat digunakan untuk memenangkan
permainan. Dari rule yang sedikit, komputer mampu melakukan komputasi untuk
memainkan setiap kombinasi langkah dari setiap posisi dan kondisi. Namun hal ini
dapat dihindari dengan membatasi sejauh mana komputer akan menganalisis hasil dari
langkah langkah yang mungkin (menentukan kedalaman pohon). Tetapi dengan hal
ini, kita harus menambah kedalaman pohon tersebut setiap langkahnya agar
kedalaman pohon pada state tersebut sama dengan state sebelumnya Algoritma
minimax ini bekerja secara rekursif dengan mencari langkah yang akan membuat
lawan mengalami keuntungan minimum. Semua strategi lawan akan dihitung dengan
algoritma yang sama dan seterusnya. Ini berarti, pada langkah pertama komputer akan
menganalisis seluruh pohon permainan. Dan untuk setiap langkahnya, komputer akan
memilih langkah yang membuat lawan mendapatkan keuntungan minimum, dan
membuat komputer itu sendiri mendapatkan keuntungan maksimum.
Dalam penentuan keputusan tersebut dibutuhkan suatu nilai yang
merepresentasikan kerugian atau keuntungan yang akan diperoleh jika langkah
tersebut dipilih. Untuk itulah disini digunakan sebuah fungsi heurisitic untuk
mengevaluasi nilai sebagai nilai yang merepresentasikan hasil permainan yang akan
terjadi jika langkah tersebut dipilih. Pada umumnya pada permainan tic-tac-toe ini
digunakan nilai 1, 0, -1 untuk mewakilkan hasil akhir permainan berupa menang, seri,
dan kalah. Dari nilai-nilai heuristic inilah komputer akan menentukan simpul mana
dari pohon permainan yang akan dipilih, tentunya simpul yang akan dipilih tersebut
adalah simpul dengan nilai heuristic yang akan menuntun permainan ke hasil akhir
yang menguntungkan bagi komputer.
unit Unit1;
interface
uses
type
TForm1 = class(TForm)
lblCurrent: TLabel;
lblStatus: TLabel;
bllAmZug: TLabel;
memAI: TMemo;
imgTitle: TImage;
gbPlaymode: TGroupBox;
rdHVsH: TRadioButton;
rdHVSC: TRadioButton;
chckHumanStarts: TCheckBox;
Panel1: TPanel;
btn11: TButton;
btn12: TButton;
btn13: TButton;
btn21: TButton;
btn22: TButton;
btn23: TButton;
btn31: TButton;
btn32: TButton;
btn33: TButton;
btnReset: TButton;
scMind: TScrollBar;
lblKILevel: TLabel;
private
public
{ Public declarations }
end;
var
Form1: TForm1;
playmode:string;
implementation
{$R *.dfm}
function Situation:integer;
var x,y:short;
var temp:string;
begin
temp:='';
for x:=1 to 3 do
for y:=1 to 3 do
temp:=temp + inttostr(playfield[x,y]);
result:=strtoint(temp);
end;
procedure aiout(str:string);
begin
form1.memai.Lines.Add(str);
end;
procedure BuildPlayfield;
var x,y:short;
begin
aiout('Building Field...');
for x:=1 to 3 do
for y:=1 to 3 do
playfield[x,y]:=0;
else playfield[1,1]:=form1.btn11.tag;
else playfield[2,1]:=form1.btn21.tag;
else playfield[3,1]:=form1.btn31.tag;
else playfield[1,2]:=form1.btn12.tag;
else playfield[2,2]:=form1.btn22.tag;
else playfield[3,2]:=form1.btn32.tag;
else playfield[1,3]:=form1.btn13.tag;
else playfield[3,3]:=form1.btn33.tag;
end;
procedure compselect(btn:tbutton);
begin
btn.caption:=form1.lblcurrent.caption;
btn.tag:=1;
end;
function stragetyCross:boolean;
begin
stragetyCross:=false;
begin
compselect(form1.btn13);
stragetycross:=true;
exit;
end;
aiout('Stragety "Cross" 13-22-31 canceled!');
begin
compselect(form1.btn31);
stragetycross:=true;
exit;
end;
begin
compselect(form1.btn33);
stragetycross:=true;
exit;
end;
begin
compselect(form1.btn11);
stragetycross:=true;
exit;
end;
function stratetyDefend:boolean;
var x,y:short;
begin
stratetyDefend:=false;
for y:=1 to 3 do
begin
if playfield[y,1]+playfield[y,2]+playfield[y,3]=4 then
begin
for x:=1 to 3 do
if playfield[y,x]=0 then
begin
playbutton[y,x].Caption:=form1.lblCurrent.caption;
playbutton[y,x].tag:=1;
stratetyDefend:=true;
exit;
end;
end;
end;
for y:=1 to 3 do
begin
begin
for x:=1 to 3 do
if playfield[x,y]=0 then
begin
playbutton[x,y].Caption:=form1.lblCurrent.caption;
playbutton[x,y].tag:=1;
stratetyDefend:=true;
exit;
end;
end;
end;
if playfield[1,1]+playfield[2,2]+playfield[3,3]=4 then
begin
for x:=1 to 3 do
if playfield[x,x]=0 then
begin
playbutton[x,x].Caption:=form1.lblCurrent.caption;
playbutton[x,x].tag:=1;
stratetyDefend:=true;
exit;
end;
end;
aiout('Checking Strategy 13-22-33 for leaks');
if playfield[1,3]+playfield[2,2]+playfield[3,1]=4 then
begin
for x:=1 to 3 do
if playfield[x,4-x]=0 then
begin
playbutton[x,4-x].Caption:=form1.lblCurrent.caption;
playbutton[x,4-x].tag:=1;
stratetyDefend:=true;
exit;
end;
end;
end;
function stragetyhor:boolean;
var x,y:short;
begin
stragetyhor:=false;
for y:=1 to 3 do
begin
for x:=1 to 3 do
if playfield[y,x]=0 then
begin
playbutton[y,x].tag:=1;
result:=true;
exit;
end;
end;
end;
function stragetyver:boolean;
var x,y:short;
begin
stragetyver:=false;
for y:=1 to 3 do
begin
if playfield[1,y]+playfield[2,y]+playfield[3,y] =1 then
for x:=1 to 3 do
if playfield[x,y]=0 then
begin
playbutton[x,y].Caption:=form1.lblCurrent.caption;
playbutton[x,y].tag:=1;
result:=true;
exit;
end;
end;
end;
function Specialstragety:boolean;
var x:short;
begin
result:=false;
for x:= 1 to 3 do
begin
if playfield[x,1]=1 then
begin
if playfield[x,2] = 1 then
begin
if playfield[x,3] = 0 then
begin
playbutton[x,3].caption:=form1.lblcurrent.caption;
playbutton[x,3].Tag:=1;
result:=true;
exit;
end;
end
else
begin
begin
playbutton[x,2].caption:=form1.lblcurrent.caption;
playbutton[x,2].Tag:=1;
result:=true;
exit;
end;
end;
end
else
begin
begin
playbutton[x,1].caption:=form1.lblcurrent.caption;
playbutton[x,1].Tag:=1;
result:=true;
exit;
end;
end;
end;
for x:= 1 to 3 do
begin
if playfield[1,x]=1 then
begin
if playfield[2,x] = 1 then
begin
if playfield[3,x] = 0 then
begin
playbutton[3,x].caption:=form1.lblcurrent.caption;
playbutton[3,x].Tag:=1;
result:=true;
exit;
end;
end
else
begin
begin
playbutton[2,x].caption:=form1.lblcurrent.caption;
playbutton[2,x].Tag:=1;
result:=true;
exit;
end;
end;
end
else
begin
begin
playbutton[1,x].caption:=form1.lblcurrent.caption;
playbutton[1,x].Tag:=1;
result:=true;
exit;
end;
end;
end;
end;
function isWon:string;
var x,y:short;
Bat:boolean;
begin
begin
form1.btn11.Font.Color:=clred;
form1.btn12.Font.Color:=clred;
form1.btn13.Font.Color:=clred;
result:= form1.btn12.caption;
exit;
end;
begin
form1.btn21.Font.Color:=clred;
form1.btn22.Font.Color:=clred;
form1.btn23.Font.Color:=clred;
result:= form1.btn22.caption;
exit;
end;
begin
form1.btn31.Font.Color:=clred;
form1.btn32.Font.Color:=clred;
form1.btn33.Font.Color:=clred;
result:= form1.btn33.caption;
exit;
end;
begin
form1.btn21.Font.Color:=clred;
form1.btn11.Font.Color:=clred;
form1.btn31.Font.Color:=clred;
result:= form1.btn21.caption;
exit;
end;
begin
form1.btn12.Font.Color:=clred;
form1.btn22.Font.Color:=clred;
form1.btn32.Font.Color:=clred;
result:= form1.btn22.caption;
exit;
end;
begin
form1.btn13.Font.Color:=clred;
form1.btn23.Font.Color:=clred;
form1.btn33.Font.Color:=clred;
result:= form1.btn33.caption;
exit;
end;
begin
form1.btn22.Font.Color:=clred;
form1.btn33.Font.Color:=clred;
form1.btn11.Font.Color:=clred;
result:= form1.btn11.caption;
exit;
end;
begin
result:= form1.btn22.caption;
exit;
end;
bat:=true;
for y:=1 to 3 do
begin
result:= 'Nobody';
exit;
end;
procedure compplay;
var x,y:short;
begin
begin
for x:=1 to 3 do
for y:=1 to 3 do
begin
if playfield[x,y]=0 then
begin
playbutton[x,y].Caption := form1.lblcurrent.caption;
playbutton[x,y].tag:=1;
exit;
end;
end;
end;
begin
begin
exit;
end
else
begin
begin
end
else
end;
for y:=1 to 3 do
begin
if playfield[x,y]=0 then
begin
playbutton[x,y].Caption := form1.lblcurrent.caption;
playbutton[x,y].tag:=1;
exit;
end;
end;
end;
end;
procedure resetall;
var x,y:short;
begin
for x:=1 to 3 do //Reset the tags and the color
for y:=1 to 3 do
begin
playfield[x,y]:=0;
playbutton[x,y].font.color:=clblack;
end;
form1.btn11.Caption:='';
form1.btn12.Caption:='';
form1.btn13.Caption:='';
form1.btn21.Caption:='';
form1.btn22.Caption:='';
form1.btn23.Caption:='';
form1.btn31.Caption:='';
form1.btn32.Caption:='';
form1.btn33.Caption:='';
if form1.chckHumanStarts.checked=true then
begin
compplay;
end;
end;
procedure PlayerPlays(Btn:Tbutton);
begin
begin
exit;
end;
begin
exit;
end;
btn.caption:=form1.lblCurrent.caption; // Put O or X
else form1.lblCurrent.Caption:='X';
begin
exit;
end;
buildplayfield; // H VS CPU
else form1.lblCurrent.Caption:='X';
end;
begin
playerplays(form1.btn11);
end;
begin
playerplays(form1.btn12);
end;
begin
playerplays(form1.btn13);
end;
begin
playerplays(form1.btn21);
end;
begin
playerplays(form1.btn22);
end;
begin
playerplays(form1.btn23);
end;
begin
playerplays(form1.btn31);
end;
begin
playerplays(form1.btn32);
end;
begin
playerplays(form1.btn33);
end;
begin
playbutton[1,1]:=form1.btn11;
playbutton[1,2]:=form1.btn12;
playbutton[1,3]:=form1.btn13;
playbutton[2,1]:=form1.btn21;
playbutton[2,2]:=form1.btn22;
playbutton[2,3]:=form1.btn23;
playbutton[3,1]:=form1.btn31;
playbutton[3,2]:=form1.btn32;
playbutton[3,3]:=form1.btn33;
end;
begin
resetall;
end;
begin
end;
begin
end;
begin
resetall;
end;
end.
Dari kode-kode diatas dapat diperoleh hasil pemrograman seperti dibawah ini:
BAB III
PENUTUP
3. 1 Kesimpulan
Kesimpulan Dari pembahasan diatas, maka dapat di ambil kesimpulan bahwa Borland
Delphi merupakan program aplikasi database yang berbasis Object Pascal dan Borland.
Selain itu, Delphi juga memberikan fasilitas pembuatan aplikasi visual seperti Visual Basic.
Dengan keunggulannya yaitu mempunyai menu yang mudah digunakan, proses kompilasi
cepat dan multi purphase. Selain itu kekurangannya meliputi Partial single vendor lock-in
(Borland dapat menetapkan standar bahasa, kompatibilitas yang harus mengikutinya), Akses
pada platform dan library pihak ketiga membutuhkan file-file header yang diterjemahkan ke
dalam bahasa pascal,serta dokumentasi atas platform dan teknik-teknik yang menyertainya
sulit ditemukan dalam bahasa pascal (contoh akses COM dan Win32).
Dapat lebih memahami mengenai segala hal tentang penggunaan program Borland
Delphi dan mengaplikasikannya. Mahasiswa dapat membuat program dasar dengan
menggunakan program Borland Delphi 7. Mahasiswa dapat juga mengaplikasikan beberapa
persoalan dengan pemrograman Borland Delphi 7. Mempermudah kita dalam membuat
aplikasi pada computer. Mempermudah kita dalam mempelajari bahasa pemrograman pada
computer. Untuk mengetahui jenis dan karakteristik dari pemrograman computer. Salah
satunya adalah pemrograman Komputer Sains yang notabene tidak asing lagi dalam
keseharian mahasiswa yang berkecipung di bidang Sains sehingga mahasiswa tak hanya
mampu mengguanakannya saja melainkan dapat membuat programnya sendiri melalui
Borland Delphi 7.
3.2 Saran
Seharusnya sebagai mahasiswa yang berada di era yang serba modern ini mampu
menuangkan kreativitasnya untuk menciptakan program-program baru yang mampu bersaing
dengan program-program lainnya serta bermanfaat di semua bidang tak hanya di bidang
Sains. Harus mampu bersadar diri bahwa pemrogaman itu juga penting jadi tidak ada alasan
untuk memandang sebelah mata matakuliah yang berhubungan dengan Pemrograman
Komputer.
DAFTAR RUJUKAN