home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol019
/
stars.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-04-29
|
6KB
|
266 lines
(***************************************************************
*
* STARS---game
*
* Donated by Ray Penley, June 1980
*
****************************************************************)
PROGRAM SHOOTINGSTARS;
(*
** PROGRAM TITLE: SHOOTING STARS
**
** WRITTEN BY: MARK J. BORGERSON
** DATE WRITTEN: JUL 1976
**
** WRITTEN FOR: PERSONAL ENJOYMENT
**
** TRANSLATED: Translated from BASIC
** by Ray Penley, SEPT 1979
** 16 April 80 - added KEYIN.
**
*)
TYPE
VECTOR = ARRAY[1..9] OF INTEGER;
Var
seed1, seed2: INTEGER;
stars, F5: VECTOR;
C: INTEGER;
Procedure KEYIN(VAR CIX : char); EXTERNAL;
Procedure INSTRUCTIONS;
Var
I : INTEGER;
BEGIN
Writeln;
Writeln('If you like brain teasers then you''re in for some fun.');
Writeln('The object of this puzzle is to solve a 3 X 3 matrix such that');
Writeln('*''s appeas in all positions except in the center which will be');
Writeln('''. The positions on the matrix board are referred to by ROWS');
Writeln('then COLUMNS. The upper right hand position would be referred');
Writeln('to as; 1,3.');
Writeln('When a * is made a '', its immediate neighbors change state,');
Writeln('then is: *''s become '' and vice versa.');
Writeln('In addition, changing corner positions also changes the center');
Writeln('position; changing center position also changes outside');
Writeln('middle positions. Have FUN!');
Writeln;
(* TIMING LOOP *)
For I:=1 to 5000 do ;
END(*---of INSTRUCTIONS---*);
Procedure SKIP(LINES:INTEGER);
Var
I : INTEGER;
BEGIN
FOR I := 1 TO LINES DO Writeln
END(*---of SKIP---*);
Procedure HEADING;
Var
A : INTEGER;
BEGIN
Writeln(' ':20, '*** SHOOTING STARS ***');
SKIP(2);
Writeln('DO YOU WANT INSTRUCTIONS (YES=1 NO=0)');
READ(A);
IF A=1 THEN INSTRUCTIONS
END(*---of HEADING---*);
Procedure CLEAR;
(* !!! DEVICE DEPENDENT ROUTINE !!! *)
BEGIN
Write( CHR(26) )
END(*---of CLEAR---*);
Procedure HOMEUP;
(* !!! DEVICE DEPENDENT ROUTINE !!! *)
BEGIN
Write( CHR(30) )
END(*---of HOMEUP---*);
(*=================================================*
Implement a Fibonacci series Random number generator.
Written for PASCAL/Z By Raymond E. Penley, September 1979
Add these lines to your program
Var seed1, seed2 : INTEGER;
Within the body of the main program but
BEFORE calling RANDOM:
SEEDRAND;
*=================================================*)
Procedure SEEDRAND;
(* INITIAL VALUES FOR seed1 AND seed2 MAY BE
INPUT HERE *)
BEGIN
seed1 := 10946;
seed2 := 17711
END;
FUNCTION RANDOM : INTEGER;
(**
RANDOM will return numbers from 0 to 32767.
Call RANDOM using the following convention:
Range Use
0 - 32 RANDOM DIV 1000
0 - 327 RANDOM DIV 100
0 - 32767 RANDOM
GLOBAL
seed1, seed2 : INTEGER
**)
CONST
HALFINT = 16383; (* 1/2 OF MAXINT *)
Var
HALF1, HALF2, HALFADD : INTEGER;
BEGIN
HALF1 := seed1 DIV 2;
HALF2 := seed2 DIV 2;
IF (HALF1+HALF2) >= HALFINT THEN
HALFADD := HALF1 + HALF2 - HALFINT
ELSE
HALFADD := HALF1 + HALF2;
seed1 := seed2;
seed2 := HALFADD * 2;(* Restore from previous DIVision *)
RANDOM := seed2
END(*---of RANDOM---*);
Procedure INITIALIZE;
BEGIN
CLEAR;
C := 0; (* SHOT COUNTER *)
stars[1] := (-23); F5[1] := 1518;
stars[2] := (-3); F5[2] := 1311;
stars[3] := (-19); F5[3] := 570;
stars[4] := (-11); F5[4] := 3289;
stars[5] := 2; F5[5] := 2310;
stars[6] := (-5); F5[6] := 1615;
stars[7] := (-13); F5[7] := 2002;
stars[8] := (-7); F5[8] := 1547;
stars[9] := (-17); F5[9] := 1190;
END(*---of INITIALIZE---*);
Procedure LOAD;
Var
I, X7 : INTEGER;
BEGIN
FOR I := 1 TO 9 DO
BEGIN
X7 := ( RANDOM DIV 100 );
IF X7 > 200 THEN stars[I] := (-stars[I]);
END (*FOR*)
END(*---of LOAD---*);
Procedure BOARD;
Var
J : INTEGER;
BEGIN
HOMEUP;
WRITE(' ':20);
FOR J := 1 TO 9 DO
BEGIN
IF stars[ J ] < 0 THEN WRITE( ''' ');
IF stars[ J ] > 0 THEN WRITE( '* ');
IF J MOD 3 = 0 THEN
BEGIN
SKIP(3);
WRITE(' ':20)
END(*IF*)
END(*FOR*);
Writeln
END(*---of BOARD---*);
Procedure PLAYTHEGAME;
Var
D, X : INTEGER;
ENDOFGAME : BOOLEAN;
FUNCTION CHECK : INTEGER;
(*
Check to if the F value for the shot can be evenly
divided by the stars value for each position. If the
stars value divides into F without a remainder, the
STAR or black hole is inverted (its sign is changed).
GLOBAL
X :INTEGER;
stars, F5 :VECTOR *)
Var
B1, K, Z5 :INTEGER;
BEGIN
B1 := 0;
FOR K := 1 TO 9 DO
BEGIN
Z5 := ( F5[ X ] DIV stars[ K ] ) * stars[ K ];
IF Z5 = F5[ X ] THEN stars[ K ] := (-stars[ K ])
END; (*FOR*)
FOR K := 1 TO 9 DO
B1 := B1 +stars[ K ];
CHECK := B1
END(*---of CHECK---*);
Procedure INPUT;
(*
GLOBAL
C, X :INTEGER
stars :VECTOR *)
Var
CIX : Char;
ERROR : BOOLEAN;
BEGIN
REPEAT
ERROR := FALSE;(*Turn ERROR flag off for REPEAT *)
WRITE('Your Shot ');
KEYIN(CIX);
X := (ORD(CIX) -ORD('0'));
Writeln;
C := C +1;
IF (X<1) OR (X>9) THEN
ERROR := TRUE
ELSE
IF stars[ X ] <= 0 THEN
BEGIN
Writeln('You can only Shoot Stars');
ERROR := TRUE
END(* else *)
UNTIL NOT ERROR;
Writeln
END(*---of INPUT---*);
BEGIN (* PLAYTHEGAME *)
ENDOFGAME := FALSE;
REPEAT
INPUT;
D := CHECK;
BOARD;
IF D = (-100) THEN
BEGIN
Writeln('You lost!!!');
ENDOFGAME := TRUE
END
ELSE
IF D=96 THEN
BEGIN
Writeln('You WIN!!!');
Writeln('You fired', C:3, ' shots');
ENDOFGAME := TRUE
END
UNTIL ENDOFGAME
END(*---of PLAYTHEGAME---*);
BEGIN (* MAIN PROGRAM *)
HEADING;
CLEAR;
INITIALIZE;
SEEDRAND; (* seed the Random Number Generator *)
LOAD;
BOARD;
PLAYTHEGAME
END(*---of SHOOTING STARS---*).