Tic Tac Toe implemented in COBOL
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. tictactoe.
3 AUTHOR. Trey Bastian.
4
5 DATA DIVISION.
6 WORKING-STORAGE SECTION.
7 01 Player.
8 02 Player1.
9 03 Turn PIC 9 value 1.
10 02 Player2.
11 03 Turn PIC 9 VALUE ZEROS.
12 02 PlayerMove PIC 99 VALUE ZEROS.
13 88 ValidInput VALUE 1 THRU 9.
14 02 Won PIC 9 VALUE ZERO.
15 88 Player1Win VALUE 1.
16 88 Player2Win VALUE 2.
17 88 Stalemate VALUE 3.
18
19 01 Board OCCURS 9 TIMES.
20 02 State PIC X VALUE "N".
21 02 Score PIC 9 VALUE ZEROS.
22
23 01 TMP PIC 99 VALUE 0.
24 01 TMP2 PIC 99 VALUE 0.
25 01 TMP3 PIC 99 VALUE 0.
26 01 TMP4 PIC 99 VALUE 0.
27 01 BoardHasBlanks PIC 9 VALUE 0.
28
29 PROCEDURE DIVISION.
30
31 Intro SECTION.
32 DISPLAY "Welcome to Trey's Dev Shed Tic Tac Toe Extravaganza!".
33
34 Setup SECTION.
35 MOVE 2 TO Score OF Board(1).
36 MOVE 7 TO Score OF Board(2).
37 MOVE 6 TO Score OF Board(3).
38 MOVE 9 TO Score OF Board(4).
39 MOVE 5 TO Score OF Board(5).
40 MOVE 1 TO Score OF Board(6).
41 Move 4 TO Score OF Board(7).
42 MOVE 3 TO Score OF Board(8).
43 MOVE 8 TO Score OF Board(9).
44
45 Game SECTION.
46 PERFORM UNTIL Player1Win OR Player2Win OR Stalemate
47
48 PERFORM VARYING TMP FROM 1 BY 1 UNTIL TMP > 3
49 DISPLAY "----------------"
50 DISPLAY "|" WITH NO ADVANCING
51 PERFORM VARYING TMP2 FROM 1 BY 1 UNTIL TMP2 > 3
52
53 COMPUTE TMP3 = (TMP * 3) + TMP2 - 3
54
55 IF State OF Board(TMP3) = "N" THEN
56 DISPLAY " " TMP3 " |" WITH NO ADVANCING
57 ELSE
58 DISPLAY " " State OF Board(TMP3) " |"
59 WITH NO ADVANCING
60 END-IF
61 END-PERFORM
62 DISPLAY SPACE
63 END-PERFORM
64 DISPLAY "---------------"
65
66 PERFORM UNTIL ValidInput
67 IF Turn OF Player1 = 1 THEN
68 DISPLAY "Player 1 " WITH NO ADVANCING
69 ELSE
70 DISPLAY "Player 2 " WITH NO ADVANCING
71 END-IF
72
73 DISPLAY "make your move [1-9]: " WITH NO ADVANCING
74 ACCEPT PlayerMove
75
76 IF ValidInput THEN
77
78 IF State OF Board(PlayerMove) EQUAL "N"
79 EVALUATE 1
80 WHEN Turn OF Player1
81 Move "X" TO State OF Board(PlayerMove)
82
83 MOVE 0 TO Turn OF Player1
84 MOVE 1 TO Turn OF PLayer2
85
86 WHEN Turn OF Player2
87 MOVE "O" TO State OF Board(PlayerMove)
88
89 MOVE 1 TO Turn OF Player1
90 MOVE 0 TO Turn OF Player2
91 END-EVALUATE
92 ELSE
93 MOVE 0 TO PlayerMove
94 DISPLAY "Invalid Move, Please Try Again"
95 ELSE
96 DISPLAY "Invalid Move, Please Try Again"
97 END-IF
98 END-PERFORM
99 MOVE 0 TO PlayerMove
100
101 * Check Winners
102 MOVE 0 TO BoardHasBlanks
103 PERFORM VARYING TMP FROM 1 BY 1 UNTIL TMP = 9 OR
104 Player1Win OR Player2Win
105 IF State of Board(TMP) = "N" THEN
106 MOVE 1 TO BoardHasBlanks
107 END-IF
108 PERFORM VARYING TMP2 FROM 1 BY 1 UNTIL TMP2 = 9 OR
109 Player1Win OR Player2Win
110 PERFORM VARYING TMP3 FROM 1 BY 1 UNTIL TMP3 = 9 OR
111 Player1Win OR Player2Win
112
113 IF TMP NOT EQUAL TMP2 AND TMP NOT EQUAL TMP3 AND
114 TMP2 NOT EQUAL TMP3 THEN
115
116 ADD Score OF Board(TMP) TO Score OF Board(TMP2)
117 GIVING TMP4
118 ADD Score OF Board(TMP3) To TMP4
119 IF TMP4 = 15 THEN
120 EVALUATE 0
121 WHEN Turn OF Player1
122 IF State OF Board(TMP) EQUAL "X" AND State
123 OF Board(TMP2) EQUAL "X"
124 AND STATE OF BOARD(TMP3) EQUAL "X" THEN
125 SET Player1Win TO TRUE
126 END-IF
127 WHEN Turn OF Player2
128 IF State OF Board(TMP) EQUAL "O" AND State
129 OF Board(TMP2) EQUAL "O" AND STATE
130 OF BOARD(TMP3) EQUAL "O" THEN
131 SET Player2Win TO TRUE
132 END-IF
133 END-EVALUATE
134 END-IF
135 END-IF
136 END-PERFORM
137 END-PERFORM
138 END-PERFORM
139
140 IF BoardHasBlanks = 0 THEN
141 Set Stalemate to TRUE
142 END-IF
143
144
145 END-PERFORM.
146 Outro SECTION.
147 EVALUATE TRUE
148 WHEN Player1Win DISPLAY "CONGRATS PLAYER 1 Has Won!"
149 WHEN Player2Win DISPLAY "CONGRATS PLAYER 2 Has Won!"
150 WHEN Stalemate DISPLAY "No one won!"
151 END-EVALUATE
152 STOP RUN.