(*************************************************************** * * 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---*). .