TITLE MATTAC XALL AC=0 PNT=10 IX=1 RND=11 TST=6 ID=2 BIX=4 ZZ=12 Y=7 X=130 O=117 HLOOP=5 CNT=3 OPDEF TYPE [TTCALL 3,0] OPDEF TYPE1 [TTCALL 1,0] LOC 41 ;DEFAULT UUO,DDT AND REENTER POINTS = ST1 XWD 0,ST1 LOC 74 XWD 0,ST1 LOC 124 XWD 0,ST1 LOC 137 XWD 0,2 RELOC START: TYPE [ASCIZ/ MATRIX TIC-TAC-TOE (V.2 12-70 MEK) /] ST1: TYPE [ASCIZ/DO YOU WANT THE INSTRUCTIONS TYPED (Y=YES)? /] TTCALL 4,AC TTCALL 11, TYPE CR CAIN AC,"Y" TYPE INS TYPE [ASCIZ/DO YOU WANT A LIST OF ACCEPTED MOVES TYPED (Y=YES)?/] TTCALL 4,AC TTCALL 11, TYPE CR CAIN AC,"Y" TYPE MVTYP SETOM MFLAG PLAY1: TYPE [ASCIZ /WILL YOU PLAY 'X' OR 'O'? /] TTCALL 4,AC TTCALL 11, TYPE CR CAIN AC,"X" JRST PLX CAIN AC,"O" JRST PLO TYPE [ASCIZ/PLEASE PLAY 'X' OR 'O'. /] JRST PLAY1 PLX: MOVEM AC,PPLAY# MOVEI AC,"O" MOVEM AC,CPLAY# JRST XXX PLO: MOVEM AC,PPLAY MOVEI AC,"X" MOVEM AC,CPLAY XXX: JSR PLSTAT GO: MOVEI AC," " MOVEI IX,^D100 CLEAR1: MOVEM AC,A(IX) SOJGE IX,CLEAR1 TYPE [ASCIZ/THE BOARD HAS BEEN CLEARED. /] JRST YMOVE PPLAY: "?" CPLAY: "?" PLSTAT: 0 TYPE [ASCIZ/COMPUTER PLAYS '/] TYPE1 CPLAY TYPE [ASCIZ/' PLAYER PLAYS '/] TYPE1 PPLAY TYPE [ASCIZ/' /] TYPE CR JRSTF @PLSTAT CLR: 0 SETZM TEST MOVE RND,[XWD TEST,TEST+1] BLT RND,TEST+^D99 ;CLEAR TEST - TEST + 99 JRSTF @CLR BLKTST: 0 MOVEI ZZ,10 MOVEI ID,^D99 MOVE Y,TEST(ID) CAIN Y,@ZZ JRST MOVOK SOJN ID,.-3 SOJN ZZ,.-5 JRSTF @BLKTST MOVOK: SETOM CPL MOVEM PNT,A(ID) MOVE RND,ID JRST BLK TEST:INPT: BLOCK ^D100 ;RANDOM MOVE GENERATOR RAN: MSTIME RND, ANDI RND,177 CAILE RND,^D99 JRST RAN MOVE AC,A(RND) CAIE AC," " JRST RAN JSR CMOVE SETOM CPL JRST DRTST ;COMPUTER MOVE TYPEOUT SUBROUTINE CMOVE: 0 TYPE [ASCIZ/COMPUTER MOVES /] MOVE AC,CPLAY MOVEM AC,A(RND) MOVEI AC,"A" IDIVI RND,^D10 ADD AC,RND TYPE1 AC ADDI RND+1,60 TYPE1 RND+1 TYPE CR JRSTF @CMOVE ;THE MOVTST SUBROUTINE TESTS ALL POSSIBLE MOVE COMBINATIONS ;TO ASSURE THAT A LEGAL MOVE HAS BEEN MADE. DEFINE COMP (A) < MOVE AC,MTEST(BIX) CAMN AC,INPT JSR A ADDI BIX,1> MOVTST: TTCALL 11, MOVE AC,INPT MOVE AC,MTEST(BIX) CAMN AC,INPT EXIT ADDI BIX,1 COMP RESTAR COMP FBOARD MOVE PNT,[POINT 7,INPT] ILDB Y,PNT CAIGE Y,"A" JRST ERRMZ CAILE Y,"J" JRST ERRMZ ILDB ZZ,PNT CAIGE ZZ,"0" JRST ERRMZ CAILE ZZ,"9" JRST ERRMZ MOVE TST,INPT ;INPT HAS MOVE IN ASCII TLZ TST,777760 ;CLEAR FIRST TWO ASCII CHARACTERS TO BUILD MOVE MASK SKIPE TST JRST ERRMZ SUBI ZZ,60 SUBI Y,101 IMULI Y,12 ADDI Y,A ADD ZZ,Y MADDR: MOVE TST,@ZZ CAIN TST," " JRST OK CAMN TST,PPLAY TYPE [ASCIZ/YOU HAVE ALREADY USED THAT MOVE. /] CAME TST,PPLAY TYPE [ASCIZ/THE COMPUTER HAS ALREADY USED THAT MOVE. /] YMOVE: SETZB BIX,INPT MOVE PNT,[POINT 7,INPT] SETZM MFLAG# TYPE [ASCIZ/YOUR MOVE IS - /] TTYIN: TTCALL 4,AC CAIN AC,15 JRST MOVTST IDPB AC,PNT JRST TTYIN OK: MOVE TST,PPLAY MOVEM TST,@MADDR SETZM PASS2 SETZM PASS3 SETZM PASS4 SETZM CPL# SETZM CPLA# JSR HSUM SETOM CPLA SETOM PASS1# ;PASS ONE TESTS FOR 4 IN A ROW FOR COMPUTER. JSR CLR JSR HSUM JSR CLR SETZM PASS1 JSR HSUM JSR CLR TWO: SETOM PASS2 JSR HSUM JSR CLR SETOM PASS1 JSR HSUM JSR CLR THREE: SETOM PASS3 SETZM PASS2 SETZM PASS1 JSR HSUM JSR CLR SETOM PASS1 JSR HSUM JSR CLR SETZM PASS3 FOUR: SETOM PASS4 SETZM PASS1 JSR HSUM JSR CLR SETOM PASS1 JSR HSUM DRTST: MOVEI IX,^D99 MOVEI AC," " TSTA: CAME AC,A(IX) JRST TSTX SKIPN CPL JRST RAN JRST YMOVE TSTX: SOJGE IX,TSTA TYPE [ASCIZ/THE GAME IS A DRAW. /] JRST PCON MTEST: ASCII /EXIT/ ASCII /RESTA/ ASCII /BOARD/ ERRMZ: SKIPN MFLAG TYPE [ASCIZ/INVALID ENTRY, TRY AGAIN. /] JRST YMOVE ;RESTART CONTROL SUBROUTINE RESTAR: 0 TYPE CR JSR PLSTAT JRST GO ;BOARD TYPEOUT SUBROUTINE FBOARD: 0 TYPE CR HD: TYPE [ASCIZ/ 0 1 2 3 4 5 6 7 8 9 /] MOVEI IX,0 MOVEI AC,"A" FBD1: HRLI IX,-12 TYPE1 AC TYPE1 SP FBD2: TYPE1 DASH TYPE1 A(IX) AOBJN IX,FBD2 TYPE1 DASH TYPE1 SP TYPE1 AC TYPE CR ADDI AC,1 CAIE AC,"K" JRST FBD1 XCT HD SETOM MFLAG JRSTF @FBOARD DASH: 055 SP: 40 ;WIN TESTING SUBROUTINE - THE STATUS OF A MOVE COMBINATION ;IS LOADED INTO AC BY THE SUMMING ROUTINE WHICH THEN JSR'S ;HERE TO SEE IF THIS MOVE COMBINATION CONTAINS A WIN. WINTST: 0 MOVEI PNT,@PPLAY IMULI PNT,5 CAIN AC,5*X JRST XWIN CAIN AC,5*O JRST OWIN JRSTF @WINTST XWIN: CAMN AC,PNT JRST PWIN JRST CWIN OWIN: CAMN AC,PNT JRST PWIN CWIN: TYPE [ASCIZ/COMPUTER HAS WON. /] JRST PCON PWIN: TYPE [ASCIZ/YOU HAVE WON. /] PCON: TYPE [ASCIZ/DO YOU WANT A FINAL BOARD TYPEOUT? (Y=YES) /] TTCALL 4,AC TTCALL 11, MOVEM AC,TEMP# MOVEI AC,"*" MOVEM AC,@13 MOVEM AC,@14 MOVEM AC,@15 MOVEM AC,@16 MOVEM AC,@17 MOVE AC,TEMP CAIN AC,"Y" JSR FBOARD PCONX: TYPE [ASCIZ/WOULD YOU LIKE TO PLAY ANOTHER GAME? (Y=YES) /] TTCALL 4,AC TTCALL 11, TYPE CR CAIN AC,"Y" JRST GO EXIT ;SUMMING NETWORK - THIS SUBROUTINE ADDS ALL WIN COMBINATIONS ;AND DOES A JSR TO WINTST FOR EACH ONE TO TEST FOR A WIN. HSUM: 0 SETZM TSTLOC MOVEI HLOOP,12 MOVEI CNT,0 MOVEI IX,A LOOPA: HRLI CNT,-6 LOOPB: MOVEI AC,0 ADD AC,0(IX) ADD AC,1(IX) ADD AC,2(IX) ADD AC,3(IX) ADD AC,4(IX) DEFINE SETUP < MOVEI 13,@.-5 MOVEI 14,@.-5 MOVEI 15,@.-5 MOVEI 16,@.-5 MOVEI 17,@.-5 JSR WINTST SKIPE CPLA JSR CHECK> SETUP AOJ IX, AOBJN CNT,LOOPB ADDI IX,4 SOJN HLOOP,LOOPA VSUM: MOVEI HLOOP,12 MOVEI IX,0 LOOPC: HRLI CNT,-6 LOOPD: MOVEI AC,0 ADD AC,A(IX) ADD AC,B(IX) ADD AC,C(IX) ADD AC,D(IX) ADD AC,E(IX) SETUP ADDI IX,12 AOBJN CNT,LOOPD SUBI IX,^D59 SOJN HLOOP,LOOPC RSUM: MOVEI HLOOP,6 MOVEI IX,0 LOOPE: HRLI CNT,-6 LOOPF: MOVEI AC,0 ADD AC,A+4(IX) ADD AC,B+3(IX) ADD AC,C+2(IX) ADD AC,D+1(IX) ADD AC,E (IX) SETUP ADDI IX,12 AOBJN CNT,LOOPF SUBI IX,^D59 SOJN HLOOP,LOOPE LSUM: MOVEI HLOOP,6 MOVEI IX,0 LOOPG: HRLI CNT,-6 LOOPH: MOVEI AC,0 ADD AC,A (IX) ADD AC,B+1(IX) ADD AC,C+2(IX) ADD AC,D+3(IX) ADD AC,E+4(IX) SETUP ADDI IX,12 AOBJN CNT,LOOPH SUBI IX,^D59 SOJN HLOOP,LOOPG SKIPE TSTLOC# JSR BLKTST JRSTF @HSUM CHECK: 0 DEFINE TEST (X) < MOVE Y,@X CAIE Y," " JRST .+4 SUBI X,A SETOM TSTLOC AOS TEST(X)> MOVE PNT,CPLAY CAIE PNT,"X" JRST XTEST OTEST: SKIPE PASS1 JRST XTEST+2 SKIPE PASS2# JRST COMP2 SKIPE PASS3# JRST COMP3 SKIPE PASS4# JRST COMP4 CAIE AC,4*O+40 JRSTF @CHECK JRST BLOCK1 COMP2: CAIE AC,3*O+2*40 JRSTF @CHECK JRST BLOCK1 COMP2A: CAIN AC,3*X+2*40 JRST BLOCK1 JRSTF @CHECK COMP3: CAIE AC,2*O+3*40 JRSTF @CHECK JRST BLOCK1 COMP3A: CAIN AC,2*X+3*40 JRST BLOCK1 JRSTF @CHECK COMP4: CAIE AC,1*O+4*40 JRSTF @CHECK JRST BLOCK1 COMP4A: CAIN AC,1*X+4*40 JRST BLOCK1 JRSTF @CHECK BLOCK1: TEST 15 TEST 16 TEST 14 TEST 17 TEST 13 JRSTF @CHECK BLK: JSR CMOVE SETZM CPLA JSR HSUM JRST YMOVE XTEST: SKIPE PASS1 JRST OTEST+2 SKIPE PASS2 JRST COMP2A SKIPE PASS3 JRST COMP3A SKIPE PASS4 JRST COMP4A CAIN AC,4*X+40 JRST BLOCK1 JRSTF @CHECK ;RESERVE 100 LOCATIONS FOR THE BOARD MATRIX A: BLOCK 12 B: BLOCK 12 C: BLOCK 12 D: BLOCK 12 E: BLOCK 12 F: BLOCK ^D10*5 ;ASCII TEXT LIST INS: ASCIZ/ MATRIX TIC-TAC-TOE IS PLAYED ON A TEN BY TEN MATRIX IN A MANNER SIMILAR TO ORDINARY TIC-TAC-TOE. THE PLAYER AND THE COMPUTER WILL ALTERNATELY PLACE A MOVE AT ONE OF THE MATRIX COORDINATES. EACH WILL TRY TO PLACE FIVE MOVES IN A ROW TO EFFECT A WIN. THE PLAYER WILL ALWAYS BE GIVEN THE FIRST MOVE. THIS FORCES THE COMPUTER TO PLAY DEFENSIVELY AND GIVES THE PLAYER A REASONABLE PROBABILITY OF WINNING. THERE ARE 192 WIN COMBINATIONS ON THE BOARD. GOOD LUCK. / MVTYP: ASCIZ/ THE AVAILABLE MOVES ARE: (A0-J9) -BOARD COORDINATES AT WHICH THE PLAYER WISHES TO PLACE HIS MOVE. EXIT -TERMINATES THE GAME. BOARD -PRINTS MATRIX SHOWING ALL MOVES THAT HAVE BEEN MADE . RESTART -CLEARS THE BOARD AND RESTARTS THE GAME. / CR: ASCIZ/ / END START