1  REM *** THE GAME OF ZOT
2  REM *** PEOPLE'S COMPUTER COMPANY : AUGUST 9, 1974 (ABDICATION DAY)
3  REM *** PROGRAMMED BY : MARC LE BRUN
100  REM *** PROGRAM STRUCTURE
110  REM ***
120  REM *** AT THE START OF THE RUN THE BOARD (B) AND STRINGS FOR
130  REM *** THE SIDE TO MOVE FROM (S$) THE NAMES OF THE COMPASS
140  REM *** DIRECTIONS (D$) AND ARBITRARY ANSWERS (A$) ARE
150  REM *** DIMENSIONED AT LINE 700. INSTRUCTIONS ARE PRINTED
160  REM *** BY THE BLOCK OF LINES BEGINNING AT LINE 800.
200  REM *** THE GAME PROPER BEGINS AT LINE 1000 WHERE THE NUMBER OF
210  REM *** ROWS AND COLUMNS (0<R,C<11) ARE INPUT. THE BOARD B IS
220  REM *** FILLED WITH STARS (=1) , THE AUXILLIARY VALUES R1 AND C1
230  REM *** (USED IN VARIOUS CONDITIONALS) ARE INITIALIZED, AS ARE
240  REM *** THE TOTAL NUMBER OF STARS IN THE BOARD (N) AND THE PLAYER
250  REM *** WHOSE TURN IT IS (P).
260  REM *** THE LOOP TRAVERSED FOR EACH MOVE BEGINS AT LINE 2000.
270  REM *** FIRST THE BOARD IS PRINTED. THEN THE SECTION FOR FETCH-
280  REM *** ING THE ACTUAL MOVE IS ENTERED (AT LINE 3000). THE SIDE
290  REM *** OF THE BOARD (S$) IS INPUT, CHECKED, AND CONVERTED TO A
300  REM *** NUMERICAL INDEX (D). THEN THE MOVE ROW & COLUMN (I0,J0)
310  REM *** ARE FETCHED AND CHECKED. A SOMEWHAT COMPLICATED SECTION
320  REM *** FOR CHECKING AND EXECUTING THE ZOT IS BEGUN AT 4000.
330  REM *** THE BASIC PROCEDEURE IS TO BEGIN AT THE SPECIFIED ROW &
340  REM *** COLUMN AND SCAN OUTWARD (WITH CO-ORDINATE INDICIES I & J)
350  REM *** TO THE SIDE OF THE BOARD SPECIFIED BY D. THIS IS ACCOMP-
360  REM *** LISHED BY USING TWO INCREMENTS I1 & J1. ONE OF THESE IS
370  REM *** ZERO AND THE OTHER + OR - 1, DEPENDING ON THE DIRECTION
380  REM *** OF THE ZOT. I1 & J1 ARE DERIVED BY BLACK MAGIC FROM D
390  REM *** VIA THE TEMPORARY VARIABLES D0 AND S, WHICH PLAY NO FUR-
400  REM *** THER ROLE IN THE ALGORITHM. 
410  REM *** IN THE INITIAL SCAN A SWITCH (S0) =1 INDICATES
420  REM *** SCANNING OVER STARS, =0 SCANNING OVER SPACE. THE TRANSI-
430  REM *** TION (OF S0) 1->0 IS LEGAL (TO ALLOW ZOTTING OVER LEADING
440  REM *** SPACES). A 0->1 TRANSITION INDICATES THAT THE STARS ARE
450  REM *** NOT CONSECUTIVE. A COUNTER (C0) OF THE NUMBER OF STARS
460  REM *** SCANNED IS KEPT TO #1 SIMPLIFY THEIR REMOVAL IF THE
470  REM *** ZOT IS LEGAL AND #2 TO DETECT A ZOT CONTAINING NO STARS
480  REM *** (WHICH CONDITION IS NOT CAUGHT BY THE S0 'TRANSITIONS')
490  REM *** IF THE MOVE PASSES ALL THESE TESTS THE INITIAL C0 POSI-
500  REM *** TIONS ARE RESCANNED (WITH THE HELP OF A DUMMY INDEX K)
510  REM *** AND SET TO ZERO. THEN N IS UPDATED, IF IT'S ZERO THE LAST
520  REM *** STAR HAS BEEN ZOTTED AND WE ENTER A TERMINAL DIALOG. IF
530  REM *** THE GAME'S STILL AFOOT WE SETUP FOR THE NEXT PLAYER AND
540  REM *** RE-ENTER THE LOOP FROM THE TOP (I.E. LINE 2000).
550  REM ***
560  REM *** AT LINE 5000 A SUBROUTINE THAT INSISTS ON A YES OR NO
570  REM *** REPLY BEGINS. A IS SET TO 1 FOR 'YES', 0 FOR 'N0'.
580  REM ***
590  REM *** THESE REMARKS SHOULD SIMPLIFY UNTANGLING THE CODE.
600  REM *** HOWEVER, BASICK IS HARDLY A TRANSPARENT LANGUAGE.
610  REM *** THIS CODE IS DESIGNED TO BE SIMPLE AND COMPREHENSIBLE,
620  REM *** NOT 'EFFICIENT' (WHATEVER THAT MEANS) !!!
630  REM ***
700  REM *** ONCE ONLY INITIALIZATIONS
710  DIM B[10,10],S$[1],D$[4],A$[72]
720  D$="NSWE"
730  PRINT 
740  PRINT "*** THE GAME OF ZOT ***"
750  PRINT 
760  PRINT "DO YOU WANT INSTRUCTIONS ";
770  GOSUB 5000
780  PRINT 
790  IF A=0 THEN 1000
800  REM *** INSTRUCTIONS
810  PRINT "IN THE GAME OF ZOT THE TWO (HUMAN) PLAYERS COMPETE TO GET"
820  PRINT "THE LAST BITE OF A RECTANGULAR COOKIE. A MOVE, CALLED A"
830  PRINT "'ZOT', CONSISTS OF TAKING ALL THE STARS IN A LINE BETWEEN"
840  PRINT "A GIVEN SIDE OF THE BOARD AND A PARTICULAR STAR. THE SIDES"
850  PRINT "OF THE BOARD ARE NAMED N,E,S & W (FOR NORTH, EAST ETC.)"
860  PRINT "LIKE ON A MAP. THE POSITION OF THE STAR IS GIVEN BY THE"
870  PRINT "ROW AND COLUMN IT'S IN. FOR EXAMPLE, IF THE FIRST MOVE"
880  PRINT "ON A 4 BY 5 (ROWS BY COLUMNS) BOARD WERE ' E,3,2 ' THE RE-"
890  PRINT "SULTING BOARD WOULD BE :"
900  PRINT "    * * * * *"
910  PRINT "    * * * * *         (ZOTTING FROM THE EAST OVER TO 3,2)"
920  PRINT "    * . . . .         (.'S DENOTE ZOTTED UP STARS)"
925  PRINT "    * * * * *"
930  PRINT "THE STARS IN THE ZOT MUST BE CONSECUTIVE. YOU MAY NOT ZOT"
940  PRINT "EMPTY SPACE UNLESS IT IS BETWEEN THE EDGE OF THE BOARD"
950  PRINT "AND THE BEGINNING OF THE LINE OF STARS YOU ARE ZOTTING"
960  PRINT "(IN THE GAME ABOVE THE SECOND PLAYER MAY NOT ZOT ' S,2,4 '"
970  PRINT "BECAUSE 2,3 IS EMPTY, BUT ' E,3,1 ' IS LEGAL)."
980  PRINT 
990  PRINT "HERE WE GO ..."
1000  REM *** START THE GAME
1010  PRINT 
1020  PRINT "HOW MANY ROWS AND COLUMNS IN THE COOKIE ";
1030  INPUT R,C
1040  REM *** CHECK IF SIZE IS WITHIN LIMITS
1050  REM *** (NOTE RESEMBLENCE TO LINES 3100 & 4250)
1060  IF R*(11-R) <= 0 THEN 1080
1070  IF C*(11-C)>0 THEN 1100
1080  PRINT "ALLOWED COOKIE DIMENSIONS RANGE FROM 1 TO 10."
1090  GOTO 1000
1100  REM *** CHECK FOR INTEGRAL COOKIE
1110  REM *** (NOTE RESEMBLENCE TO LINE 3160)
1120  IF R-INT(R)+C-INT(C)=0 THEN 1150
1130  PRINT "COOKIE MUST HAVE INTEGER DIMENSIONS."
1140  GOTO 1000
1150  REM *** INITIALIZE BOARD AND AUXILLIARY VARIABLES
1160  FOR I=1 TO R
1170  FOR J=1 TO C
1180  B[I,J]=1
1190  NEXT J
1200  NEXT I
1210  R1=R+1
1220  C1=C+1
1230  N=R*C
1240  P=1
2000  REM *** MAIN MOVE LOOP
2010  REM *** PRINT THE BOARD
2020  PRINT 
2030  FOR I=1 TO R
2040  FOR J=1 TO C
2050  IF B[I,J]=1 THEN 2080
2060  PRINT " .";
2070  GOTO 2090
2080  PRINT " *";
2090  NEXT J
2100  PRINT 
2110  NEXT I
2120  PRINT 
3000  REM *** FETCH A MOVE
3005  REM *** FETCH BOARD SIDE
3010  PRINT "YOUR MOVE PLAYER ";P;" :"
3020  PRINT "SIDE TO ZOT FROM ";
3025  INPUT S$
3030  REM *** DETERMINE SPECIFIED SIDE OF BOARD
3040  D=1
3050  IF S$[1,1]=D$[D,D] THEN 3092
3060  D=D+1
3070  IF D<5 THEN 3050
3080  PRINT "THE SIDES OF THE BOARD ARE NAMED N,E,S & W."
3090  GOTO 3020
3092  REM *** FETCH CO-ORDINATES
3094  PRINT "ROW, COLUMN TO ZOT TO ";
3096  INPUT I0,J0
3100  REM *** CHECK IF MOVE IS ON BOARD
3110  REM *** (NOTE RESEMBLENCE TO LINES 1040 & 4250)
3120  IF I0*(R1-I0) <= 0 THEN 3140
3130  IF J0*(C1-J0)>0 THEN 3160
3140  PRINT "ROWS ARE NUMBERED 1 THRU ";R;" ; COLUMNS 1 THRU ";C;" ."
3150  GOTO 3092
3160  REM *** CHECK THAT MOVES ARE INTEGERS
3170  REM *** (NOTE RESEMBLENCE TO LINE 1100)
3180  IF I0-INT(I0)+J0-INT(J0)=0 THEN 4000
3190  PRINT "MOVES MUST REFER TO WHOLE NUMBERED ROWS AND COLUMNS."
3200  GOTO 3092
4000  REM *** SCAN ALONG LINE OF ZOT, VERIFY MOVE AND UPDATE BOARD
4010  REM *** SET UP MACHINERY FOR SCANNING
4020  D0=INT((D-1)/2)
4030  S=2*(D-2*D0)-3
4040  I1=S*(1-D0)
4050  J1=S*D0
4060  I=I0
4070  J=J0
4080  REM *** INITIIALIZE SEARCH SWITCH AND STAR COUNTER
4090  S0=1
4100  C0=0
4110  REM *** SCAN OUTWARD FROM MOVE TO EDGE OF BOARD
4120  REM *** TEST FOR STAR
4130  IF B[I,J]=1 THEN 4170
4140  REM *** FOUND A SPACE : SET SWITCH AND CONTINUE SCAN
4150  S0=0
4160  GOTO 4220
4170  REM *** FOUND A STAR
4180  REM *** [IF WE WERE SCANNING SPACE THIS IS AN ILLEGAL ZOT]
4190  IF S0=0 THEN 4300
4200  REM *** OTHERWISE WE INCREASE THE STAR COUNT
4210  C0=C0+1
4220  REM *** ADVANCE SCAN CO-ORDINATES TO NEXT POSITION
4230  I=I+I1
4240  J=J+J1
4250  REM *** CONTINUE SCANNING IF STILL ON BOARD
4260  REM *** (NOTE RESEMBLENCE TO LINES 1040 & 3120)
4270  IF I*(R1-I)*J*(C1-J) <> 0 THEN 4110
4280  REM *** CHECK FOR NULL ZOT
4290  IF C0>0 THEN 4330
4300  REM *** PLAYER HAS ATTEMPTED TO ZOT EMPTY SPACE
4310  PRINT "THE STARS IN YOUR ZOT MUST BE CONSECUTIVE."
4320  GOTO 3000
4330  REM *** MOVE IS LEGAL, UPDATE BOARD ETC.
4340  REM *** (SAME SCANNING TECHNIQUE AS ABOVE AT 4000)
4350  I=I0
4360  J=J0
4370  FOR K=1 TO C0
4380  B[I,J]=0
4390  I=I+I1
4400  J=J+J1
4410  NEXT K
4420  N=N-C0
4430  REM *** CHECK FOR A WIN
4440  IF N=0 THEN 4480
4450  REM *** NO WIN, SETUP FOR OTHER PLAYER AND LOOP
4460  P=3-P
4470  GOTO 2000
4480  REM *** ANNOUNCE THE WIN
4490  PRINT 
4500  PRINT "CONGATULATIONS PLAYER ";P;" ON YOUR SUPERB ZOTSMANSHIP !"'7'7"!"
4510  PRINT "(BETTER LUCK NEXT TIME PLAYER ";3-P;" )"
4520  PRINT 
4530  REM *** OFFER A REPLAY
4540  PRINT "WOULD YOU LIKE TO PLAY ANOTHER GAME OF ZOT ";
4550  GOSUB 5000
4560  IF A=1 THEN 1000
4570  PRINT "O.K. , SEE YOU FOLKS LATER."
4580  PRINT 
4590  STOP 
5000  REM *** SUBROUTINE FOR YES/NO RESPONSES
5010  INPUT A$
5020  A=0
5030  IF A$="NO" THEN 5080
5040  A=1
5050  IF A$="YES" THEN 5080
5060  PRINT "PLEASE ANSWER YES OR NO."
5070  GOTO 5000
5080  RETURN 
9999  END 
