Hoe je dit kan uitbreiden: voeg de
code
onderaan toe op de aangegeven plaatsen
Wat je nog meer kan doen:
verander labyrinth (de muren)
voeg objecten toe mbv letters
=> teken ze in DrawArena2D en DrawArena3D
teken mooiere ghosts
verander spelsnelheid
zorg dat speler niet naar
boven
of naar beneden kan
verander initiele positie van
player en ghost
bepaal wat gebeurt als ghost
en
player botsen
iets moeilijker: verander
random
generator van ghost moves
1.
Check de muren. M. vervang (*
check walls for
player *)
IF NOT IsWall(viewerX, viewerY, dX, dY)
THEN
viewerX := viewerX + dX;
viewerY := viewerY +
dY;
END; 2.
Pak dingskes. N. voeg toe (* check objects in arena
*)
row :=
RowIndex(viewerY);
column :=
ColumnIndex(viewerX);
IF (row > 0) AND
(row <=
ARENA_HEIGHT*2+1) AND (column > 0) AND (column <=
ARENA_WIDTH*2+1) THEN
(* player is
within arena
*)
CASE
arena[row][column] OF
'b' :
WrStr("BUMPED INTO B");
arena[row][column] := ' '; (*
delete object *)
ELSE
END; (* case
*)
END; 3.
Haal de geest uit de fles. D1. voeg
toe Disc2D(ghostX, ghostY, 5,
ghostColor); D2.
voeg
toe
Cilinder(ghostX,
ghostY, 0, 50,
600, ghostColor, TRUE); M.
voeg
toe
na
viewerX-code
(* ghost moves: do a random move by
which you don't
bump into a wall *)
ctr:=0;
REPEAT
ghostAngle :=
ghostAngle + VAL(INTEGER, RANDOM(30)) - 15; (*
change angle
between -15 & 15 *)
PolarToCartesian(GHOST_SPEED, ghostAngle, dX, dY);(*
calculate X and Y
*)
INC(ctr);
UNTIL NOT
(IsWall(ghostX, ghostY,
2*dX, 2*dY) OR OutsideArena(ghostX, ghostY, dX, dY)) OR
(ctr > 20);
(* *)
IF ctr < 20 THEN
ghostX :=
ghostX + dX;
ghostY :=
ghostY + dY;
END;
4.
Laat de geest je niet vangen. N. voeg toe
(* does player bumps into a ghost ? *)
IF Distance(ghostX,
ghostY,
viewerX, viewerY) < 200 THEN
WrStr("GHOST
AND PLAYER
COLLIDE!!"); WrLn;
END; 5.
Pijl afschieten. L1. voeg toe
| ORD('a'), ORD('A'): (* arrow *)
arrowIsShot := TRUE;
arrowX := viewerX;
arrowY := viewerY;
arrowAngle :=
Radians2Degrees(viewerAngle); D1.
teken
pijl
IF arrowIsShot THEN
Arrow2D(arrowX, arrowY, arrowAngle,
600, arrowColor,
1, 12);
END; D2.
voeg
toe IF arrowIsShot THEN
PolarToCartesian(ARROW_LENGTH,
arrowAngle,
dX, dY);
Arrow3D(arrowX, arrowY, 200,
arrowX+dX,
arrowY+dY, 200, arrowColor, 10, 50);
END; M.
voeg
toe
(* arrow moves *)
IF arrowIsShot THEN
PolarToCartesian(ARROW_SPEED, arrowAngle, dX, dY);
IF
IsWall(arrowX, arrowY, dX, dY) THEN
arrowIsShot := FALSE;
ELSE
arrowX
:= arrowX + dX;
arrowY :=
arrowY + dY;
END;
END;
6.
Check of ghost geraakt door pijl. N. doe
hetzelfde als check
tussen ghost en player... bepaal
zelf wat er
gebeurt
7.
Create several ghosts. B. voeg toe NBR_GHOSTS=5; C.
vervang
ghostX, ghostY,
ghostAngle:
ARRAY[1..NBR_GHOSTS] OF INTEGER;
D. vervang in DrawArena2D() FOR
i
:=
1 TO NBR_GHOSTS DO
Disc2D(ghostX[i],
ghostY[i], 5,
ghostColor);
END; D.
vervang
in
DrawArena3D() FOR i := 1
TO NBR_GHOSTS
DO
Cilinder(ghostX[i],
ghostY[i], 0,
50, 600, ghostColor, TRUE);
END; F. vervang ghostX[1] :=
1*SIZE2D;
(* initial coordinates of ghosts *)
ghostY[1] := 1*SIZE2D;
ghostAngle[1] := 90;
ghostX[2] := 2*SIZE2D; (* initial
coordinates of
ghosts *)
ghostY[2] := 2*SIZE2D;
ghostAngle[2] := 90;
ghostX[3] := 3*SIZE2D; (* initial
coordinates of
ghosts *)
ghostY[3] := 3*SIZE2D;
ghostAngle[3] := 90;
ghostX[4] := 4*SIZE2D; (* initial
coordinates of
ghosts *)
ghostY[4] := 4*SIZE2D;
ghostAngle[4] := 90;
ghostX[5] := 5*SIZE2D; (* initial
coordinates of
ghosts *)
ghostY[5] := 5*SIZE2D;
ghostAngle[5] := 90; M.
vervang FOR i
:= 1 TO
NBR_GHOSTS DO
(* ghost
moves: do a
random move by which you don't bump into a wall *)
ctr:=0;
REPEAT
ghostAngle[i] := ghostAngle[i] + VAL(INTEGER, RANDOM(30))
-
15; (* change angle between -15 & 15 *)
PolarToCartesian(GHOST_SPEED, ghostAngle[i], dX, dY);(*
calculate X and
Y
*)
INC(ctr);
UNTIL NOT
(IsWall(ghostX[i], ghostY[i], 5*dX, 5*dY) OR
OutsideArena(ghostX[i],
ghostY[i], dX, dY)) OR (ctr > 20); (* *)
IF ctr < 20 THEN
ghostX[i] :=
ghostX[i] + dX;
ghostY[i] :=
ghostY[i] + dY;
END;
END; N.
vervang
FOR i := 1 TO NBR_GHOSTS DO
IF
Distance(ghostX[i], ghostY[i], viewerX, viewerY) < 200
THEN
WrStr("GHOST
AND PLAYER COLLIDE!!"); WrLn;
END;
END; 8. Voeg een score toe. C. voeg toe in
VAR sectie (variabele score) score: INTEGER; F. voeg toe in
initialisatiesectie (score start op 0) score:= 0; G. voeg toe (naam van score-veldje in
controlepaneel) SetControlName(6,
"score"); I. voeg toe (waarde van
score-veldje in controlepaneel) SetControlValue(6,
score); M. verander de score als gepast score := score + 1; of score := score - 1;