setscreen ("graphics:790;540") % graphics screen mode
var font : int := Font.New ("Comic Sans Ms:20") % two kinds
var font2 : int := Font.New ("Comic Sans Ms:50") % of fonts
var A, B : real := 0 % angle variables
var x, y, xx, yy, x1, y1, x2, y2, r, a, b : int
% various coorditates used in the program
x := 65
y := 125
xx := 695
yy := 125
x1 := 65
y1 := 125
x2 := 725
y2 := 125
r := 30
a := 0
b := 0
var V, count, t : int := 0 % velocity variable
var End := false
var shot : boolean := false % shot is made with help of this variable
var shotx, shoty : int % coordinates of cannonball
var ch : string (1) % variable for input from keyboard
var acc : int := 10 % acceleration of free fall
var grav : string (3) % gravity for input from keyboard
var g : int % game gravity
var hillx : int := 150
var hillxx : int := 640
var hilly, col : int
randint (hilly, 200, 500)
loop
randint (col, 0, 15)
exit when col not= 7 and col not= 0
end loop
var s : int := 1
var p1, p2 : int % percentage of power left in tanks
p1 := 100
p2 := 100
var V1, V2, v : int % maximum allowed velocity
V1 := 150
V2 := 150
v := 150
var cl : int % color of circling ball
procedure Key % waits until keyboard's key is pressed
var str : string (1)
loop
getch (str)
exit when str not= ""
end loop
end Key
procedure finish % game over
var scorch : string
cls
Font.Draw ("GAME OVER", 240, 270, font2, red)
if count mod 2 = 0 then
Font.Draw ("BLUE PLAYER LOST", 295, 240, font, blue)
else
Font.Draw ("RED PLAYER LOST", 300, 240, font, blue)
end if
Key
end finish
procedure explode % explosion
var cr : int
loop
randint (cr, 0, 15)
exit when cr not= col and cr not= white
% not empty explosion - should be colored
end loop
for j : 1 .. 40
drawfilloval (shotx, shoty, j, j, cr)
delay (10)
end for
drawfilloval (shotx, shoty, 40, 40, white)
% checking how close explosions are to tanks
% and changing power level if explosions are too close
if abs (shotx - x1) <= 105 and abs (shoty - y1) <= 105 then
if abs (shotx - x1) <= 75 and abs (shoty - y1) <= 75 then
if abs (shotx - x1) <= 50 and abs (shoty - y1) <= 50 then
if abs (shotx - x1) <= 30 and abs (shoty - y1) <= 30 then
if abs (shotx - x1) <= 15 and abs (shoty - y1) <= 15
then
if abs (shotx - x1) <= 5 and abs (shoty - y1)
<= 5 then
V1 := V1 - 35
p1 := p1 - 25
end if
V1 := V1 - 30
p1 := p1 - 20
end if
V1 := V1 - 25
p1 := p1 - 17
end if
V1 := V1 - 20
p1 := p1 - 14
end if
V1 := V1 - 15
p1 := p1 - 8
end if
V1 := V1 - 10
p1 := p1 - 6
end if
if p1 <= 0 then
V1 := 25
end if
if abs (shotx - x2) <= 105 and abs (shoty - y2) <= 105 then
if abs (shotx - x2) <= 75 and abs (shoty - y2) <= 75 then
if abs (shotx - x2) <= 50 and abs (shoty - y2) <= 50 then
if abs (shotx - x2) <= 30 and abs (shoty - y2) <= 30 then
if abs (shotx - x2) <= 15 and abs (shoty - y2) <= 15
then
if abs (shotx - x2) <= 5 and abs (shoty - y2)
<= 5 then
V2 := V2 - 35
p2 := p2 - 25
end if
V2 := V2 - 30
p2 := p2 - 20
end if
V2 := V2 - 25
p2 := p2 - 17
end if
V2 := V2 - 20
p2 := p2 - 14
end if
V2 := V2 - 15
p2 := p2 - 8
end if
V2 := V2 - 10
p2 := p2 - 6
end if
if p2 <= 0 then
V2 := 25
end if
if p2 <= 0 or p1 <= 0 then
explode
finish
end if
end explode
procedure arc (var count : int, x, y, xx, yy : int, var g, V : int, A :
real)
% draws cannonball's trajectory, shows explosions and finishes game
var i : real := 0
t := round (abs (2 * ( (V * sind (A)) / g))) % time
g := strint (grav)
loop
if s not= 1 then
if shotx < 790 and shotx > 0 and shoty < 540 and shoty > 97
then
drawfilloval (shotx, shoty, 2, 2, white)
drawfilloval (shotx + round (5 * cosd (B)), shoty +
round (5 * sind (B)), 1, 1, white)
drawfilloval (shotx + round (5 * cosd (B + 180)), shoty +
round (5 * sind (B + 180)), 1, 1, white)
% erasing previous cannonball - animation
end if
end if
B := B + 10 % increasing rotation angle
if B >= 3600 then % keeping number not too large
B := 0
end if
i := i + 0.1 % time parameter
if count mod 2 = 0 then % firing turns
shotx := x + round (V * i * cosd (A))
shoty := y + round (V * i * sind (A) - (g * i **
2) / 2)
else % coordinates of cannonball on its trajectory
shotx := xx - round (V * i * cosd (A))
shoty := yy + round (V * i * sind (A) - (g * i **
2) / 2)
end if
exit when shotx <= 0 or shotx >= 790
% exiting loop if cannonball flies offscreen in x-axis
exit when shoty >= 540
% exiting loop if cannonball flies offscreen in y-axis
if shoty <= 97 then % ground level explosion
explode
exit % exiting loop when cannonball hits ground
end if
if shotx < 790 and shotx > 0 and shoty < 540 and shoty > 97 then
% drawing cannonball
drawoval (shotx, shoty, 2, 2, black)
loop
randint (cl, 0, 15)
exit when cl not= col and cl not= white
end loop
drawoval (shotx + round (5 * cosd (B)), shoty + round (5 *
sind (B)), 1, 1, red)
drawoval (shotx + round (5 * cosd (B + 180)), shoty +
round (5 *
sind (B + 180)), 1, 1, red)
% 2 small balls flying around cannonball
end if
if whatdotcolor (shotx, shoty) = col then
% explosion when cannonball hits color
explode
exit % exit loop if cannonball hits ground's color
end if
s := s + 1
delay (25)
if (shotx <= 80 and shotx >= 50 and shoty <= 125 and
shoty >= 97) or (shotx <= 740 and shotx >= 710 and shoty
<= 125 and shoty >= 97) then % checking targets - both tanks
% condition for hit
explode
finish
End := true
exit
end if
end loop
shot := false
count := count + 1
end arc
procedure draw (var count : int, shot : boolean, x, y, xx, yy : int, var g,
V : int, A : real)
% draws tanks and ground, displays current values
var c : int
drawline (0, 97, 790, 97, col) % ground level
drawfillbox (50, 100, 80, 117, yellow) % first tank
drawfilloval (55, 100, 3, 3, blue)
drawfilloval (65, 100, 3, 3, blue)
drawfilloval (75, 100, 3, 3, blue)
drawfillbox (55, 104, 75, 114, red)
drawfillbox (60, 117, 70, 124, green)
drawfillbox (710, 100, 740, 117, grey) % second tank
drawfilloval (715, 100, 3, 3, red)
drawfilloval (725, 100, 3, 3, red)
drawfilloval (735, 100, 3, 3, red)
drawfillbox (715, 104, 735, 114, blue)
drawfillbox (720, 117, 730, 124, green)
if count mod 2 = 0 then % whose turn?
c := red
else
c := blue
end if
Font.Draw (intstr (p1), 40, 60, font, black) % percentage
Font.Draw ("%", 80, 60, font, black) % of
Font.Draw (intstr (p2), 700, 60, font, black) % power
Font.Draw ("%", 740, 60, font, black) % left
Font.Draw ("Power", 38, 35, font, red)
Font.Draw ("Power", 698, 35, font, blue)
Font.Draw ("Angle: ", 50, 480, font, black) % characteristics
Font.Draw (realstr (A, 3), 110, 480, font, c) % of
Font.Draw ("Velocity: ", 50, 430, font, black) % environment
Font.Draw (intstr (V), 133, 430, font, c) % and
Font.Draw ("Gravity: ", 640, 480, font, black) % current
Font.Draw (intstr (g), 718, 480, font, green) % values
drawline (x1, y1, x, y, black) % tanks'
drawline (x2, y2, xx, yy, black) % cannons
if shot = true then % condition for shot
arc (count, x, y, xx, yy, g, V, A)
end if
end draw
procedure distinguish (var count : int, shot : boolean, a, b : int, var
g, V
: int, A : real) % changing coordinates of cannons to move
if count mod 2 = 0 then
x := x1 + a
y := y1 + b
else
xx := x2 - a
yy := y2 + b
end if
draw (count, shot, x, y, xx, yy, g, V, A)
end distinguish
process point
% displays animated turn pointer like atom with circling electrones
var D : real := 0
var m, n : int % x - and y - coordinates of pointer
m := x1
n := y1 + 50
var cp : int % color of pointer
loop
drawfilloval (m, n, 4, 4, white)
drawfilloval (m + round (20 * cosd (D + 10)), n + round (10 *
sind (D + 10)), 3, 1, white)
drawfilloval (m + round (20 * cosd (D + 130)), n + round (10 *
sind (D + 130)), 3, 1, white)
drawfilloval (m + round (20 * cosd (D + 250)), n + round (10 *
sind (D + 250)), 3, 1, white)
drawfilloval (m + round (10 * cosd (D + 250)), n + round (20 *
sind (D + 250)), 3, 1, white)
if count mod 2 = 0 then
m := x1
n := y1 + 50
cp := red
else
m := x2
n := y2 + 50
cp := blue
end if
drawfilloval (m, n, 4, 4, 10)
drawfilloval (m + round (20 * cosd (D)), n + round (10 *
sind (D)), 3, 1, cp)
drawfilloval (m + round (20 * cosd (D + 120)), n + round (10 *
sind (D + 120)), 3, 1, cp)
drawfilloval (m + round (20 * cosd (D + 240)), n + round (10 *
sind (D + 240)), 3, 1, cp)
drawfilloval (m + round (10 * cosd (D + 240)), n + round (20 *
sind (D + 240)), 3, 1, 9)
D := D - 10
if D = 3600 then
D := 0
end if
delay (25)
end loop
end point
process shield % provides partial shield from shots from above
var u, v : int % coordinates of shield's centre
u := x1
v := y1 + 50
var E : real := 0 % angle of rotation
loop
drawline (u - round (50 * cosd (E - 10)), v - round (20 *
sind (E -
10)), u + round (50 * cosd (E - 10)), v +
round (20 * sind (E - 10)), white)
drawline (u - round (50 * cosd (E)), v - round (20 *
sind (E)), u + round (50 * cosd (E)), v +
round (20 * sind (E)), white)
drawline (u - round (50 * cosd (E - 10)), v - round (20 *
sind (E - 10)), u - round (50 * cosd (E)), v - round (20 *
sind (E)), white)
drawline (u + round (50 * cosd (E - 10)), v + round (20 *
sind (E - 10)), u + round (50 * cosd (E)), v + round (20 *
sind (E)), white)
drawline (u - round (50 * cosd (E + 80)), v - round (20 *
sind (E +
80)), u + round (50 * cosd (E + 80)), v +
round (20 * sind (E + 80)), white)
drawline (u - round (50 * cosd (E + 90)), v - round (20 *
sind (E + 90)), u + round (50 * cosd (E + 90)), v +
round (20 * sind (E + 90)), white)
drawline (u - round (50 * cosd (E + 80)), v - round (20 *
sind (E + 80)), u - round (50 * cosd (E + 90)), v -
round (20 *
sind (E + 90)), white)
drawline (u + round (50 * cosd (E + 80)), v + round (20 *
sind (E + 80)), u + round (50 * cosd (E + 90)), v +
round (20 *
sind (E + 90)), white)
if count mod 2 = 0 then
u := x2
v := y2 + 50
else
u := x1
v := y1 + 50
end if
drawline (u - round (50 * cosd (E)), v - round (20 * sind (E)),
u + round (50 * cosd (E)), v +
round (20 * sind (E)), col)
drawline (u - round (50 * cosd (E + 10)), v - round (20 *
sind (E + 10)), u + round (50 * cosd (E + 10)), v +
round (20 * sind (E + 10)), col)
drawline (u - round (50 * cosd (E)), v - round (20 * sind (E)),
u - round (50 * cosd (E + 10)), v - round (20 * sind (E +
10)), col)
drawline (u + round (50 * cosd (E)), v + round (20 * sind (E)),
u + round (50 * cosd (E + 10)), v + round (20 * sind (E +
10)), col)
drawline (u - round (50 * cosd (E + 90)), v - round (20 *
sind (E +
90)),
u + round (50 * cosd (E + 90)), v +
round (20 * sind (E + 90)), col)
drawline (u - round (50 * cosd (E + 100)), v - round (20 *
sind (E + 100)), u + round (50 * cosd (E + 100)), v +
round (20 * sind (E + 100)), col)
drawline (u - round (50 * cosd (E + 90)), v - round (20 *
sind (E +
90)),
u - round (50 * cosd (E + 100)), v - round (20 * sind (E +
100)), col)
drawline (u + round (50 * cosd (E + 90)), v + round (20 *
sind (E +
90)),
u + round (50 * cosd (E + 100)), v + round (20 * sind (E +
100)), col)
E := E + 10
if E = 3600 then
E := 0
end if
delay (5)
end loop
end shield
process symbol
% displays symbol in form of planet with circling around it satellite
var C : real := 0 % angle of satellite's revolution
loop
drawfilloval (395 + round (50 * cosd (C - 10)), 45 +
round (30 * sind (C - 10)), 10, 10, col)
% erasing previous satellite's appearance
if col not= 1 then
drawfilloval (395, 45, 20, 20, col - 1) % drawing planet
end if
drawfilloval (395 + round (50 * cosd (C)), 45 + round (30 *
sind (C)), 10, 10, green) % satellite's revolution
C := C + 10
if C >= 3600 then % keeping number not too large
C := 0
end if
delay (50) % making program work smoother
end loop
end symbol
process cloud % displays clouds in the sky
var i : int := 0
var j : real := 0
var sd : int := 525
var cn : int := 1
loop
if cn mod 2 = 0 then
i := 0
else
i := 790
end if
loop
drawfilloval (i, sd + round (10 * sind (j)), 50, 10, 0)
if cn mod 2 = 0 then
i := i + 1
else
i := i - 1
end if
if j >= 3600 then
j := 0
end if
j := j + 5
drawfilloval (i, sd + round (10 * sind (j)), 50, 10, col - 7)
if (i >= 830 and cn mod 2 = 0) or (i <= - 40 and cn mod 2
not=
0) then
exit
end if
delay (10)
end loop
cn := cn + 1
end loop
end cloud
procedure getKey
%waits until keyboard 's key is pressed and acts accordingly
fork point % simultaneous
fork shield % subpragrams'
fork cloud % run
var o, p, q, i, j : int
o := 0
p := 97
i := 0
j := 0
randint (q, 100, 300)
drawbox (0, 0, 790, 540, 7)
loop
exit when o >= 790
randint (i, - 20, 20)
if o >= 300 and o <= 490 then
drawline (o, p + j, 395, p + q, 7)
o := o + 200
drawline (395, p + q, o, p + j, 7)
end if
drawline (o, p + j, o + 20, p + i, 7)
j := i
delay (50)
o := o + 20
end loop
drawfill (395, 10, col, 7)
drawline (0, 97, 790, 97, col)
fork symbol
loop
getch (ch)
if ord (ch) = 205 then % arrow right
A := A + 1
if A > 180 then
A := 0
end if
a := round (r * cosd (A))
b := round (r * sind (A))
elsif ord (ch) = 203 then % arrow left
A := A - 1
if A < 0 then
A := 180
end if
a := round (r * cosd (A))
b := round (r * sind (A))
end if
drawline (x1, y1, x, y, white) % redrawing
drawline (x2, y2, xx, yy, white) % after
drawfillbox (107, 485, 147, 505, white) % explosion
drawfillbox (130, 435, 170, 455, white) % that
drawfillbox (718, 485, 758, 505, white) % erases
drawfillbox (40, 65, 75, 85, col) % some
drawfillbox (700, 65, 735, 85, col) % screen
drawline (0, 97, 790, 97, col) % elements
if count mod 2 = 0 then
% whose turn? maximum allowed cannonball velocity for each tank
v := V1
else
v := V2
end if
if ord (ch) = 200 then % arrow up
if V >= 0 and V < v then
V := V + 1
elsif V = 0 then
a := r
b := 0
end if
elsif ord (ch) = 208 then % arrow down
if V > 0 and V <= v then
V := V - 1
end if
end if
if ord (ch) = 32 then
shot := true
end if
distinguish (count, shot, a, b, g, V, A)
exit when End = true
end loop
end getKey
process program
var i : int
for o : 0 .. 790
for p : 0 .. 540
randint (i, - 5, 5)
drawdot (o, p + i, black)
end for
end for
Font.Draw ("WILD TANKS", 220, 400, font2, red)
Key
cls
drawline (0, 97, 790, 97, black)
drawfillbox (50, 100, 80, 117, yellow)
drawfilloval (55, 100, 3, 3, black)
drawfilloval (65, 100, 3, 3, black)
drawfilloval (75, 100, 3, 3, black)
drawfillbox (55, 104, 75, 114, red)
drawfillbox (60, 117, 70, 124, green)
drawfillbox (710, 100, 740, 117, grey)
drawfilloval (715, 100, 3, 3, red)
drawfilloval (725, 100, 3, 3, red)
drawfilloval (735, 100, 3, 3, red)
drawfillbox (715, 104, 735, 114, blue)
drawfillbox (720, 117, 730, 124, green)
loop
cls
Font.Draw ("Enter gravity: ", 177, 450, font2, blue)
get grav
if grav = "" then
g := acc
Font.Draw (intstr (g), 517, 450, font2, red)
else
g := strint (grav)
Font.Draw (intstr (g), 517, 450, font2, red)
end if
Key
cls
if grav = "0" then
Font.Draw ("Invalid Gravity", 200, 450, font2, red)
Key
end if
exit when grav not= "0"
end loop
Key
cls
getKey
end program
fork program
               (
geocities.com/mathladies/cs)                   (
geocities.com/mathladies)