dos_compilers/Borland Turbo Pascal v4/GR3DEMO.PAS
2024-07-01 21:08:56 -07:00

249 lines
6.6 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ Copyright (c) 1985, 87 by Borland International, Inc. }
program GR3DEMO;
{
TURTLEGRAPHICS DEMO PROGRAM
This programs demonstrates the use of Turbo Pascal 3.0's
turtle graphics by using Version 4.0's GRAPH3 unit.
NOTE: You must have a color graphics adapter to use this
program.
PSEUDO CODE
1. Initialize program variables.
2. Play with the turtle routines.
a. Start with medium resolution graphics.
b. Read a character and manipulate the turtle until
the user pressed <ESC> or ^C.
3. Reset screen to text mode and quit.
Here is a list of the commands that this program uses:
Function Keys:
F1 Turns turtle to the left.
F2 Turns turtle to the right.
Cursor Keys:
They point the turtle:
Up arrow, north
Down arrow, south
Right arrow, east
Left arrow: west
Home, northwest
PgUp, northeast
PgDn, southeast
End: southwest
Alpha keys:
0 thru 9: Set the magnitude for speed.
(i.e. 0 is stop, 1 is slow, 9 is fast)
H: Sets video mode to High resolution.
M: Sets video mode to Medium resolution.
W: TOGGLE: Wrap on / off
P: TOGGLE: PenUp / PenDown.
T: TOGGLE: Hide / show the turtle.
C: Changes the color (or intensity) of the lines.
+: Homes the turtle.
<ESC>: Quits the turtle demo.
}
uses
Crt,
Turbo3,
Graph3;
const
TurtleSpeed = 50;
type
ToggleCommands = (PenOn, WrapOn, TurtleOn);
var
ToggleRay : array[PenOn..TurtleOn] of boolean;
Magnitude, { Sets speed: 0 = stopped, 9 = fast }
Color, { Current palette color }
CurentPalette: Integer; { Current Palette }
procedure Init;
var Toggle: ToggleCommands;
procedure VerifyGraphicsCard;
var ch : char;
begin
ClrScr;
Writeln('You must have a color graphics adapter to use this program.');
write('CONTINUE? (Y/N): ');
repeat
ch := UpCase(ReadKey);
if ch in ['N', #27, ^C] then
begin
TextMode(LastMode);
Halt;
end;
until ch = 'Y';
end; { VerifyGraphicsCard }
begin
VerifyGraphicsCard;
Magnitude := 0; { Stopped }
Color := 0;
for Toggle := PenOn to TurtleOn do
ToggleRay[Toggle] := true; { Start with all commands toggled on }
end;
procedure PlayWithTurtle;
var
InKey: Char;
FunctionKey: Boolean; { TRUE if a function key was pressed }
procedure NewScreen(SetRes : char);
procedure DrawBox(x, y, w, h : integer);
begin
Draw(x, y, x + w, y, 1); { top }
Draw(x, y, x, y + h, 1); { left side }
Draw(x, y + h, x + w, y + h, 1); { bottom }
Draw(x + w, y + h, x + w, y, 1); { right side }
end; { DrawBox }
procedure HiResOn;
const
CharHeight = 10;
begin
HiRes;
HiResColor(Yellow);
DrawBox(0, 0, 639, 199-CharHeight);
TurtleWindow(319, 99-(CharHeight DIV 2), 638, 198-CharHeight);
end; { HiResOn }
procedure MediumResOn;
const
CharHeight = 20;
begin
GraphColorMode;
DrawBox(0, 0, 319, 199-CharHeight);
TurtleWindow(159, 99-(CharHeight DIV 2), 318, 198-CharHeight);
end; { MediumResOn }
begin
case SetRes of
'M' : begin
MediumResOn;
GoToXY(1, 24);
writeln('SPEED:0-9 TOGGLES:Pen,Wrap,Turtle,Color');
write(' TURN: F1,F2, HOME: +, RES: Hi,Med');
end;
'H' : begin
HiResOn;
GoToXY(1, 25);
write(' SPEED: 0-9 TOGGLES: Pen,Wrap,Turtle,Color');
write(' TURN: F1,F2 HOME: + RES: Hi,Med');
end;
end; { case }
Showturtle;
home;
Wrap;
Magnitude := 0;
end; { NewScreen }
function GetKey(var FunctionKey: Boolean): char;
var ch: char;
begin
ch := ReadKey;
If (Ch = #0) Then { it must be a function key }
begin
ch := ReadKey;
FunctionKey := true;
end
else FunctionKey := false;
GetKey := Ch;
end;
procedure TurtleDo(InKey : char; FunctionKey : boolean);
const
NorthEast = 45;
SouthEast = 135;
SouthWest = 225;
NorthWest = 315;
procedure DoFunctionCommand(FunctionKey: char);
begin
case FunctionKey of
'H': SetHeading(North); { Up arrow Key }
'P': SetHeading(South); { Down arrow Key }
'M': SetHeading(East); { Left arrow Key }
'K': SetHeading(West); { Right arrow Key }
'I': SetHeading(NorthEast); { PgUp }
'Q': SetHeading(SouthEast); { PgDn }
'G': SetHeading(NorthWest); { Home }
'O': SetHeading(SouthWest); { End }
'<': SetHeading(Heading+5); { F1 }
';': SetHeading(Heading-5); { F2 }
end
end { Do function command };
begin
If FunctionKey then DoFunctionCommand(Upcase(InKey))
else
case upcase(InKey) of
'P': begin
ToggleRay[PenOn] := NOT ToggleRay[PenOn];
case ToggleRay[PenOn] of
true : PenUp;
false : PenDown;
end; { case }
end;
'W': begin
ToggleRay[WrapOn] := NOT ToggleRay[WrapOn];
case ToggleRay[WrapOn] of
true : Wrap;
false : NoWrap;
end; { case }
end;
'T': begin
ToggleRay[TurtleOn] := NOT ToggleRay[TurtleOn];
case ToggleRay[TurtleOn] of
true : ShowTurtle;
false : HideTurtle;
end; { case }
end;
'+': Home;
'C': begin
Color := succ(color) mod 4;
SetPenColor(Color);
end;
'0'..'9': Magnitude := Sqr(ord(inkey) - ord('0'));
'M': begin
NewScreen('M'); { medium resolution graphics }
end;
'H': begin
NewScreen('H'); { HiRes graphics }
end;
end; { case }
end; { TurtleDo }
begin { PlayWithTurtle }
NewScreen('M'); { start with medium resolution graphics }
repeat
TurtleDelay(TurtleSpeed);
repeat
if Magnitude <> 0 then forwd(Magnitude);
until KeyPressed;
Inkey := GetKey(FunctionKey);
TurtleDo(InKey, FunctionKey);
until UpCase(Inkey) in [#27, ^C];
end; { PlayWithTurtle }
begin { program body }
Init;
PlayWithTurtle;
ClearScreen;
TextMode(LastMode);
end.