Game Kapal Perang
Teknologi kian
berkembang masa kini hal ini dikarenakan oleh kebutuhan manusa yang semakin
bertambah dan bervariasi. Salah satu kebutuhan penting yang harus dimiliki oleh
setiap manusia adalah hiburan. Hiburan
tersebut dapat dipenuhi oleh hasil dari teknologi, yang dapat berupa game dari
skala kecil maupun besar sangat bervariasi, yang dapat dimainkan oleh siapa
saja tanpa memandang umur , dari anak-anak hingga orang dewasa. Pada projek
ini, penulis akan membahas “game
kapal perang”.
Kemudian
pada kali ini saya menggunakan program aplikasi untuk game kapal perang saya menggunakan bahasa pemrograman strawberry prolog yang dimana game ini
merupakan game kecerdasan
buatan yang dimana semua orang bisa masuk dalam game ini khususnya untuk
kalangan anak – anak dengan mudahnya.
Source Code game Kapal Perang
% Project PKB kelompok 1
% Gunadarma 3IA22
?-G_HighScore := 0, G_LastShipWay := 0,
G_player_color:=brush(rgb(0,0,128)), G_enemy_color:=brush(rgb(0,128,255)), G_Red:=brush(rgb(255,100,100)),
window( _, _, win_func(_), "Star Wars", 100, 100, 490, 410).
first_sleeping_paint.
width(480) :- !.
height(380) :- !.
%dead or alive?
dead.
%ship data:
ship_half_width(20) :- !.
ship_height(25) :- !.
ship_minship(70) :- !.
%enemies:
enemy_ships([]).
enemy_bombs([]).
%speed:
speed(10) :- !.
%G_EnemySpeed
player_bomb_speed(15) :- !.
%player:
player_bombs([]).
%way of the last ship:
%G_LastShipWay
%difficulty:
%G_Difficulty
%difficulty(1000).
die(_) :- !, assert(first_sleepint_paint), assert(dead).
start_game(P, S, PTS) :- !,
retract(dead),
retract(enemy_ships(_)), assert(enemy_ships([])),
retract(enemy_bombs(_)), assert(enemy_bombs([])),
width(W), height(H), X is W >> 1, Y is H - 1,
G_D := 0,
G_X := X,
G_Y := Y,
%retract(player_ship(_,_,_)), assert(player_ship(null, X, Y)),
retract(player_bombs(_)), assert(player_bombs([])),
(paused -> retract(paused)),
G_Difficulty := P,
G_EnemySpeed := S,
G_DirectionTimer := 0,
G_PTS := PTS,
G_Score := 0,
update_window(_).
is_in_ship(X, Y, PX, PY) :- !,
ship_left(X) =< PX,
ship_right(X) >= PX,
ship_up(Y) =< PY,
ship_down(Y) >= PY.
crash(X1, Y1, X2, Y2) :- !,
TX1 is ship_left(X1),
TX2 is ship_right(X1),
TY1 is ship_up(Y1),
TY2 is ship_down(Y1),
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2).
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY2), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY2), !.
%border coordiates inside a ship:
R is ship_up(int Y) :- !, ship_height(SH), R0 is Y - SH, R is R0 + 1.
R is ship_down(int Y) :- !, R is Y.
R is ship_left(int X) :- !, ship_half_width(SHW), R is X - SHW.
R is ship_right(int X) :- !, ship_half_width(SHW), R is X + SHW.
add_enemy(_) :- X is G_LastShipWay, ship_minship(Y), X > Y,
R0 is random(1000), R1 is G_Difficulty, R2 is R1 >> 1, R0 < R2, !,
width(W), ship_half_width(HW), W1 is W - HW - HW, XNEW is random(W1) + HW,
enemy_ships(L), random_left_right(D), ship_height(SHH), L1 is [ship(D, XNEW, SHH)|L],
retract(enemy_ships(_)), assert(enemy_ships(L1)),
G_LastShipWay := 0.
add_enemy(_) :- !.
random_left_right(X) :- Y is random(1000), Y < 500, !, X is left.
random_left_right(right) :- !.
fire_enemy(X, Y) :- R0 is random(1000), R1 is G_Difficulty, R2 is R1 >> 2, R0 < R2, !,
enemy_bombs(L), random_speed(S), L1 is [bomb(S, X, Y)|L],
retract(enemy_bombs(_)), assert(enemy_bombs(L1)).
fire_enemy(X, Y) :- !.
random_speed(S) :- !, S0 is G_EnemySpeed, S1 is S0 / 4, S2 is S0 * 1.5, S3 is S1 * 1000, S4 is S2 * 1000,
S5 is S4 - S3, INTS5 is integer(S5), R0 is random(INTS5) + S3, S is R0 / 1000.
fire_player(_) :- firing, !, retract(firing), player_bombs(L), X is G_X, Y is G_Y, ship_height(SH), Y1 is Y - SH - 7,
(autofire -> AutoFire := 1 else AutoFire := 0), L1 is [bomb(AutoFire, X, Y1)|L],
retract(player_bombs(_)), assert(player_bombs(L1)).
fire_player(_) :- !.
update_positions(_) :- !, update_enemies(_), update_bombs(_), update_player_bombs(_), update_player(_).
% {{ UPDATE_ENEMIES:
update_enemies(_) :- !, enemy_ships(L), update_enemy(L, R), retract(enemy_ships(_)), assert(enemy_ships(R)).
update_enemy([], []) :- !.
update_enemy([ship(D, X, Y)|T], R) :- height(H), S is G_EnemySpeed, Y1 is ship_down(Y + S), Y1 > H, !, update_enemy(T, R).
update_enemy([ship(D, X, Y)|T], [ship(D, RX, RY)|R]) :- S is G_EnemySpeed, preserve_direction(D, S, X, RX), !, RY is Y + S, update_enemy(T, R).
update_enemy([ship(D, X, Y)|T], [ship(RD, X, RY)|R]) :- !, S is G_EnemySpeed, RY is Y + S, opposite(D, RD), update_enemy(T, R).
preserve_direction(left, S, X, RX) :- !, RX is X - S, ship_left(RX) >= 0.
preserve_direction(right, S, X, RX) :- !, RX is X + S, width(W), ship_right(RX) < W.
opposite(left, right) :- !.
opposite(right, left) :- !.
% }}
%update enemy bombs:
update_bombs(_) :- !, enemy_bombs(L), update_bomb(L, R), retract(enemy_bombs(_)), assert(enemy_bombs(R)).
update_bomb([], []) :- !.
update_bomb([bomb(S, X, Y)|T], R) :- height(H), Y1 is Y + S, Y1 > H, !, update_bomb(T, R).
update_bomb([bomb(S, X, Y)|T], [bomb(S, X, RY)|R]) :- !, RY is Y + S, update_bomb(T, R).
%update player bombs:
update_player_bombs(_) :- !, player_bombs(L), update_player_bomb(L, R), retract(player_bombs(_)), assert(player_bombs(R)).
update_player_bomb([], []) :- !.
update_player_bomb([bomb(_, X, Y)|T], R) :- player_bomb_speed(S), Y1 is Y - S, Y1 < 0, !, update_player_bomb(T, R).
update_player_bomb([bomb(AutoFire, X, Y)|T], [bomb(AutoFire, X, RY)|R]) :- !, player_bomb_speed(S), RY is Y - S, update_player_bomb(T, R).
%update player:
update_player(_) :- G_DirectionTimer > 0, !, D is G_D, X is G_X, Y is G_Y, speed(S), update_player_impl(S, D, X, Y, RX, RY), G_X := RX, G_Y := RY.
update_player(_) :- !.
update_player_impl(S, 1, X, Y, X, RY) :- Y0 is Y - S, ship_up(Y0) < 0, !, ship_height(RY).
update_player_impl(S, 1, X, Y, X, RY) :- !, RY is Y - S.
update_player_impl(S, 4, X, Y, X, RY) :- Y1 is Y + S, height(H), Y1 >= H, !, RY is H - 1.
update_player_impl(S, 4, X, Y, X, RY) :- !, RY is Y + S.
update_player_impl(S, 2, X, Y, RX, Y) :- X0 is X - S, ship_left(X0) < 0, !, ship_half_width(RX).
update_player_impl(S, 2, X, Y, RX, Y) :- !, RX is X - S.
update_player_impl(S, 3, X, Y, RX, Y) :- X0 is X + S, width(W), ship_right(X0) > W, !, ship_half_width(HW), RX is W - HW.
update_player_impl(S, 3, X, Y, RX, Y) :- !, RX is X + S.
update_player_impl(S, D, X, Y, X, Y) :- !.
win_func(init) :- !,
pen(0, rgb(0,0,0)),
X is 1/30,
G_Timer := set_timer(_, X, do_timer),
fail.
win_func(paint):- !,
width(W), height(H),
brush(rgb(10, 10, 10)),
paint_score(_),
not(dead),
brush(G_player_color),
paint_player(_),
draw_player_bombs(_),
brush(G_enemy_color),
draw_enemies(_),
draw_enemy_bombs(_),
fail.
win_func(close) :- !,
kill_timer(_, G_Timer),
fail.
win_func(key_down(Char, Repetition)) :- dead, !, key_start_game(Char), fail.
win_func(key_down(Char, Repetition)) :- !, key_pressed(Char), fail.
paint_player(_) :- !,
X is G_X, Y is G_Y,
X1 is ship_left(X),
X2 is ship_right(X),
YY is ship_up(Y),
fill_polygon(X1,Y, X2,Y, X,YY).
paint_score(_) :- dead, !,
text_out(20, 20, "1 - LEVEL ANAK TK KECIL"),
text_out(20, 50, "2 - LEVEL ANAK TK BESAR"),
text_out(20, 80, "3 - LEVEL ANAK SD"),
text_out(20, 110, "4 - LEVEL ANAK SMP"),
text_out(20, 140, "5 - DEWA BOS!!!"),
text_out(20, 170, "F1 - Help"),
text_out(20, 200, "HighScore"),
text_out(99, 200, ":"),
text_out(114, 200, print(G_HighScore)).
paint_score(_) :- !,
text_out(20,20,"HighScore"),
text_out(99,20,":"),
text_out(114,20,print(G_HighScore)),
text_out(20,50,"Score"),
text_out(99,50,":"),
text_out(114,50,print(G_Score)).
draw_enemies(_) :- !, enemy_ships(L), d_e(L).
d_e([]) :- !.
d_e([ship(_, X, Y)|T]) :- !,
ship_half_width(HW), ship_height(SH),
X1 is ship_left(X),
X2 is ship_right(X),
YY is ship_up(Y),
fill_polygon(X1,YY, X2,YY, X, Y), d_e(T).
draw_enemy_bombs(_) :- !, enemy_bombs(L), d_eb(L).
d_eb([]) :- !.
d_eb([bomb(_, X, Y)|T]) :- !,
Y1 is Y - 7,
XX is round(X),
YY is round(Y),
YY1 is round(Y1),
fill_polygon(XX - 1,YY, XX + 1,YY, XX + 1, YY1, XX - 1, YY1), d_eb(T).
draw_player_bombs(_) :- !, player_bombs(L), d_pb(L).
d_pb([]) :- !.
d_pb([bomb(AutoFire, X, Y)|T]):- !,
Y1 is Y + 7,
XX is round(X),
YY is round(Y),
YY1 is round(Y1),
(Condition is f ->
(AutoFire is 1 -> brush(G_Red) else brush(G_player_color))
),
fill_polygon(XX - 1,YY, XX + 1,YY, XX + 1, YY1, XX - 1, YY1), d_pb(T).
key_pressed(87) :- !, set_moving(1). % W
key_pressed(38) :- !, set_moving(1). % up
key_pressed(65) :- !, set_moving(2). % A
key_pressed(37) :- !, set_moving(2). % <-
key_pressed(68) :- !, set_moving(3). % D
key_pressed(39) :- !, set_moving(3). % ->
key_pressed(83) :- !, set_moving(4). % S
key_pressed(40) :- !, set_moving(4). % down
key_pressed(80) :- !, set_pause(_). % P
key_pressed(81) :- !, assert_autofire(_). % Q
key_pressed(75) :- !, not(autofire), beep, assert(firing). % K
key_pressed(32) :- !, not(autofire), beep,assert(firing). % space
key_pressed(190) :- !, die(_), update_window(_). % dot
key_pressed(X) :- !, G_DirectionTimer := 0, G_D := 0.
assert_autofire(_) :- autofire, !, retract(autofire).
assert_autofire(_) :- !, assert(autofire).
set_pause(_) :- paused, !, retract(paused).
set_pause(_) :- !, assert(paused).
key_start_game(49) :- !, start_game(100, 5, 0). % 1
key_start_game(50) :- !, start_game(150, 7, 1). % 2
key_start_game(51) :- !, start_game(250, 10, 1). % 3
key_start_game(52) :- !, start_game(350, 11, 2). % 4
key_start_game(53) :- !, start_game(500, 17, 4). % 5
key_start_game(83) :- !, start_game(1000, 2, 10). % S
key_start_game(112) :- !, message("Help","Spasi buat nembak\nArah buat gerak\nP - pause\nQ - Senjata rahasia\npoint - quick dead",i). % S
key_start_game(X) :- !.
set_moving(D) :- !, G_DirectionTimer := 1, G_D := D.
check_collisions(_) :- !, enemy_ships(EShips), enemy_bombs(EBombs), check_es(EShips, NewShips), check_eb(EBombs), retract(enemy_ships(_)), assert(enemy_ships(NewShips)).
check_es([],[]) :- !.
check_es([ship(D, X, Y)|T], []) :- X1 is G_X, Y1 is G_Y, crash(X, Y, X1, Y1), !, die(_).
check_es([ship(D, X, Y)|T], [ship(D, X, Y)|R]) :- survive_enemy(X, Y), !, check_es(T, R).
check_es([ship(D, X, Y)|T], R) :- !, (G_AutoFired is 0 -> G_Score := G_Score + G_PTS else G_Score := G_Score - G_PTS),
(G_HighScore < G_Score -> G_HighScore := G_Score), G_Difficulty := G_Difficulty + 2, check_es(T, R).
survive_enemy(X, Y) :- !, player_bombs(Bombs), s_e(X, Y, Bombs).
s_e(_, _, []) :- !.
s_e(X, Y, [bomb(AutoFire, BX, BY)|T]) :- is_in_ship(X, Y, BX, BY), !, G_AutoFired := AutoFire, fail.
s_e(X, Y, [bomb(_, _, BY)|T]) :- !, s_e(X, Y, T).
check_eb([]) :- !.
check_eb([bomb(_, BX, BY)|T]) :- X1 is G_X, Y1 is G_Y, is_in_ship(X1, Y1, BX, BY), !, die(_).
check_eb([bomb(_, BX, BY)|T]) :- !, check_eb(T).
fire_enemies(_) :- !, enemy_ships(L), f_e(L).
f_e([]) :- !.
f_e([ship(_, X, Y)|T]) :- !, fire_enemy(X, Y), f_e(T).
do_timer(end) :- not(dead), !,
(paused -> text_out(200,200,"Paused"), fail),
(autofire -> assert(firing)),
fire_player(_),
fire_enemies(_),
update_positions(_),
check_collisions(_),
S is G_EnemySpeed,
G_LastShipWay := G_LastShipWay + S,
add_enemy(_),
update_window(_),
fail.
do_timer(end) :- !,
paint_sleeping(_), fail.
paint_sleeping(_) :- first_sleeping_paint, !, retract(first_sleepint_paint), update_window(_).
paint_sleeping(_) :- !.








