Tic Tac Toe implemented in COBOL

We are done

Changed files
+134 -69
+134 -69
tictactoe.cbl
···
DATA DIVISION.
WORKING-STORAGE SECTION.
-
01 Player1.
-
02 Score PIC 99 VALUE ZEROS.
-
88 Win VALUE 15.
-
02 Turn PIC 9 value 1.
-
01 Player2.
-
02 Score PIC 99 VALUE ZEROES.
-
88 Win VALUE 15.
-
02 Turn PIC 9 value ZEROS.
+
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 PlayerMove PIC 9 VALUE ZEROS.
-
01 Board.
-
02 Rows OCCURS 3 TIMES.
-
03 Entries OCCURS 3 TIMES.
-
04 EntryScore PIC 9 VALUE ZEROS.
-
04 State PIC Z Value "_".
+
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.
-
01 InitRowIdx PIC S9 VALUE 1.
-
01 AccessRowIdx PIC 9 VALUE 0.
-
01 AccessEntryIdx PIC 9 VALUE 0.
-
01 InitEntryIdx PIC S9 VALUE 2.
-
01 InitScoreValue PIC 99 VALUE 1.
-
01 InitDivideResult PIC S99 VALUE ZEROS.
-
01 InitDivideRemainder PIC 99 VALUE ZEROS.
-
01 IdxRow PIC 9 VALUE 1.
-
01 IdxCol PIC 9 VALUE 1.
-
01 InitAdd3 PIC 99 VALUE 0.
PROCEDURE DIVISION.
-
Intro SECTION.
-
DISPLAY "Welcome to Trey's Dev Shed Tic Tac Toe Extravaganza!".
+
Intro SECTION.
+
DISPLAY "Welcome to Trey's Dev Shed Tic Tac Toe Extravaganza!".
-
Setup SECTION.
-
PERFORM VARYING InitScoreValue FROM 1 BY 1 UNTIL
-
InitScoreValue > 9
-
COMPUTE AccessRowIdx = InitRowIdx + 1
-
COMPUTE AccessEntryIdx = InitEntryIdx + 1
-
MOVE InitScoreValue TO
-
EntryScore(AccessRowIdx AccessEntryIdx)
+
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).
-
DIVIDE InitScoreValue BY 3 GIVING InitDivideResult
-
REMAINDER InitDivideRemainder
+
Game SECTION.
+
PERFORM UNTIL Player1Win OR Player2Win OR Stalemate
-
IF InitDivideRemainder = 0 THEN
-
COMPUTE InitEntryIdx = InitEntryIdx - 1
-
ELSE
-
COMPUTE InitRowIdx = InitRowIdx - 1
-
COMPUTE InitEntryIdx = InitEntryIdx + 1
-
END-IF
+
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 InitAdd3 = InitRowIdx + 3
-
DIVIDE InitAdd3 BY 3 GIVING InitDivideResult REMAINDER
-
InitDivideRemainder
-
COMPUTE InitRowIdx = InitDivideRemainder
+
COMPUTE TMP3 = (TMP * 3) + TMP2 - 3
-
COMPUTE InitAdd3 = InitEntryIdx + 3
-
DIVIDE InitAdd3 BY 3 GIVING InitDivideResult REMAINDER
-
InitDivideRemainder
-
COMPUTE InitEntryIdx = InitDivideRemainder
-
END-PERFORM.
-
Game SECTION.
-
PERFORM UNTIL Win OF Score OF Player1 OR Win OF Score OF
-
Player2
-
PERFORM VARYING IdxRow FROM 1 BY 1 UNTIL IdxRow > 3
-
PERFORM VARYING IdxCol FROM 1 BY 1 UNTIL IdxCol > 3
-
Display EntryScore(IdxRow, IdxCol)
+
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
-
SET Win of Score of Player1 TO true
-
* Accept Input
-
* Validate Input
-
* Make Move
-
* Add Score
-
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
-
Outro SECTION.
-
IF Win OF Score OF Player1 THEN
-
DISPLAY "CONGRATS PLAYER 1 Has Won!"
-
ELSE
-
DISPLAY "CONGRATS PLAYER 2 Has Won!"
-
END-IF
-
STOP RUN.
+
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.