File OTHELO.BA (BASIC source file)

Directory of image this file is from
This file as a plain text file

10 REM     * * * GAME OF OTHELLO * * *     (OTHELO.BA)
20 REM PLAYS THE GAME OF "OTHELLO WITH TWO STRATEGIES:
30 REM    1. TAKE THE MAXIMUM NUMBER OF PIECES
40 REM    2. ADD A BONUS FOR OUTSIDE POSITION
50 REM BOARD IS THE ARRAY 'A', BOUNDED BY 0'S (BLANKS)
60 REM    A=0 FOR EMPTY SQUARES
70 REM    A=B FOR BALCK SQUARE (INTERNALLY -1)
80 REM    A=W FOR WHITE SQUARE (INTERNALLY +1)
90 REM I AND J ALWAYS USED FOR ROW/COLUMN INDICES
100 REM I4 AND J4 STORE INCREMENTS TO THE 8 NEIGHBORS
110 REM C$ AND D$ STORE THE CAHRACTERS A-H,X,.,O FOR OUTPUT
120 DIM A(9,9),I4(8),J4(8),C$(8),D$(2)
130 REM INITIAL GREETING
140 PRINT\PRINT "GREETINGS FROM OTHELLO"
150 PRINT\PRINT "DO YOU WANT INSTRUCTIONS [Y OR N]";
160 INPUT Z$
170 IF Z$="N" GOTO 390
180 IF Z$<>"Y" GOTO 160
190 PRINT
200 PRINT "OTHELLO IS PLAYED ON AN 8 X 8 CHECKER BOARD,"
210 PRINT "ROWS NUMBERED 1 TO 8 AND COLUMNS A TO H."
220 PRINT "THE INITIAL CONFIGURATION IS ALL BLANK EXCEPT"
230 PRINT "FOR THE CENTER FOUR SQUARES WHICH FORM THE"
240 PRINT "PATTERN:"
250 PRINT TAB(20);"O X"
260 PRINT TAB(20);"X O"
270 PRINT
280 PRINT "TRY TO PLACE YOUR PIECE SO THAT IT 'OUTFLANKS'"
290 PRINT "MINE, CREATING A HORIZONTAL, VERTICAL OR"
300 PRINT "DIAGONAL RUN OF MY PIECES BOUNDED AT EACH END"
310 PRINT "BY AT LEAST ONE OF YOURS. THIS WILL 'FLIP' MY"
320 PRINT "PIECES, TURNING THEM INTO YOURS."
330 PRINT "*NOTE*: YOU MUST CAPTURE AT LEAST ONE OF MY"
340 PRINT "PIECES IN THIS WAY IF IT IS AT ALL POSSIBLE."
350 PRINT "IF IT IS NOT POSSIBLE, YOU FORFEIT YOUR TURN BY"
360 PRINT "TYPING '0,0' FOR YOUR (ROW,COL) MOVE."
370 PRINT
380 REM INITIALIZE
390 PRINT "SHOULD I WAIT BEFORE MAKING MY MOVES [Y OR N]";
400 F2=0
410 INPUT X$
420 IF X$="N" GOTO 460
430 IF X$<>"Y" GOTO 410
440 F2=1
450 PRINT "OK, TYPING ANY CHARACTER WILL LET ME GO."
460 PRINT "SHOULD I PLAY MY BEST STRATEGY [Y OR N]";
470 S2=0
480 INPUT X$
490 IF X$="N" GOTO 520
500 IF X$<>"Y" GOTO 460
510 S2=2
520 B=-1
530 W=1
540 D$(B+1)="X"
550 D$(0+1)="."
560 D$(W+1)="O"
570 FOR K=1 TO 8
580 READ I4(K)
590 NEXT K
600 DATA 0,-1,-1,-1,0,1,1,1
610 FOR K=1 TO 8
620 READ J4(K)
630 NEXT K
640 DATA 1,1,0,-1,-1,-1,0,1
650 FOR K=1 TO 8
660 READ C$(K)
670 NEXT K
680 DATA "A","B","C","D","E","F","G","H"
690 REM SET UP A NEW GAME
700 FOR I=0 TO 9
710 FOR J=0 TO 9
720 A(I,J)=0
730 NEXT J
740 NEXT I
750 A(4,4)=W
760 A(5,5)=W
770 A(4,5)=B
780 A(5,4)=B
790 C1=2
800 H1=2
810 N1=4
820 Z=0
830 REM HUMAN'S CHOICES
840 PRINT "DO YOU WANT TO HAVE 'X' OR 'O' [X OR O]";
850 C=W
860 H=B
870 INPUT X$
880 IF X$="X" GOTO 920
890 IF X$<>"O" GOTO 840
900 C=B
910 H=W
920 PRINT "DO YOU WANT TO GO FIRST [Y OR N]";
930 INPUT X$
940 IF X$="N" GOTO 1020
950 IF X$<>"Y" GOTO 920
960 REM PRINT INITIAL BOARD
970 GOSUB 3080
980 GOTO 1670
990 REM COMPUTER'S MOVE
1000 IF F2=0 GOTO 1020
1010 INPUT X$
1020 B1=-1
1030 I3=0\J3=0
1040 T1=C
1050 T2=H
1060 REM SCAN FOR BLANK SQUARE
1070 FOR I=1 TO 8
1080 FOR J=1 TO 8
1090 IF A(I,J)<>0 GOTO 1360
1100 REM FOUND A BLANK SQUARE
1110 REM DOES IT HAVE AN OPPONENT AS A NEIGHBOR ?
1120 GOSUB 2600
1130 IF F1=0 GOTO 1360
1140 REM FOUND AN OPPONENT AS A NEIGHBOR
1150 REM HOW MANY OF HIS PIECES CAN WE FLIP ?
1160 REM (DON'T DO IT NOW)
1170 U=-1
1180 GOSUB 2800
1190 REM EXTRA POINTS FOR BOUNDRY POSITION
1200 IF S1=0 GOTO 1360
1210 IF (I-1)*(I-8)<>0 GOTO 1230
1220 S1=S1+S2
1230 IF (J-1)*(J-8)<>0 GOTO 1260
1240 S1=S1+S2
1250 REM IS THIS BETTER THAN THE BEST FOUND SO FAR ?
1260 IF S1<B1 GOTO 1360
1270 IF S1>B1 GOTO 1320
1280 REM A TIE; RANDOM DECISION
1290 R=RND(1)
1300 IF R>.5 GOTO 1360
1310 REM YES
1320 B1=S1
1330 I3=I
1340 J3=J
1350 REM END OF SCAN LOOP
1360 NEXT J
1370 NEXT I
1380 REM COULD WE DO ANYTHING ?
1390 IF B1>0 GOTO 1460
1400 REM NO
1410 PRINT "I HAVE TO FORFET MY MOVE"
1420 IF Z=1 GOTO 2170
1430 Z=1
1440 GOTO 1670
1450 REM MAKE THE MOVE
1460 Z=0
1470 PRINT "I WILL MOVE TO ";
1480 PRINT I3;
1490 PRINT ",";
1500 PRINT C$(J3)
1510 I=I3
1520 J=J3
1530 U=1
1540 GOSUB 2800
1550 C1=C1+S1+1
1560 H1=H1-S1
1570 N1=N1+1
1580 PRINT "THAT GIVES ME ";
1590 PRINT S1;
1600 PRINT "OF YOUR PIECES"
1610 REM PRINT OUT BOARD
1620 GOSUB 3080
1630 REM TEST FOR END OF GAME
1640 IF H1=0 GOTO 2170
1650 IF N1=64 GOTO 2170
1660 REM HUMAN'S MOVE
1670 T1=H
1680 T2=C
1690 PRINT "YOUR MOVE -- (ROW,COL)";
1700 INPUT I,X$
1710 IF I<0 GOTO 1700
1720 IF I>8 GOTO 1700
1730 IF I<>0 GOTO 1800
1740 PRINT "ARE YOU FORTITING YOUR TURN [Y OR N]";
1750 INPUT X$
1760 IF X$="N" GOTO 1690\IF X$<>"Y" GOTO 1740
1770 IF Z=1 GOTO 2170
1780 Z=1
1790 GOTO 1000
1800 FOR J=1 TO 8
1810 IF C$(J)=X$ GOTO 1850
1820 NEXT J
1830 GOTO 1700
1840 REM CHECK IF BLANK
1850 IF A(I,J)=0 GOTO 1890
1860 PRINT "SORRY, THAT SQUARE IS OCCUPIED, TRY AGAIN";
1870 GOTO 1700
1880 REM CHECK FOR LEGAL NEIGHBOR
1890 GOSUB 2600
1900 IF F1=1 GOTO 1950
1910 PRINT "SORRY, YOU ARE NOT NEXT TO ONE OF MY PIECES.";
1920 PRINT " TRY AGAIN"
1930 GOTO 1700
1940 REM CHECK IF LEGAL RUN
1950 U=-1
1960 GOSUB 2800
1970 IF S1>0 GOTO 2010
1980 PRINT "SORRY, THAT DOES NOT FLANK A ROW. TRY AGAIN";
1990 GOTO 1700
2000 REM EVERYTHING LEGAL
2010 Z=0
2020 PRINT "THAT GIVES YOU ";
2030 PRINT S1;
2040 PRINT " OF MY PIECES"
2050 U=1
2060 GOSUB 2800
2070 H1=H1+S1+1
2080 C1=C1-S1
2090 N1=N1+1
2100 REM PRINT OUT BOARD
2110 GOSUB 3080
2120 REM TEST FOR END OF GAME
2130 IF C1=0 GOTO 2170
2140 IF N1=64 GOTO 2170
2150 GOTO 1000
2160 REM END OF GAME WRAP UP
2170 PRINT
2180 PRINT "YOU HAVE ";
2190 PRINT H1;
2200 PRINT " PIECES AND I HAVE ";
2210 PRINT C1;
2220 PRINT " PIECES -- ";
2230 IF H1=C1 GOTO 2270
2240 IF H1>C1 GOTO 2290
2250 PRINT "SORRY, I WON THAT ONE."
2260 GOTO 2300
2270 PRINT " A TIE !!"
2280 GOTO 2480
2290 PRINT "YOU WON !"
2300 C1=C1-H1
2310 IF C1>0 GOTO 2330
2320 C1=-C1
2330 C1=(64*C1)/N1
2340 PRINT "THAT WAS A ";
2350 IF C1<11 GOTO 2470
2360 IF C1<25 GOTO 2450
2370 IF C1<39 GOTO 2430
2380 IF C1<53 GOTO 2410
2390 PRINT "PERFECT GAME."
2400 GOTO 2480
2410 PRINT "WALKAWAY."
2420 GOTO 2480
2430 PRINT "FIGHT."
2440 GOTO 2480
2450 PRINT "HOT GAME."
2460 GOTO 2480
2470 PRINT "SQUEAKER !!"
2480 PRINT
2490 PRINT "ANOTHER GAME? [Y OR N]";
2500 INPUT X$
2510 IF X$="Y" GOTO 700
2520 IF X$<>"N" GOTO 2490
2530 PRINT "THANKS FOR PLAYING."
2540 STOP
2550 REM
2560 REM SUBROUTINE TEST-FOR-PROPER NEIGHBOR
2570 REM ASSUMES:
2580 REM  I,J LOCATES A BLANK SQUARE
2590 REM  YOU HAPE TO SEE AN ADJACENT T2 (=-T1)
2600 FOR I1=-1 TO 1
2610 FOR J1=-1 TO 1
2620 IF A(I+I1,J+J1)=T2 GOTO 2690
2630 NEXT J1
2640 NEXT I1
2650 REM NO T2 FOUND; FAILURE
2660 F1=0
2670 RETURN
2680 REM SUCCESS
2690 F1=1
2700 RETURN
2710 REM SUBROUTINE SCORE-AND-UPDATE
2720 REM ASSUMES:
2730 REM  (I,J) IS A TENTATIVE PLACE FOR A PIECE T1.
2740 REM  WANT RUNS OF T2=-T1, TERMINATED BY A T1.
2750 REM  IF U IS TRUE (1), MARK THOSE RUNS AS T1'S.
2760 REM  RETURN SUM OF AL RUNS (T2'S ONLY) IN S1.
2770 REM  MAIN PROGRAM CONTAINS THE FOLOWING ARRAYS:
2780 REM    I4:  0  -1  -1  -1  0  1  1  1
2790 REM    J4:  1  1  0  -1  -1  -1  0  1
2800 S1=0
2810 FOR K=1 TO 8
2820 I5=I4(K)
2830 J5=J4(K)
2840 I6=I+I5
2850 J6=J+J5
2860 S3=0
2870 IF A(I6,J6)<>T2 GOTO 3050
2880 REM LOOP THROUGH THE RUN
2890 S3=S3+1
2900 I6=I6+I5
2910 J6=J6+J5
2920 IF A(I6,J6)=T1 GOTO 2950
2930 IF A(I6,J6)=0 GOTO 3050
2940 GOTO 2890
2950 S1=S1+S3
2960 IF U<>1 GOTO 3050
2970 REM UPDATE BOARD
2980 I6=I
2990 J6=J
3000 FOR K1=0 TO S3
3010 A(I6,J6)=T1
3020 I6=I6+I5
3030 J6=J6+J5
3040 NEXT K1
3050 NEXT K
3060 RETURN
3070 REM SUBROUTINE PRINT-BOARD
3080 PRINT
3090 PRINT "      A   B   C   D   E   F   G   H"
3100 FOR I=1 TO 8
3110 PRINT I;
3120 FOR J=1 TO 8
3130 PRINT "   ";
3140 PRINT D$(A(I,J)+1);
3150 NEXT J
3160 PRINT
3170 NEXT I
3180 PRINT
3190 RETURN
3200 END



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search