initial implementation

This commit is contained in:
michael 1998-07-25 21:10:07 +00:00
parent 88a4e6a849
commit 2ce11f772a

172
install/demo/blackbox.pp Normal file
View File

@ -0,0 +1,172 @@
Program blackbox;
{
(c) 1998 Michael Van Canneyt
The object of the game is simple : You have a box of 9x9x9 cells.
you can enter a number of atoms that will be put in the box.
Then you can start shooting in the box with a laser beam.
You enter the coordinates where the beam enters the box.
(this must be on the edges, this means that one of the coordinates
must be 1 or 9...)
The beam will bounce off the atoms (using normal bouncing), and you
will be told where the beam exits.
From this you must guess where the atoms are...
}
Const MaxSize = 9;
MaxAtom = 10;
Type TRow = Array [0..MaxSize+1] of byte;
TPlane = Array [0..MaxSize+1] of TRow;
TCube = Array [0..MaxSize+1] of TPlane;
Var
Cube : TCube;
Count,Guessed,x,y,z : Longint;
ans : string;
Procedure FillCube;
var i,x,y,z : longint;
begin
randomize;
for x:=0 to maxsize+1 do
for y:=0 to maxsize+1 do
for z:=0 to maxsize+1 do
Cube[x,y,z]:=0;
repeat
Write ('Enter number of atoms (1-',maxatom,') : ');
readln (count);
if (count<1) or (count>MaxAtom) then
writeln ('Invalid value entered. Please try again.');
until (count>0) and (count<=MaxAtom);
for I:=1 to count do
begin
repeat
x:=Random(MaxSize)+1;
y:=Random(MaxSize)+1;
z:=Random(MaxSize)+1;
until Cube[x,y,z]=0;
Cube[x,y,z]:=1;
end;
end;
Procedure GetCoords (Var X,y,z : longint);
begin
Write ('X : ');
readln (x);
write ('Y : ');
readln (y);
write ('z : ');
readln (z);
end;
Procedure GetStart (Var x,y,z : longint);
Var OK : boolean;
begin
Writeln ('Please enter beam start coordinates : ');
Repeat
GetCoords (x,y,z);
OK:=((X=1) or (X=MaxSize)) or ((y=1) or (Y=MaxSize)) or
((Z=1) or (z=maxsize));
if Not OK then
writeln ('The beam should enter at an edge. Please try again');
until OK;
end;
Function GetGuess : boolean;
Var OK : boolean;
x,y,z : longint;
begin
Writeln ('Please enter atom coordinates : ');
Repeat
getcoords (x,y,z);
OK:=((X>=1) or (X<=MaxSize)) or ((y>=1) or (Y<=MaxSize)) or
((Z>=1) or (z<=maxsize));
if Not OK then
writeln ('These are not valid coordinates. Please try again');
until OK;
GetGuess:=False;
If Cube[x,y,z]<0 then
Writeln ('You already had this one ! Trying to be clever, eh ?')
else if Cube[x,y,z]>0 then
begin
Writeln ('Correct guess !');
Cube[x,y,z]:=-Cube[x,y,z];
getguess:=true;
end
else
Writeln ('Wrong guess !');
end;
Procedure CalcExit (X,Y,Z : longint);
var tx,ty,tz,dx,dy,dz : longint;
begin
dx:=0;dy:=0;dz:=0;
if x=1 then dx:=1 else if x=MaxSize then dx:=-1;
if y=1 then dy:=1 else if y=MaxSize then dy:=-1;
if z=1 then dz:=1 else if z=MaxSize then dz:=-1;
writeln ('Direction : ',dx,',',dy,',',dz);
repeat
for tx:=-1 to 1 do
for ty:=-1 to 1 do
for tz:=-1 to 1 do
if Cube [X+tx,y+ty,z+tz]<>0 then
begin
dx:=dx-tx;
dy:=dy-ty;
dz:=dz-tz;
end;
if dx<>0 then dx:=dx div abs(dx);
if dz<>0 then dz:=dz div abs(dz);
if dy<>0 then dy:=dy div abs(dy);
x:=x+dx;y:=y+dy;z:=z+dz;
until ((x=0) or (x=MaxSize+1)) or ((y=0) or (y=maxsize+1)) or
((z=0) or (z=maxsize+1));
Writeln ('Beam exited at : (',x-dx,',',y-dy,',',z-dz,')');
end;
Procedure DumpCube ;
Var x,y,z : longint;
begin
for x:=1 to MaxSize do
for y:=1 to maxsize do
for z:=1 to maxsize do
if Cube[x,y,z]<>0 then
writeln ('Atom at (',x,',',y,',',z,')');
end;
begin
FillCube;
Guessed:=0;
Repeat
repeat
Write ('Shoot, guess or quit (s/g/q) : ');
readln (ans);
ans[1]:=Upcase(ans[1]);
if not (ans[1] in ['S','G','Q']) then
writeln ('Invalid entry. Please try again.');
until ans[1] in ['S','G','Q'];
Case ans[1] of
'S' : begin
getstart (x,y,z);
calcexit (x,y,z);
end;
'G' : If GetGuess then Inc(Guessed);
end;
until (ans[1]='Q') or (guessed=count);
If Guessed=count then
Writeln ('Congratulations! All ',Count,' correct !')
else
Writeln ('Only ',guessed,' out of ',count,' correct...');
end.