Game Arcade Ball
Initial State
Game Arcade Ball ini meruapakan game modifikasi dari contoh game yang disediakan Strawberry Prolog, dengan judul Horrible Racing. Arcade Ball adalah permainan yang bertujuan untuk menghindari objek yang turun dari atas ke bawah yang objek nya turun di tempat secara random juga kecepatan objek yang turun semakin cepat.
Pada game Arcade Ball yang penulis kembangkan menggunakan latar belakang dan objek yang telah di ubah menjadi konsep bola “ball”. Sama seperti permainan horrible racing, permainan ini harus menghindari runtuhan objek yang turun kebawah secara random tempat maupun kecepatannya.
Game ini mempunyai 3 buah menu, yaitu Mulai, tentang dan keluar. Fungsi dari masing-masing tombol adalah:
- Mulai untuk memulai permainan baru, ini bisa digunakan jika permainan telah selesai atau hanya jika ingin mengulang permainan yang sama.
- tentang, berisi informasi singkat tentang penulis selaku pengembang game Arcade Ball
- Keluar, merupakan menu yang bertujuan untuk keluar dari permainan.
Pemain juga mempunyai kesempatan sampai 5 kali tertabrak atau tertimpa objek runtuhan sebelum kalah, atau pemain punya 5 nyawa selama permainan.
Rules
Aturan permainan yang
digunakan pada game ini adalah pemain hanya cukup menghindari objek runtuhan
yang jatuh dari atas kebawah menggunakan arah kanan dan kiri pada keyboard
sampai score mencapai 100 dengan maksimal tertabrak atau tertimpa objek
runtuhan sebanyak 5 kali.
Goal
Goal
atau tujuan dalam game Arcade Ball adalah berusaha untuk menghindari objek
runtuhan yang turun dari bawah ke atas sampai score mencapai 100
Screenshot
1. Tampilan awal game
2. Tampilan saat bermain
3. Tampilan jika menang
4. Tampilan jika kalah
5. Tampilan jika ingin keluar dari game
Konsep AI
Artificial
Inteligence(AI)
Game
adapatasi dari horrible racing ini memang telah menggunakan AI sebagai lawan.
Pada dasarnya AI merupakan ’penurunan’ sifat manusia kepada komputer, jadi
komputer bisa memberikan respon secara cerdas seperti layaknya pada manusia itu
sendiri.
Dalam
permainan ini AI nya sebagai objek menyerupai batu bata yang jatuh dari atas ke
bawah secara random
Algoritma
Dalam
permainan ini, algoritma yang digunakan adalah algoritma minimax. Algoritma
minimax adalah salah satu algoritma yang digunakan dalam cabang ilmu komputer,
fungsi atau cara kerja dari algoritma ini adalah berusaha untuk menjatuhkan
objek runtuhan di tempat yang random agar user kesulitan untuk menghindari
objek tersebut.
Dengan
memanfaatkan algoritma, game Arcade Ball menjadi lebih interaktif karena kita
sebagai pemain akan bermain selayaknya seperti melawan komputer
Pemain
sebagai user mencoba untuk menghindari
runtuhan objek, namun komputer akan memberikan perlawan dengan menjatuhkan
objek runtuhan untuk menimpa user agar user kalah.
Listing Program
?-
G_Lifes:=5,
G_Counter:=0,
G_Times:=0,
G_Waktu:=100,
G_Score:=0,
G_Depth:=10,
G_Crashed:=0,
G_Col1:=0, G_Col2:=0, G_Col3:=0,
G_Pos:=2,
G_OldPos:=GPos,
G_Pen0:= pen(1, rgb(155, 155, 255)),
G_Pen1:= pen(1, rgb(0, 0, 255)),
G_Brush0:= brush(rgb(255, 255, 0)),
G_Brush1:= brush(rgb(255, 255, 0)),
G_Brush2:= brush(rgb(255, 200, 0)),
window(G_Wnd, _, win_func(_), "Arcade Ball", 500, 80, 220, 610).
%Jendela menu
win_func(init):-
menu( pop_up, _, _, menu_func(_), "Menu"),init_data,random.
win_func(init) :-
menu(pop_up, _, _,help(_),"About"),init_data,random.
win_func(close)
-
not( yes_no("Keluar","Yakin ingin keluar?", ?)).
%Tombol permainan hanya arah,
menghapus mouse click
win_func(key_down(37, _)) :-
(G_Pos > 1 -> G_OldPos:=G_Pos, G_Pos:=G_Pos - 1), draw_car.
win_func(key_down(39, _)) :-
(G_Pos < 3 -> G_OldPos:=G_Pos, G_Pos:=G_Pos + 1), draw_car.
win_func(paint):-
draw.
%Blok objek berpindah
draw_car:-
pen(G_Pen0), brush(G_Brush0),
rect(0, 0, 0, 5000), %batas pergerakan dari player
Pos:=G_Pos*60- 40,%pos 2 = tengah, pos 3 = kanan, pos 1 = kiri
pen(G_Pen1), brush(G_Brush1),
draw_bitmap(Pos,420,bitmap_image("Back2.bmp",_), _, _),
Pos:=G_Pos*60- 40,
brush(G_Brush2).
%Blok objek sebelum pindah
draw:-
pen(G_Pen0), brush(G_Brush0),
rect(0, 0, 300, 600),
draw_bitmap(0,0,bitmap_image("Back2.bmp",_),_,_),
%Background
color_text_back(G_Wnd, rgb(125, 125, 125)),
color_text(G_Wnd, rgb(10, 10, 0)),
text_out(10, 500, "Time : "+print(G_Waktu)),%Output Text
text_out(10, 515, "Score : "+print(G_Score)),
text_out(10, 530, "Lifes : "+print(G_Lifes)),
Pos:=G_Pos*60- 40,
pen(G_Pen1), brush(G_Brush1),
draw_bitmap(Pos,420,bitmap_image("ORANG2.bmp",_), _, _),%Player Objek
brush(G_Brush2),
Mask:= 1 << (G_Depth- 1),
for(I, 1, G_Depth),
(
(G_Col1 /\ Mask > 0 -> round_rect(20, I*40- 20, 60, I*40, 10, 10)),%pergerakan pada
kolom1 ke bawah dengan perulangan
(G_Col2 /\ Mask > 0 -> round_rect(80, I*40- 20, 120, I*40, 10, 10)),%pergerakan pada
kolom2 ke bawah dengan perulangan
(G_Col3 /\ Mask > 0 -> round_rect(140, I*40- 20, 180, I*40, 10, 10)),%pergerakan pada
kolom3 ke bawah dengan perulangan
Mask:= Mask >> 1, fail %Mask := 1 (Biner := 0001)
).
%Kec mobil
time_func(end):-
G_Counter:=G_Counter+1,
(G_Counter >= G_Times ->
G_Waktu := G_Waktu-1,
G_Score:=G_Score+1,
G_Crashed:=0,
Pos:=random(300) // 100 + 1, put_trap(Pos),
once(crash(Z)),
(Z =:= G_Pos -> beep("Wui.wav"), G_Lifes:= G_Lifes- 1, G_Crashed:=3),%Saat terjadi
crash, mengeluarkan suara, lifes-1
(G_Lifes
= 0 -> kill_timer(G_Wnd, G_Timer),message("Maaf!!!","Maaf Anda Kalah",i)),
(G_Waktu = 0 -> kill_timer(G_Wnd, G_Timer),message("Selamat!!!","Selamat Anda
Menang",!),
write("back to menu")),
G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1, G_Col3:=G_Col3>>1,
G_Counter:=0,
G_Times:= (200- G_Score) // 40,
draw
).
put_trap(1):- G_Col1:= G_Col1 \/ (1 << G_Depth).
put_trap(2):- G_Col2:= G_Col2 \/ (1 << G_Depth).
put_trap(3):- G_Col3:= G_Col3 \/ (1 << G_Depth).
crash(1):- G_Col1 /\ 1 > 0, G_Pos =:= 1.
crash(2):- G_Col2 /\ 1 > 0, G_Pos =:= 2.
crash(3):- G_Col3 /\ 1 > 0, G_Pos =:= 3.
crash(4).
%Menu
menu_func(init) :-
menu( normal, _, _, new(_),
"&Mulai"),
menu( separator, _, _, fail(_),_),
menu( normal, _, _, exit(_),
"&Keluar").
%Menu Mulai!
new(press) :-
G_Lifes:=5,
G_Counter:=0,
G_Times:=0,
G_Waktu :=100,
G_Score:=0,
G_Depth:=10,
G_Crashed:=0,
G_Col1:=0, G_Col2:=0, G_Col3:=0,
G_Pos:=2,
G_OldPos:=G_Pos,
G_Timer:=set_timer(G_Wnd, 0.10, time_func).
%Menu Press
exit(press) :-
close_window(_).
win_func(close):-
ask.
ask:-
yes_no( "Keluar","Yakin Mau
selesai", ?),
!,message("Bye~", "Terima
Kasih ",!),
end.
ask:-
message("No", "Masih Mau
Bermain?", s).
%Menu Tentang
help(init) :-
menu(normal, _, _,
langkah_dalam_bermain(_),"&Tentang"),
menu(separator, _,_,fail(_),_).
%About
langkah_dalam_bermain(press):-
window( _, _, cara_func(_), "tentang
Permainan", 110, 150, 900, 200).
cara_func(paint):-
text_out(70,30," Name : Rachman Aji"),
text_out(70,50," NPM : 58411572"),
text_out(70,70," Class : 3 IA 15"),
text_out(70,90," Universitas
Gunadarma"),
text_out(70,110," Tugas
Project Game: Horrible Racing to Arcade Ball"),
text_out(70,130," Selamat
Bermain"),
fail.
Death Race
Initial State
Game Death Race! Ini
merupakan pengembangan lebih lanjut dari contoh game Horrible Racing yang ada
pada Strawberry Prolog Pada Umumnya. Game ini memiiliki tujuan untuk menghindari
trap atau jebakan yang datang sebisa dan selama mungkin. Game Death Race ini
memilki duah buah karakter yaitu player dan trap. Player berusaha menghindari
trap yang datang, dan trap akan ditempatkan berdasarkan posisi player. Namun di
sini juga terdapat penambahan karakter ke tiga yang berfungsi sebagai Enemy
dengan tugas yang sama dengan player yaitu menghindari trap ditambah juga
dengan tugas tambahan yaitu mengurangi ruang gerak player untuk menghindari
trap.
Pada Interface awal terdapat
tampilan “Welcome to Death Race!”. Dan juga terdapat dua buah button yaitu
button “PLAY GAME” untuk memuali permainan baru, dan button “EXIT” untuk keluar
dari permainan.
Kemudian ketika kita
mengklik tombol “PLAY GAME” maka akan langsung masuk ke form 2 yaitu arena
permainan. Disinilah tempat Player yang berwarna hijau melawan enemy yang
berwarna kuning untuk menghindari Trap yang berwarna merah.
Pada bagian menu bar di
sebelah kiri atas, terdapat tiga buah menu yaitu: Menu “About”, menu “Help”,
dan menu “Close”.
Menu “About” merupakan menu
untuk menampilkan identitas dari pengembang game Death Race!.
Menu “Help” merupakan menu
untuk mengakses aturan dan cara bermain game Death Race!. Dan nenu “Close” merupakan
menu untuk keluar dari permainan.
Rules
1. Menggunakan
controler Left adn Right pada ketboard untuk mengendalikan player berpindah ke
kiri dan ke kanan.
2. Berusaha
untuk bertahan selama dan sebisa mungkin untuk menghindari trap yang datang.
3. Berhati
hatilah dengan pergerakan Enemy yang juga menghindari trap namun juga berusaha
untuk memojokan player agar terkena trapp.
4. Jika
life dari player telah habis maka permainan akan berakhir.
Goal
Dalam permaina game Death
Race ini memilki tujan akhir adalah berusaha mengumpulkan score sebanyak
mungkin dan bertahan selama mungkin agar tidak terkena trap maupun terjebak
oleh enemy agar mengenai trap.
Screen Shot jika permainan
telah selesai karena life telah habis
Konsep AI
AI
Pada dasarnya game Horrible Racing merupakan game single player atau permainan yang hanya dimainkan oleh satu pemain, dimana hanya terdapat satu player yang berusaha menghindari trap yang datang. Akan tetepai pada game Death Race ini penulis mencoba mengembangkan permainan dengan membuat karakter baru sebagai lawan dari karakter pemain dengan tujuan untuk menyulitkan pergerakan karakter pemain. Karakter yang telah dibentuk tidak akan dapat berjalan jika tidak adanya kendali dari bahasa pemrograman. Kendali yang ditanamkan pada pemrogrman disebut AI (Artificial Intelligence) yaitu kecerdasan buatan, dimana AI akan mengontrol pergerakan karater yang sudah dibuat dalam menentukan jalur jalur perpindahan agar tidak terkena trap dan dapat memlih perpindahan yang sesuai agar karakter pemain terjebak.
Algoritma
Algoritma adalah suatu teknik dalam kumpulan perintah untuk menyelesaikan suatu masalah. Perintah-perintah ini dapat diterjemahkan secara bertahap dari awal hingga akhir. Masalah tersebut dapat berupa apa saja, dengan catatan untuk setiap masalah, ada kriteria kondisi awal yang harus dipenuhi sebelum menjalankan algoritma.
Dalam permainan ini AI menggunakan algoritma Branch and Bound, algoritma ini mendukung perhitungan untuk memukan jalan terbaik menghindari trap dan posisi terbaik untuk menjebak karakter pemain. Hal ini tidak didapat dari algoritma lain seperti DFS dan brute force. Dan algoritma Branch and Bound pada game Death Race sebagai berikut :
time_func(end):-
G_Counter:=G_Counter+1,
(G_Counter
>= G_Times ->
G_Score:=G_Score+1,
G_Crashed:=0,
%G_CrashedX:=0,
Pos:=random(400)
// 100 + 1,
put_trap(Pos),
once(crashX(ZX)),
(ZX
=:= G_PosX->
(G_PosX
=:= G_Pos - 1 ;
G_PosX=:= 1 ->
G_PosX:=
2
else
G_OldPosX:=random(2)
+ 1,
(G_OldPosX
=:= 2 -> G_OldPosX :=
G_Pos - 1),
G_PosX
:= G_OldPosX
), beep("plus\\moveenemy.wav")
%G_CrashedX:=3, G_LifesX:= G_LifesX - 1
),
once(crash(Z)),
(Z
=:= G_Pos ->
beep("plus\\trap.wav"),
G_Lifes:= G_Lifes- 1,
G_Crashed:=3
),
(G_Lifes =< 0 ->
kill_timer(G_Form2,
G_Timer),
message("Game
Over!","you're a coward, try
again!",!)
),
G_Col1:=G_Col1>>1,
G_Col2:=G_Col2>>1,
G_Col3:=G_Col3>>1,
G_Col4:=G_Col4>>1,
G_Counter:=0,
G_Times:= (200-
G_Score) // 40,
draw
).
Listing
?-
%==============
Pendeklarasian ================%
G_Lifes:=10,%life
%G_LifesX:=100,
G_Counter:=0,
G_Times:=5,%lama muncul
penghalang
G_Score:=0,%score
G_Depth:=10,%tinggi trap
G_Crashed:=0,%crash
%G_CrashedX:=0,
G_Col1:=0, G_Col2:=0,
G_Col3:=0, G_Col4:=0,
%posisi awal
G_Pos:=4,
G_OldPos:=G_Pos,
G_PosX:=1,
G_OldPosX:=G_PosX,
%warna dan latar
G_Pen0:= pen(1, rgb(0, 0, 0)),
G_Pen1:= pen(1, rgb(0, 0, 0)),
G_Brush0:= brush(rgb(20, 20, 20)),
G_Brush1:= brush(rgb(0, 255, 0)),
G_Brush2:= brush(rgb(255, 255, 0)),
G_Brush3:= brush(rgb(255, 0, 0)),
G_Road is bitmap_image("Plus\\road.bmp",_),
G_Background is bitmap_image("Plus\\background.bmp",_),
%==============
pembuatan tampilan awal dan menu button================%
window(G_Form1, _, win_func(_), "Welcome to
Death Race!", 200,80,570,329).
win_func(paint):-
draw_bitmap(0,0,G_Background ,_,_).
win_func(init):-
button(_,_,pygame(_),"PLAY
GAME",25,230,200,40),
button(_,_,exgame(_),"EXIT",329,230,200,40).
pygame(press):-
window(G_Form2, _, win_play(_), "Death
Race!", 200,80,280,620),
close_window(G_Form1),
update_window(_).
win_play(init):-
menu(normal, _, _, mabout(_),"&About"),
menu(normal, _, _, mhelp(_),"&Help"),
menu(popup, _, _, msetup(_),"&Setup"),
menu(normal, _, _, mclose(_),"&Close"),
G_Timer:=set_timer(G_Form2, 0.25, time_func).
%==============
Control player ================%
%pindah ke kiri
player
win_play(key_down(37, _)) :-
(G_Pos > G_PosX + 1 -> G_OldPos:=G_Pos, G_Pos:=G_Pos - 1), draw.
%pindah ke kanan
player
win_play(key_down(39, _)) :-
(G_Pos < 4 -> G_OldPos:=G_Pos, G_Pos:=G_Pos + 1), draw.
%==============
Pembuatan Objek ================%
win_play(paint):- draw.
draw:-
draw_bitmap(0,0,G_Road ,_,_),
pen(G_Pen0), brush(G_Brush0),%warna latar
rect(0, 500, 280, 620),%ukuran latar
color_text_back(G_Form2, rgb(20, 20, 20)),%warna
bacgruound score dan life
color_text(G_Form2, rgb(255, 255, 255)),%warna tulisan
score dan life
font(13,15,"Calibri"),
text_out(150, 512, "Score : "+print(G_Score)),%Posisi untuk
print score player
text_out(150, 530, "Lifes : "+print(G_Lifes)),%Possisi untuk
print lifes player
font(13,30,"Calibri"),
text_out(10, 510, "Death Race"),
Pos:=G_Pos*60- 40,
PosX:=G_PosX*60- 40,
pen(G_Pen1), brush(G_Brush1),
ellipse(Pos, 420, Pos+40, 460),
pen(G_Pen1), brush(G_Brush2),
ellipse(PosX, 420, PosX+40, 460),
brush(G_Brush3),
Mask:= 1 << (G_Depth- 1),
for(I, 1, G_Depth),
(
(G_Col1 /\ Mask > 0 -> round_rect(20, I*40- 20, 60, I*40, 10, 10)),
(G_Col2 /\ Mask > 0 -> round_rect(80, I*40- 20, 120, I*40, 10, 10)),
(G_Col3 /\ Mask > 0 -> round_rect(140, I*40- 20, 180, I*40, 10, 10)),
(G_Col4 /\ Mask > 0 -> round_rect(200, I*40- 20, 240, I*40, 10, 10)),
Mask:= Mask >> 1, fail
).
%==============
AI buat trap ================%
time_func(end):-
G_Counter:=G_Counter+1,
(G_Counter >= G_Times ->
G_Score:=G_Score+1,
G_Crashed:=0,
%G_CrashedX:=0,
Pos:=random(400) // 100 + 1, put_trap(Pos),
once(crashX(ZX)),
(ZX =:= G_PosX->
(G_PosX =:= G_Pos - 1 ; G_PosX=:= 1 ->
G_PosX:= 2
else
G_OldPosX:=random(2) + 1,
(G_OldPosX =:= 2 -> G_OldPosX := G_Pos - 1),
G_PosX := G_OldPosX
), beep("plus\\moveenemy.wav") %G_CrashedX:=3,
G_LifesX:= G_LifesX - 1
),
once(crash(Z)),
(Z =:= G_Pos ->
beep("plus\\trap.wav"), G_Lifes:= G_Lifes- 1, G_Crashed:=3
),
(G_Lifes =< 0 ->
kill_timer(G_Form2, G_Timer),
message("Game
Over!","you're a coward, try again!",!)
),
G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1,
G_Col3:=G_Col3>>1, G_Col4:=G_Col4>>1,
G_Counter:=0,
G_Times:= (200- G_Score) // 40,
draw
).
put_trap(1):- G_Col1:= G_Col1 \/ (1 << G_Depth).
put_trap(2):- G_Col2:= G_Col2 \/ (1 << G_Depth).
put_trap(3):- G_Col3:= G_Col3 \/ (1 << G_Depth).
put_trap(4):- G_Col4:= G_Col4 \/ (1 << G_Depth).
crash(1):- G_Col1 /\ 1 > 0, G_Pos =:= 1.
crash(2):- G_Col2 /\ 1 > 0, G_Pos =:= 2.
crash(3):- G_Col3 /\ 1 > 0, G_Pos =:= 3.
crash(4):- G_Col4 /\ 1 > 0, G_Pos =:= 4.
crash(5).
crashX(1):- G_Col1 /\ 1 > 0, G_PosX =:= 1.
crashX(2):- G_Col2 /\ 1 > 0, G_PosX =:= 2.
crashX(3):- G_Col3 /\ 1 > 0, G_PosX =:= 3.
crashX(4):- G_Col4 /\ 1 > 0, G_PosX =:= 4.
crashX(5).
%==============
Pembuatan Main Menu ================%
mabout(press):-
window( _, _, habout(_), "About
Me", 100, 150, 400, 200).
habout(paint):-
font(13,20,"Calibri"),
text_out(10,35," Nama Project : Death Race "),
text_out(10,55," Nama : Maulana Ruswa "),
text_out(10,75," Kelas : 3IA15 "),
text_out(10,95," NPM : 54411357 "),
fail.
habout(paint):-
font(13,25,"Calibri"),
color_text(_, rgb(70,200,70)),
text_out(20,10,"About Me :"),
button( _, _, oabout(_), "OK", 180, 120, 80, 30),
fail.
oabout(press) :-
close_window(parent(_)).
mhelp(press):-
shell_execute("help.html").
mclose(press):-
close_window(G_Form2),
update_window(G_Form1).
exgame(press):-
close_window(G_Form1),
fail.
Nama : Sinta Novianka
Kelas : 3IA14
NPM : 58413503










Tidak ada komentar:
Posting Komentar