|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, procedure New_Maze, seg_0582e4, separate Maze
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
separate (Maze)
----------------------------------------------------------------------
--
-- New_maze : create a new maze
--
-- written by
--
-- Edmond Schonberg
--
-- Ada Project
-- Courant Institute
-- New York University
-- 251 Mercer Street
-- New York, New York 10012
--
-----------------------------------------------------------------------
-- with Random_Numbers;
-- use Random_Numbers;
-- with System;
-- separate (Maze)
procedure New_Maze (Start, Goal : Position; Num_Lines : Integer) is
-- create a new maze with a given number of paths, including two long ones
-- that lead to source and destination.
Pos : Position;
D : Direction;
L : Integer;
task type Liner is
-- one is created for each path.
entry Draw (Pos : Position; Dir : Direction; Len : Integer);
end Liner;
type New_Liner is access Liner;
Next_Line : New_Liner;
function Max_Len (P : Position; D : Direction) return Integer is
-- establish distance from any point to boundary,
-- along a given direction.
begin
case D is
when Up =>
return P.Row;
when Right =>
return (80 - P.Col);
when Down =>
return (23 - P.Row);
when Left =>
return P.Col;
end case;
end Max_Len;
task body Liner is
P : Position;
D : Direction;
L : Integer;
begin
accept Draw (Pos : Position; Dir : Direction; Len : Integer) do
P := Pos;
D := Dir;
L := Len;
end Draw;
for I in 1 .. L loop
Putc (' ', P.Row, P.Col);
Dist (P.Row, P.Col) := Max_Dist;
P := Next_Pos (P, D);
end loop;
end Liner;
begin
Clear;
-- case System.System_Name is
-- when System.Pc_Dos =>
-- Fill_Screen (Ascii.Si);
-- when others =>
Fill_Screen ('#');
-- end case;
Pos := Start; -- first path starts at source.
D := Up; -- which is always on bottom row.
L := 20;
for I in 1 .. Num_Lines loop
-- create the right number of tasks, and start each at a random posi-
-- tion, going in a random direction towards the boundary.
Next_Line := new Liner;
Next_Line.Draw (Pos, D, L);
Pos := (2 * (1 + Random_Int (11)), 2 * (1 + Random_Int (38)));
D := Direction'Val (Random_Int (40) mod 4);
L := Max_Len (Pos, D);
L := L / 2 + Random_Int (L / 4);
end loop;
-- One more for path leading to destination. (always on top row).
Next_Line := new Liner;
Next_Line.Draw (Goal, Down, 22);
exception
when Storage_Error | Program_Error =>
Puts ("unable to create new tasks. Try simpler maze.", 23, 1);
end New_Maze;
nblk1=5
nid=5
hdr6=8
[0x00] rec0=21 rec1=00 rec2=01 rec3=080
[0x01] rec0=23 rec1=00 rec2=04 rec3=042
[0x02] rec0=1d rec1=00 rec2=03 rec3=00a
[0x03] rec0=04 rec1=00 rec2=02 rec3=000
[0x04] rec0=c0 rec1=00 rec2=00 rec3=100
tail 0x217658d1c87e28421ea25 0x42a00088462060003
Free Block Chain:
0x5: 0000 00 00 00 04 80 01 67 01 00 00 00 00 00 3d 53 74 ┆ g =St┆