diff --git a/src/bh/ttt.logo b/src/bh/ttt.logo index a096f003..b3707605 100644 --- a/src/bh/ttt.logo +++ b/src/bh/ttt.logo @@ -1,49 +1,109 @@ ;;; Tic-Tac-Toe Game written by Dr. Brian Harvey ;;; Adapted to PDP-10/ITS LLOGO by Alexey Slyusar +;; version 0.01 + ;; OVERALL ORCHESTRATION +; debugged code TO TTT 10 LOCAL 'ME 20 LOCAL 'YOU -30 LOCAL 'POSITION -40 DRAW.BOARD -50 INIT -60 IF ALREADY.WONP :ME [PRINT [I WIN!] STOP] -70 IF TIEDP [PRINT [TIE GAME!] STOP] -80 YOUPLAY GETMOVE -90 IF ALREADY.WONP :YOU [PRINT [YOU WIN!] STOP] -100 IF TIEDP [PRINT [TIE GAME!] STOP] -110 MEPLAY GETMOVE +30 INIT +40 IF ALREADY.WONP :ME PRINT [$I WIN!$] STOP +50 IF TIEDP PRINT [$TIE GAME!$] STOP +60 YOUPLAY GETMOVE +70 IF ALREADY.WONP :YOU PRINT [$YOU WIN!$] STOP +80 IF TIEDP PRINT [$TIE GAME!$] STOP +90 MEPLAY GETMOVE +100 GO 40 END TO MAKE.TRIPLES -10 OP MAP "SUBSTITUTE.TRIPLE [123 456 789 147 258 369 159 357] +10 OP MAP 'SUBSTITUTE.TRIPLE [123 456 789 147 258 369 159 357] END TO SUBSTITUTE.TRIPLE :COMBINATION -10 OP MAP [ITEM ? :POSITION] :COMBINATION +10 OP MAP [SUBSTITUTE.TRIPLE.HPROC ?] :COMBINATION +END + +TO SUBSTITUTE.TRIPLE.HPROC :I +10 OP ITEM :I LISTARRAY 'POSITION END TO ALREADY.WONP :PLAYER -10 OP MEMBERP (WORD :PLAYER :PLAYER :PLAYER) (MAKE.TRIPLES) +10 OP MEMBERP (WORD :PLAYER :PLAYER :PLAYER)(MAKE.TRIPLES) END TO TIEDP -10 OP NOT REDUCE 'OR MAP.SE 'NUMBERP LISTARRAY 'POSITION +10 OP NOT REDUCE 'OR MAP 'NUMBERP LISTARRAY 'POSITION END TO YOUPLAY :SQUARE -10 DRAW :YOU :SQUARE -20 SETITEM :SQUARE :POSITION :YOU +10 (STORE (POSITION :SQUARE) :YOU) END +;YOUPLAY DEFINED TO MEPLAY :SQUARE -10 DRAW :ME :SQUARE -20 SETITEM :SQUARE :POSITION :YOU +10 (STORE (POSITION :SQUARE) :ME) END +;MEPLAY DEFINED -;;COMPUTE PROGRAM'S MOVES +;; INITIALIZATION +TO INIT +10 (ARRAY POSITION T 9) +20 (FILLARRAY 'POSITION [1 2 3 4 5 6 7 8 9]) +30 PRINT [$DO YOU WANT TO PLAY FIRST (X)$] +40 PRINT [$OR SECOND (O)? TYPE X OR O:$] +45 CR +50 CHOOSE +60 PRINT [$FOR EACH MOVE, TYPE A DIGIT 1-9.$] +END +;INIT DEFINED + +TO CHOOSE +10 LOCAL 'SIDE +20 MAKE 'SIDE (READCH) +;30 PRINT :SIDE +40 IF EQUAL :SIDE 'X CHOOSEX STOP +50 IF EQUAL :SIDE 'O CHOOSEO STOP +60 PRINT [$HUH? TYPE X OR O:$] +70 GO 20 +END +;CHOOSE DEFINED + +TO CHOOSEO +10 MAKE 'ME 'X +20 MAKE 'YOU 'O +END +;CHOOSEO DEFINED + +TO CHOOSEX +10 MAKE 'ME 'O +20 MAKE 'YOU 'X +END +;CHOOSEX DEFINED + +;; GET OPPONENTS MOVES +TO GETMOVE +10 LOCAL 'SQUARE +20 TYPE [$YOUR MOVE:$] +30 MAKE 'SQUARE READCH +40 PRINT :SQUARE +50 IF NUMBERP :SQUARE IF AND (:SQUARE > 0)(:SQUARE < 10) IF FREEP :SQUARE OP :S! +QUARE +60 PRINT [$NOT A VALID MOVE.$] +70 GO 20 +END +;GETMOVE DEFINED + +TO FREEP :SQUARE +10 OP NUMBERP ITEM :SQUARE (LISTARRAY 'POSITION) +END +;FREEP DEFINED + +;;COMPUTE PROGRAMS MOVES +; not debugged yet section TO PICKMOVE :TRIPLES 10 LOCAL 'TRY @@ -99,6 +159,5 @@ TO BEST.MOVE :MY.SINGLE 70 OP LAST :MY.SINGLE END -TO MAKE.TRIPLES -10 OP MAP 'SUBSTITUTE.TRIPE [123 456 789 147 258 369 159 357] -END +;; LOAD PROCEDURES FROM LIB.LOGO +RF LIB > DSK BH \ No newline at end of file