Anda di halaman 1dari 31

PERMAINAN TIC-TAC-TOE PADA DELPHI 7

Untuk Memenuhi Tugas


Matakuliah Artificial Intelligence (AI)

OLEH
Yehezkiel Prasetyo Afhanto
150312605580

UNIVERSITAS NEGERI MALANG


FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
PROGRAM STUDI MATEMATIKA
FEBRUARI 2018
BAB I

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.2 Rumusan Masalah

1. Apa yang diketahui tentang permainan tik tak toe?


2. Apa yang diketahui tentang Algoritma Minimax?
3. Bagaimana implementasi algritma Minimax pada permainan Tik Tak Toe?

1.3 Tujuan

1. Dapat mengetahui tentang permainan tik tak toe


2. Dapat mengetahui tentang algoritma minimax
3. Dapat memahami dan mengimplementasikan algoritma minimax pada permainan Tik
Tak Toe?
BAB II

PEMBAHASAN

A. Permainan Tik Tak Toe

Permainan tic-tac-toe merupakan permainan klasik berjenis permainan papan


(board-game) dengan ukuran 3x3. Cara memainkan Permainan tersebut dengan
memberikan Nilai X atau O pada tiap kotak papan. Dalam Permainan ini hasil
permainan yang didapat berupa menang, kalah, atau seri. Permainan ini mempunyai
beberapa varian, antara lain 3D (3 dimensi), 2D (2 dimensi) dan juga board
Permainans (permainan papan). Sejak tahun 1980an, permainan 3 dimensi semakin
banyak peminatnya karena mnemberikan efek visualisasi yang berbeda bagi pengguna
dan user experience yang berbeda pula jika dibandingkan dengan permainan 2
dimensi sehingga saat ini permainan 3 dimensi semakin dikembangkan dengan visual
dan sound yang dapat membuat permainan lebih real.

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 .

Aturan mainya, setiap pemain yang memiliki langkah pertama memiliki 3


opsi langkah, yaitu center, empty corner atau empty side. Walau nampaknya pemain
memiliki 9 buah opsi yang berbeda karena papan terdiri dari 9 buah kotak kosong,
namun jika papan diputar maka dapat dilihat bahwa seluruh corner memiliki nilai
yang sama secara strategis untuk langkah pertama. Begitu juga dengan setiap sisi
kosong. Langkah paling baik untuk pemain pertama adalah corner karena akan
membatasi pilihan pemain lawan.

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

Algortima Minimax merupakan algoritma yang digunakan untuk menentukan


pilihan agar memperkecil kemungkinan kehilangan nilai maksimal. Algoritma ini
diterapkan dalam permainan yang melibatkan dua pemain seperti tic-tac-toe, checkers,
go dan permainan yang menggunakan strategi atau logika lainnya. Hal ini berarti
permainan-permainan tersebut dapat dijelaskan sebagai suatu rangkaian aturan atau
premis.

Algoritma minimax merupakan algoritma yang sering digunakan dalam


permainan berbasis AI seperti permainan catur. AI yang ditanamkan dalam permainan
catur sudah sangat terkenal dimana AI tersebut dapat mengalahkan juara dunia. Pada
algoritma minimax, pengecekan akan dilakukan menurut rule yang ada sehingga
didapat seluruh kemungkinan yang ada sampai akhir permainan dilakukan.
Pengecekan tersebut akan menghasilkan pohon permainan yang berisi semua
kemungkinan dari permainan tersebut. Tentunya dibutuhkan resource yang berskala
besar untuk menangani komputasi pencarian pohon solusi tersebut berhubung
kombinasi kemungkinan untuk sebuah permainan catur pada setiap geraknya sangat
banyak sekali.

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.

C. Implementasi Algoritma pada Tik-Tak-Toe


Dalam perancangan aplikasi permainan tik-tak-toe dengan
mengimplementasi algoritma minimax dapat menggunakan aplikasi delphi. Terlebih
dahulu membuat rancangan tampilan dan fitur-fitur yang dibutuhkan dalam permainan
tersebut dilanjutkan pada tahap penulisan kode. Berikut hasil implementasinya,

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, jpeg, ExtCtrls;

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;

procedure btn11Click(Sender: TObject);

procedure btn12Click(Sender: TObject);

procedure btn13Click(Sender: TObject);

procedure btn21Click(Sender: TObject);

procedure btn22Click(Sender: TObject);

procedure btn23Click(Sender: TObject);

procedure btn31Click(Sender: TObject);

procedure btn32Click(Sender: TObject);

procedure btn33Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure btnResetClick(Sender: TObject);

procedure rdHVSCClick(Sender: TObject);

procedure rdHVsHClick(Sender: TObject);

procedure chckHumanStartsClick(Sender: TObject);

private
public

{ Public declarations }

end;

var

Form1: TForm1;

playmode:string;

playfield:array [1..3,1..3] of integer;

playButton:array [1..3,1..3] of tbutton;

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;

if form1.btn11.caption='' then playfield[1,1]:=0

else playfield[1,1]:=form1.btn11.tag;

if form1.btn21.caption='' then playfield[2,1]:=0

else playfield[2,1]:=form1.btn21.tag;

if form1.btn31.caption='' then playfield[3,1]:=0

else playfield[3,1]:=form1.btn31.tag;

if form1.btn12.caption='' then playfield[1,2]:=0

else playfield[1,2]:=form1.btn12.tag;

if form1.btn22.caption='' then playfield[2,2]:=0

else playfield[2,2]:=form1.btn22.tag;

if form1.btn32.caption='' then playfield[3,2]:=0

else playfield[3,2]:=form1.btn32.tag;

if form1.btn13.caption='' then playfield[1,3]:=0

else playfield[1,3]:=form1.btn13.tag;

if form1.btn23.caption='' then playfield[2,3]:=0


else playfield[2,3]:=form1.btn23.tag;

if form1.btn33.caption='' then playfield[3,3]:=0

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

aiout('~ Starting Cross strageties ~');

stragetyCross:=false;

if form1.scmind.Position < 2 then exit;

aiout('Stragety "Cross" 13-22-31 inizialised:');

if (playfield[1,3]=0)and ((playfield[3,1]=0) or (playfield[3,1]=1)) then

begin

aiout('Playing Stragety 13-22-31');

compselect(form1.btn13);

stragetycross:=true;

exit;

end;
aiout('Stragety "Cross" 13-22-31 canceled!');

aiout('Stragety "Cross" 31-13-13 inizialised:');

if (playfield[3,1]=0)and ((playfield[1,3]=0) or (playfield[1,3]=1)) then

begin

aiout('Playing Stragety 31-13-13');

compselect(form1.btn31);

stragetycross:=true;

exit;

end;

aiout('Stragety "Cross" 31-13-13 canceled');

aiout('Stragety 33-11-11 inizialised:');

if (playfield[3,3]=0)and ((playfield[1,1]=0) or (playfield[1,1]=1)) then

begin

aiout('Playing Stragety 11-22-33');

compselect(form1.btn33);

stragetycross:=true;

exit;

end;

aiout('Stragety "Cross" 33-11-11 canceled');

aiout('Stragety 11-33-33 inizialised:');

if (playfield[1,1]=0)and ((playfield[3,3]=0) or (playfield[3,3]=1)) then

begin

aiout('Playing Stragety 11-33-33');

compselect(form1.btn11);

stragetycross:=true;

exit;

end;

aiout('~ Cross-Stragety failed! ~');


end;

function stratetyDefend:boolean;

var x,y:short;

begin

aiout('~ Starting defence~');

stratetyDefend:=false;

if form1.scmind.Position < 2 then exit;

for y:=1 to 3 do

begin

aiout('Checking Strategy ' + inttostr(y) + ' for leaks');

if playfield[y,1]+playfield[y,2]+playfield[y,3]=4 then

begin

aiout('Leak in Row' + inttostr(y) + ' found');

for x:=1 to 3 do

if playfield[y,x]=0 then

begin

aiout('Possibility to defend in: '+ inttostr(x));

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

aiout('Checking Row ' + inttostr(y) + ' for leaks');


if playfield[1,y]+playfield[2,y]+playfield[3,y]=4 then

begin

aiout('Leak in Row' + inttostr(y) + ' found');

for x:=1 to 3 do

if playfield[x,y]=0 then

begin

aiout('Possibility to defend in: '+ inttostr(x));

playbutton[x,y].Caption:=form1.lblCurrent.caption;

playbutton[x,y].tag:=1;

stratetyDefend:=true;

exit;

end;

end;

end;

aiout('Checking Strategy 11-22-33 for leaks');

if playfield[1,1]+playfield[2,2]+playfield[3,3]=4 then

begin

aiout('Leak in Stragety 11-22-33 found!');

for x:=1 to 3 do

if playfield[x,x]=0 then

begin

aiout('Possibility to defend in: '+ inttostr(x) + '-' + inttostr(x));

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

aiout('Possibility to defend in: '+ inttostr(x) + '-' + inttostr(4-x));

playbutton[x,4-x].Caption:=form1.lblCurrent.caption;

playbutton[x,4-x].tag:=1;

stratetyDefend:=true;

exit;

end;

end;

aiout('~ No need of defence ~');

end;

function stragetyhor:boolean;

var x,y:short;

begin

stragetyhor:=false;

aiout('~ Starting stragety "Horizontal" ~');

for y:=1 to 3 do

begin

if playfield[y,1]+playfield[y,2]+playfield[y,3] <=1 then

for x:=1 to 3 do

if playfield[y,x]=0 then

begin

aiout('Playing stragety "Horizontal" in ' + inttostr(y));


playbutton[y,x].Caption:=form1.lblCurrent.caption;

playbutton[y,x].tag:=1;

result:=true;

exit;

end;

end;

aiout('~ Stragety "Horizontal" failed ~');

end;

function stragetyver:boolean;

var x,y:short;

begin

stragetyver:=false;

aiout('~ Begin stragety "Vertical" ~');

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

aiout('Playing Stragety "Vertical" in ' + inttostr(y));

playbutton[x,y].Caption:=form1.lblCurrent.caption;

playbutton[x,y].tag:=1;

result:=true;

exit;

end;

end;

aiout('~ Strategy "Vertical" failed ~');

end;
function Specialstragety:boolean;

var x:short;

begin

aiout('~ Starting Specialstragety ~');

result:=false;

if form1.scmind.Position < 3 then exit;

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

aiout('Specialstragety playable in' + inttostr(x) + ' 3');

playbutton[x,3].caption:=form1.lblcurrent.caption;

playbutton[x,3].Tag:=1;

result:=true;

exit;

end;

end

else

begin

if (playfield[x,2]=0) and (playfield[x,3]=1) then

begin

aiout('Specialstragety playable in ' + inttostr(x) + ' 2');

playbutton[x,2].caption:=form1.lblcurrent.caption;
playbutton[x,2].Tag:=1;

result:=true;

exit;

end;

end;

end

else

begin

if (playfield[x,1]=0) and (playfield[x,2]=1) and (playfield[x,3]=1) then

begin

aiout('Specialstragety playable in ' + inttostr(x) + ' 1');

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

aiout('Specialstragety playable in 3 ' + inttostr(x) );

playbutton[3,x].caption:=form1.lblcurrent.caption;
playbutton[3,x].Tag:=1;

result:=true;

exit;

end;

end

else

begin

if (playfield[2,x]=0) and (playfield[3,x]=1) then

begin

aiout('Specialstragety playable in 2 ' + inttostr(x) );

playbutton[2,x].caption:=form1.lblcurrent.caption;

playbutton[2,x].Tag:=1;

result:=true;

exit;

end;

end;

end

else

begin

if (playfield[1,x]=0) and (playfield[2,x]=1) and (playfield[3,x]=1) then

begin

aiout('Specialstragety playable in 1 ' + inttostr(x) );

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

if (form1.btn11.caption=form1.btn12.caption) and (form1.btn12.caption=form1.btn13.caption) and


(form1.btn13.caption<>'') then

begin

form1.btn11.Font.Color:=clred;

form1.btn12.Font.Color:=clred;

form1.btn13.Font.Color:=clred;

result:= form1.btn12.caption;

exit;

end;

if (form1.btn21.caption=form1.btn22.caption) and (form1.btn23.caption=form1.btn22.caption) and


(form1.btn23.caption<>'') then

begin

form1.btn21.Font.Color:=clred;

form1.btn22.Font.Color:=clred;

form1.btn23.Font.Color:=clred;

result:= form1.btn22.caption;

exit;

end;

if (form1.btn31.caption=form1.btn32.caption) and (form1.btn33.caption=form1.btn32.caption) and


(form1.btn33.caption<>'') then

begin

form1.btn31.Font.Color:=clred;
form1.btn32.Font.Color:=clred;

form1.btn33.Font.Color:=clred;

result:= form1.btn33.caption;

exit;

end;

if (form1.btn11.caption=form1.btn21.caption) and (form1.btn31.caption=form1.btn21.caption) and


(form1.btn31.caption<>'') then

begin

form1.btn21.Font.Color:=clred;

form1.btn11.Font.Color:=clred;

form1.btn31.Font.Color:=clred;

result:= form1.btn21.caption;

exit;

end;

if (form1.btn12.caption=form1.btn22.caption) and (form1.btn32.caption=form1.btn22.caption)


and(form1.btn32.caption<>'') then

begin

form1.btn12.Font.Color:=clred;

form1.btn22.Font.Color:=clred;

form1.btn32.Font.Color:=clred;

result:= form1.btn22.caption;

exit;

end;

if (form1.btn13.caption=form1.btn23.caption) and (form1.btn23.caption=form1.btn33.caption) and


(form1.btn33.caption<>'') then

begin

form1.btn13.Font.Color:=clred;

form1.btn23.Font.Color:=clred;

form1.btn33.Font.Color:=clred;

result:= form1.btn33.caption;
exit;

end;

if (form1.btn11.caption=form1.btn22.caption) and(form1.btn33.caption=form1.btn22.caption) and


(form1.btn33.caption<>'') then

begin

form1.btn22.Font.Color:=clred;

form1.btn33.Font.Color:=clred;

form1.btn11.Font.Color:=clred;

result:= form1.btn11.caption;

exit;

end;

if (form1.btn31.caption=form1.btn22.caption) and (form1.btn13.caption=form1.btn22.caption) and


(form1.btn13.caption<>'') then

begin

result:= form1.btn22.caption;

exit;

end;

bat:=true;

for x:= 1 to 3 do //Cek jika draw

for y:=1 to 3 do

if playfield[x,y]=0 then bat:=false;

if bat= true then

begin

result:= 'Nobody';

exit;

end;

result:=''; // tidak ada yang menang


end;

procedure compplay;

var x,y:short;

begin

if form1.scmind.position = 1 then //Level terendah

begin

for x:=1 to 3 do

for y:=1 to 3 do

begin

aiout ('Low Lewel Choice: ' + inttostr(x) + '-' + inttostr(y));

if playfield[x,y]=0 then

begin

playbutton[x,y].Caption := form1.lblcurrent.caption;

playbutton[x,y].tag:=1;

exit;

end;

end;

end;

if not specialstragety then

if (stratetyDefend=false) then //High priority operation

begin

if playfield[2,2]=0 then //Start cross stragety

begin

compselect(form1.btn22); // Get 2-2 Field

exit;

end
else

begin

if form1.btn22.tag=1 then //If occupied by PC

begin

if StragetyCross = true then exit; //Play Stragety "Cross"

end

else

if stragetyhor = true then exit;

end;

if stragetyhor = true then exit; //Play stragety "Horizontal"

if stragetyver = true then exit; //Play stragety "Vertical"

for x:=1 to 3 do //Otherwise try first possible

for y:=1 to 3 do

begin

aiout ('Check "Nonsenese" stragety: ' + inttostr(x) + '-' + inttostr(y));

if playfield[x,y]=0 then

begin

playbutton[x,y].Caption := form1.lblcurrent.caption;

playbutton[x,y].tag:=1;

if iswon <>'' then form1.lblstatus.caption:= iswon + ' has won'; //Won?

exit;

end;

end;

if iswon <>'' then form1.lblstatus.caption:= iswon + ' has won'; //Won?

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.lblStatus.caption:=''; //Reset the caption

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;

if form1.lblCurrent.Caption= 'X' then form1.lblCurrent.Caption:='O'

else form1.lblCurrent.Caption:='X'; //Next turn

end;

form1.memai.Lines.clear; //AI filed reset

end;

procedure PlayerPlays(Btn:Tbutton);
begin

if btn.Caption <> '' then // Is the field already occupied?

begin

application.MessageBox('Fild is already occupied!','');

exit;

end;

if form1.lblstatus.caption <> '' then // Is the game still runnung

begin

application.messagebox('The game has ended!','');

exit;

end;

btn.caption:=form1.lblCurrent.caption; // Put O or X

btn.Tag:=2; // Mark as played by Human

if form1.lblCurrent.Caption= 'X' then form1.lblCurrent.Caption:='O' //after X comes o and v.v.

else form1.lblCurrent.Caption:='X';

if playmode='HumanVSHuman' then // Determine if Playmode is Human VS Human

begin

if iswon <> '' then form1.lblstatus.caption:= iswon + ' has won!';

aiout('Analyse: ' +inttostr(situation));

exit;

end;

buildplayfield; // H VS CPU

compPlay; // CPU plays

if iswon <>'' then form1.lblstatus.caption:= iswon + ' has won'; //Won?


if form1.lblCurrent.Caption= 'X' then form1.lblCurrent.Caption:='O' //Print next player

else form1.lblCurrent.Caption:='X';

aiout('Anylse: ' +inttostr(situation)); //Put Analyse

end;

procedure TForm1.btn11Click(Sender: TObject);

begin

playerplays(form1.btn11);

end;

procedure TForm1.btn12Click(Sender: TObject);

begin

playerplays(form1.btn12);

end;

procedure TForm1.btn13Click(Sender: TObject);

begin

playerplays(form1.btn13);

end;

procedure TForm1.btn21Click(Sender: TObject);

begin

playerplays(form1.btn21);

end;

procedure TForm1.btn22Click(Sender: TObject);

begin

playerplays(form1.btn22);
end;

procedure TForm1.btn23Click(Sender: TObject);

begin

playerplays(form1.btn23);

end;

procedure TForm1.btn31Click(Sender: TObject);

begin

playerplays(form1.btn31);

end;

procedure TForm1.btn32Click(Sender: TObject);

begin

playerplays(form1.btn32);

end;

procedure TForm1.btn33Click(Sender: TObject);

begin

playerplays(form1.btn33);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

playmode:='HumanVSCpu'; //Standard Playmode

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;

resetAll; // Reset all

end;

procedure TForm1.btnResetClick(Sender: TObject);

begin

resetall;

end;

procedure TForm1.rdHVSCClick(Sender: TObject);

begin

if rdhvsc.Checked= true then playmode:='HumanVSCpu';

end;

procedure TForm1.rdHVsHClick(Sender: TObject);

begin

if rdhvsh.Checked= true then playmode:='HumanVSHuman';

end;

procedure TForm1.chckHumanStartsClick(Sender: TObject);

begin

application.MessageBox('A new game will be started!','');

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

Anonyme, 200, Borland Delph (Embarcadero Delphii, http://en.wikipedia.org/wiki


/Embarcadero_Delphi.
Anonyme, 2010, Komponen Di Delhi,http://www.bringinfo.co.cc/2010/03/komponendi-
delphi.html.
Hidayat, R. A. H., Rasmana, S. T., & Susanto, P. 2013. KECERDASAN KOMPUTER
PADA PERMAINAN TIC TAC TOE DENGAN METODE GAME TREE. Journal of
Control and Network Systems, 2(1), 16–25.
Matthew, R. 2017. Aplikasi Pohon Keputusan pada Permainan Tic Tac Toe.
http://web.if.unila.ac.id/purmanailuswp/2015/09/13/pengertian-artificial-intelligence-
kecerdasan-buatan/

Anda mungkin juga menyukai