Retrocomputing

Tic Tac Toe for COBOL 3.0

This program is included in to software package. Note that since it was written for MS-DOS, the character set is Codepage 437. For the purpose of presenting it on a webpage, it has been converted to UTF-8.

      $set ans85
       identification division.
           program-id. tictac.
       environment division.
           configuration section.
           source-computer. ibm-pc.
           object-computer. ibm-pc.
       special-names.
           console is crt.
       data division.
       working-storage section.
       01 tictac-00.
        02 tictac-q.
           03 game             pic x(10) value spaces.
           03 filler-0         pic x(70) value spaces.
           03 question         pic x(20) value spaces.
        02 filler.
           03 filler-1         pic x(414) value all spaces.
           03 tictac-00-0735   pic x(17) value "7║      8║      9".
           03 filler-2         pic x(64) value all spaces.
           03 tictac-00-0836   pic x(09) value "║       ║".
           03 filler-3         pic x(71) value all spaces.
           03 tictac-00-0936   pic x(09) value "║       ║".
           03 filler-4         pic x(64) value all spaces.
           03 tictac-00-1029 pic x(23) value "═══════╬═══════╬═══════".
           03 filler-5         pic x(63) value all spaces.
           03 tictac-00-1135   pic x(17) value "4║      5║      6".
           03 filler-6         pic x(64) value all spaces.
           03 tictac-00-1236   pic x(09) value "║       ║".
           03 filler-7         pic x(71) value all spaces.
           03 tictac-00-1336   pic x(09) value "║       ║".
           03 filler-8         pic x(64) value all spaces.
           03 tictac-00-1429 pic x(23) value "═══════╬═══════╬═══════".
           03 filler-9         pic x(63) value all spaces.
           03 tictac-00-1535   pic x(17) value "1║      2║      3".
           03 filler-10        pic x(64) value all spaces.
           03 tictac-00-1636   pic x(09) value "║       ║".
           03 filler-11        pic x(71) value all spaces.
           03 tictac-00-1736   pic x(09) value "║       ║".
           03 filler-12        pic x(595) value all spaces.
       01 entry-array.
           03 entry-char       pic x               occurs 9 times.
       01 check-array.
           03 check            pic s99     comp  occurs 9 times.
       01 xcount               pic 9(2)    comp.
       01 ocount               pic 9(2)    comp.
       01 factor               pic s9(2)   comp.
       01 char                 pic x.
       01 char9 redefines char pic 9.
       01 idx                  pic 9(2)    comp.
       01 result               pic 9(2)    comp.
       01 cursor-pos.
           03 row              pic 9(2)    comp  value 99.
           03 filler           pic 9(2)    comp  value 99.
       01 address-init.
           03 filler           pic 9(4)    value   1732.
           03 filler           pic 9(4)    value   1740.
           03 filler           pic 9(4)    value   1748.
           03 filler           pic 9(4)    value   1332.
           03 filler           pic 9(4)    value   1340.
           03 filler           pic 9(4)    value   1348.
           03 filler           pic 9(4)    value   0932.
           03 filler           pic 9(4)    value   0940.
           03 filler           pic 9(4)    value   0948.
       01 address-array        redefines   address-init.
           03 addr             pic 9(4)    occurs 9 times.
       01 location             pic 9(4).
       01 game-lines value     "147123311113332436978979".
           03 a                pic 9       occurs 8 times.
           03 b                pic 9       occurs 8 times.
           03 c                pic 9       occurs 8 times.
       01 i                    pic 9(2)    comp.
       01 j                    pic 9(2)    comp.
       01 moves                pic 9(2)    comp.

       78 clear-screen        value x"e4".
       78 sound-bell          value x"e5".

       procedure division.
       play-game section.
       play-1.
           perform with test after
               until char not = "Y" and char not = "y"
               call clear-screen
               display
                   "To select a square type a number between 1 and 9"
                   upon crt
               perform init
               move "Shall I start ? " to question
               perform get-reply
               if char = "Y" or char = "y"
                   move 10 to check(5)
                   perform put-move
               end-if
               perform new-move until game not = spaces
               move "Play again ?    " to question
               perform get-reply
           end-perform.

       play-stop.
           stop run.

       get-reply section.
           display tictac-q at 0201
           accept char at 0317 with no-echo auto-skip
           move spaces to question
           display tictac-00 at 0201.

       init section.
           move "y" to char
           move spaces to entry-array
           move low-values to check-array
           move spaces to game
           move zero to moves.

       new-move section.
           perform get-move with test after until char9 not = 0
           perform move-check
           if game not = "stalemate"
               move low-values to check-array
               perform check-line varying i from 1 by 1
                               until i > 8 or game not = spaces
               if game not = "You win"
                   perform put-move
               end-if
               if game = "I win" or game = "You win"
                     perform varying idx from a(j) by b(j)
                                                until idx > c(j)
                         move addr(idx) to location
                         move entry-char(idx) to char
                         display char at location with blink highlight
                     end-perform
               end-if
           end-if.

       check-line section.
           move zero to xcount,ocount,factor
           perform count-up varying idx from a(i) by b(i)
                                            until idx > c(i)
           if ocount = 0 or xcount = 0
               evaluate true
               when ocount = 2
                   if i = 4
                       move 6 to j
                       move zero to xcount,ocount
                       perform count-up varying idx from a(j) by b(j)
                                                until idx > c(j)
                       if xcount = 3
                           move 6 to i
                       end-if
                   end-if
                   if xcount not = 3
                       move 50 to factor
                       move "I win" to game
                       move i to j
                   end-if
               when xcount = 2
                   move 20 to factor
               when ocount = 1
                   move  4 to factor
               when xcount = 1
                   if entry-char(5) = "x"
                       move  1 to factor
                   else
                       move -1 to factor
                   end-if
               when ocount = 0
                   if xcount = 0
                       move  2 to factor
                   end-if
               end-evaluate
           end-if
           if xcount = 3
               move "You win" to game
               move i to j
           else
               perform varying idx from a(i) by b(i) until idx > c(i)
                   if entry-char(idx) = space
                       add factor to check(idx)
                   end-if
               end-perform
           end-if.

       count-up section.
           if entry-char(idx) = "X"        add 1 to xcount
           else if entry-char(idx) = "O"   add 1 to ocount.

       put-move section.
           move zero to idx
           move -99 to factor
           perform find-pos varying i from 1 by 1 until i > 9
           move "O" to entry-char(idx)
           perform move-check.

       move-check section.
           move addr(idx) to location
           move entry-char(idx) to char
           display char at location
           add 1 to moves
           if moves > 8 and game = spaces
               move "stalemate" to game
           end-if.

       find-pos section.
           if entry-char(5) = space
               move check(5) to factor
               move 5 to idx
           else
               if check(i) not < factor and entry-char(i) = space
                   move check(i) to factor
                   move i to idx
               end-if
           end-if.

       get-move section.
           display "Please select an empty square" at 0201
           move 0 to char9
           accept char9 at 0231 with auto-skip
           if char9 = 0
               call sound-bell
           else
               move char9 to idx
               if entry-char(idx) = space
                   move "X" to entry-char(idx)
               else
                   move 0 to char9
                   call sound-bell
               end-if
           end-if.