summaryrefslogtreecommitdiff
path: root/tictactoe.cbl
blob: 75e7bc4fd74286556cb6240b2817b6afd5283958 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
       IDENTIFICATION DIVISION.
       PROGRAM-ID. tictactoe.
       AUTHOR. Trey Bastian.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 Player.
         02 Player1.
             03 Turn PIC 9 value 1.
         02 Player2.
             03 Turn PIC 9 VALUE ZEROS.
         02 PlayerMove PIC 99 VALUE ZEROS.
               88 ValidInput VALUE 1 THRU 9.
         02 Won PIC 9 VALUE ZERO.
               88 Player1Win VALUE 1.
               88 Player2Win VALUE 2.
               88 Stalemate VALUE 3.

       01 Board OCCURS 9 TIMES.
          02 State PIC X VALUE "N".
          02 Score PIC 9 VALUE ZEROS.

       01 TMP PIC 99 VALUE 0.
       01 TMP2 PIC 99 VALUE 0.
       01 TMP3 PIC 99 VALUE 0.
       01 TMP4 PIC 99 VALUE 0.
       01 BoardHasBlanks PIC 9 VALUE 0.

       PROCEDURE DIVISION.

         Intro SECTION.
         DISPLAY "Welcome to Trey's Dev Shed Tic Tac Toe Extravaganza!".

         Setup SECTION.
           MOVE 2 TO Score OF Board(1).
           MOVE 7 TO Score OF Board(2).
           MOVE 6 TO Score OF Board(3).
           MOVE 9 TO Score OF Board(4).
           MOVE 5 TO Score OF Board(5).
           MOVE 1 TO Score OF Board(6).
           Move 4 TO Score OF Board(7).
           MOVE 3 TO Score OF Board(8).
           MOVE 8 TO Score OF Board(9).

         Game SECTION.
             PERFORM UNTIL Player1Win OR Player2Win OR Stalemate

               PERFORM VARYING TMP FROM 1 BY 1 UNTIL TMP > 3
                 DISPLAY "----------------"
                 DISPLAY "|" WITH NO ADVANCING
                 PERFORM VARYING TMP2 FROM 1 BY 1 UNTIL TMP2 > 3

                   COMPUTE TMP3 = (TMP * 3) + TMP2 - 3

                   IF State OF Board(TMP3) = "N" THEN
                     DISPLAY " " TMP3 " |" WITH NO ADVANCING
                   ELSE
                     DISPLAY " " State OF Board(TMP3) " |" 
                     WITH NO ADVANCING
                   END-IF
                 END-PERFORM
                 DISPLAY SPACE
               END-PERFORM
               DISPLAY "---------------"

               PERFORM UNTIL ValidInput             
                 IF Turn OF Player1 = 1 THEN
                 DISPLAY "Player 1 " WITH NO ADVANCING
               ELSE
                 DISPLAY "Player 2 " WITH NO ADVANCING
               END-IF

               DISPLAY "make your move [1-9]: " WITH NO ADVANCING
               ACCEPT PlayerMove 

               IF ValidInput THEN
                 
                 IF State OF Board(PlayerMove) EQUAL "N"
                   EVALUATE 1 
                     WHEN Turn OF Player1
                       Move "X" TO State OF Board(PlayerMove) 

                       MOVE 0 TO Turn OF Player1
                       MOVE 1 TO Turn OF PLayer2

                     WHEN Turn OF Player2
                       MOVE "O" TO State OF Board(PlayerMove) 

                       MOVE 1 TO Turn OF Player1
                       MOVE 0 TO Turn OF Player2
                    END-EVALUATE
                 ELSE
                   MOVE 0 TO PlayerMove
                   DISPLAY "Invalid Move, Please Try Again"
               ELSE
                 DISPLAY "Invalid Move, Please Try Again"
               END-IF
             END-PERFORM
             MOVE 0 TO PlayerMove

      * Check Winners
             MOVE 0 TO BoardHasBlanks
             PERFORM VARYING TMP FROM 1 BY 1 UNTIL TMP = 9 OR
               Player1Win OR Player2Win 
               IF State of Board(TMP) = "N" THEN
                 MOVE 1 TO BoardHasBlanks
               END-IF
               PERFORM VARYING TMP2 FROM 1 BY 1 UNTIL TMP2 = 9 OR
                 Player1Win OR Player2Win
                 PERFORM VARYING TMP3 FROM 1 BY 1 UNTIL TMP3 = 9 OR 
                   Player1Win OR Player2Win
                       
                   IF TMP NOT EQUAL TMP2 AND TMP NOT EQUAL TMP3 AND
                     TMP2 NOT EQUAL TMP3 THEN

                     ADD Score OF Board(TMP) TO Score OF Board(TMP2)
                     GIVING TMP4
                     ADD Score OF Board(TMP3) To TMP4
                     IF TMP4 = 15 THEN 
                       EVALUATE 0 
                         WHEN Turn OF Player1
                           IF State OF Board(TMP) EQUAL "X" AND State 
                             OF Board(TMP2) EQUAL "X" 
                             AND STATE OF BOARD(TMP3) EQUAL "X" THEN
                               SET Player1Win TO TRUE 
                            END-IF
                         WHEN Turn OF Player2
                           IF State OF Board(TMP) EQUAL "O" AND State 
                             OF Board(TMP2) EQUAL "O" AND STATE 
                             OF BOARD(TMP3) EQUAL "O" THEN
                             SET Player2Win TO TRUE 
                           END-IF
                       END-EVALUATE
                    END-IF
                   END-IF
                  END-PERFORM
                END-PERFORM
              END-PERFORM

              IF BoardHasBlanks = 0 THEN
                Set Stalemate to TRUE
              END-IF
                

             END-PERFORM.
         Outro SECTION.
             EVALUATE TRUE
               WHEN Player1Win DISPLAY "CONGRATS PLAYER 1 Has Won!"
               WHEN Player2Win DISPLAY "CONGRATS PLAYER 2 Has Won!"
               WHEN Stalemate DISPLAY "No one won!" 
              END-EVALUATE
              STOP RUN.