170 lines
6.2 KiB
Ada
170 lines
6.2 KiB
Ada
with Ada.Text_IO; use Ada.Text_IO;
|
|
with Ada.Characters; use Ada.Characters;
|
|
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
|
with Ada.Strings; use Ada.Strings;
|
|
|
|
-- procedure main - begins program execution
|
|
procedure main is
|
|
type Sketch_Pad is array(1 .. 50, 1 .. 50) of Character;
|
|
thePen : Boolean := True; -- pen raised by default
|
|
sketch : Sketch_Pad;
|
|
ycorr, xcorr : Integer := 25;
|
|
|
|
-- specifications
|
|
function penPosition(thePen : in out Boolean) return String;
|
|
procedure initGrid(sketch : in out Sketch_Pad);
|
|
procedure commandMenu(thePen : in out Boolean; xcorr : in out Integer;
|
|
ycorr : in out Integer);
|
|
procedure showMenu(xcorr : in out Integer; ycorr : in out Integer;
|
|
thePen : in out Boolean; sketch : in Sketch_Pad);
|
|
procedure moveCursor(thePen : in Boolean; sketch : in out Sketch_Pad;
|
|
xcorr : in out Integer; ycorr : in out Integer;
|
|
ch : in Integer);
|
|
procedure showGrid(sketch : in Sketch_Pad);
|
|
|
|
-- procedure initGrid - creates the sketchpad and initializes elements
|
|
procedure initGrid(sketch : in out Sketch_Pad) is
|
|
begin
|
|
sketch := (others => (others => ' '));
|
|
end initGrid;
|
|
|
|
-- procedure showMenu - displays the menu for the application
|
|
procedure showMenu(xcorr : in out Integer; ycorr : in out Integer;
|
|
thePen : in out Boolean; sketch : in Sketch_Pad) is
|
|
|
|
choice : Integer := 0;
|
|
begin
|
|
while choice /= 4 loop
|
|
Set_Col(15);
|
|
Put("TURTLE GRAPHICS APPLICATION");
|
|
Set_Col(15);
|
|
Put("===========================");
|
|
New_Line(2);
|
|
|
|
Put_Line("Enter 1 to print the grid map");
|
|
Put_Line("Enter 2 for command menu");
|
|
Put_Line("Enter 3 to raise pen up / down");
|
|
Put_Line("Enter 4 to exit the application");
|
|
choice := integer'value(Get_Line);
|
|
|
|
exit when choice = 4;
|
|
|
|
case choice is
|
|
when 1 => showGrid(sketch);
|
|
when 2 => commandMenu(thePen, xcorr, ycorr);
|
|
when 3 => Put_Line("Pen is "
|
|
& penPosition(thePen));
|
|
when others => Put_Line("Invalid input");
|
|
end case;
|
|
end loop;
|
|
end showMenu;
|
|
|
|
-- function penPosition - checks changes the state of whether the pen is
|
|
-- raised up or down. If value is True, pen is rasied up
|
|
function penPosition(thePen : in out Boolean) return String is
|
|
str1 : constant String := "raised UP";
|
|
str2 : constant String := "raised DOWN";
|
|
begin
|
|
if thePen = True then
|
|
thePen := False;
|
|
return str2;
|
|
else
|
|
thePen := True;
|
|
end if;
|
|
|
|
return str1;
|
|
end penPosition;
|
|
|
|
-- procedure command menu - provides a list of directions for the turtle
|
|
-- to move along the grid
|
|
procedure commandMenu(thePen : in out Boolean; xcorr : in out Integer;
|
|
ycorr : in out Integer) is
|
|
|
|
choice : Integer := 0;
|
|
begin
|
|
while choice <= 0 or choice > 5 loop
|
|
Set_Col(15);
|
|
Put("Command Menu");
|
|
Set_Col(15);
|
|
Put("============");
|
|
New_Line(2);
|
|
|
|
Put_Line("To move North enter 1");
|
|
Put_Line("To move South enter 2");
|
|
Put_Line("To move East enter 3");
|
|
Put_Line("To move West enter 4");
|
|
Put_Line("To return to previous menu enter 5");
|
|
choice := integer'value(Get_Line);
|
|
|
|
case choice is
|
|
when 1 => moveCursor(thePen, sketch, xcorr, ycorr, choice);
|
|
when 2 => moveCursor(thePen, sketch, xcorr, ycorr, choice);
|
|
when 3 => moveCursor(thePen, sketch, xcorr, ycorr, choice);
|
|
when 4 => moveCursor(thePen, sketch, xcorr, ycorr, choice);
|
|
when 5 => showMenu(xcorr, ycorr, thePen, sketch);
|
|
when others => Put_Line("Invalid choice");
|
|
end case;
|
|
end loop;
|
|
end commandMenu;
|
|
|
|
|
|
-- procedure moveCursor - moves the cursor around the board by taking the
|
|
-- x and y coordinates from the user. If the pen is down, a character is
|
|
-- printed at that location. If the pen is up, nothing is printed but the
|
|
-- cursor still moves to that position
|
|
procedure moveCursor(thePen : in Boolean; sketch : in out Sketch_Pad;
|
|
xcorr : in out Integer; ycorr : in out Integer;
|
|
ch : in Integer) is
|
|
|
|
begin
|
|
if thePen = True then -- pen up so move cursor but do not draw
|
|
case ch is
|
|
when 1 => xcorr := xcorr - 1; ycorr := ycorr;
|
|
sketch(xcorr, ycorr) := ' ';
|
|
when 2 => xcorr := xcorr + 1; ycorr := ycorr;
|
|
sketch(xcorr, ycorr) := ' ';
|
|
when 3 => xcorr := xcorr; ycorr := ycorr + 1;
|
|
sketch(xcorr, ycorr) := ' ';
|
|
when 4 => xcorr := xcorr; ycorr := ycorr - 1;
|
|
sketch(xcorr, ycorr) := ' ';
|
|
when others => Put("Unreachable Code");
|
|
end case;
|
|
|
|
else -- pen is down so move cursor and draw
|
|
case ch is
|
|
when 1 => xcorr := xcorr - 1; ycorr := ycorr;
|
|
sketch(xcorr, ycorr) := '#';
|
|
when 2 => xcorr := xcorr + 1; ycorr := ycorr;
|
|
sketch(xcorr, ycorr) := '#';
|
|
when 3 => xcorr := xcorr; ycorr := ycorr + 1;
|
|
sketch(xcorr, ycorr) := '#';
|
|
when 4 => xcorr := xcorr; ycorr := ycorr - 1;
|
|
sketch(xcorr, ycorr) := '#';
|
|
when others => Put("Unreachable Code");
|
|
end case;
|
|
end if;
|
|
end moveCursor;
|
|
|
|
-- procedure showGrid - prints the sketchpad showing the plotted moves
|
|
procedure showGrid(sketch : in Sketch_Pad) is
|
|
begin
|
|
New_Line;
|
|
|
|
for I in sketch'Range(1) loop
|
|
for J in sketch'Range(2) loop
|
|
Put(character'image(sketch(I,J)));
|
|
end loop;
|
|
New_Line;
|
|
end loop;
|
|
New_Line;
|
|
end showGrid;
|
|
|
|
begin
|
|
New_Line;
|
|
|
|
initGrid(sketch);
|
|
showMenu(xcorr, ycorr, thePen, sketch);
|
|
|
|
New_Line;
|
|
end main;
|