diff options
| -rw-r--r-- | tictactoe.cbl | 219 |
1 files changed, 142 insertions, 77 deletions
diff --git a/tictactoe.cbl b/tictactoe.cbl index b796111..75e7bc4 100644 --- a/tictactoe.cbl +++ b/tictactoe.cbl @@ -4,84 +4,149 @@ 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 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 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. + 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. - PERFORM VARYING InitScoreValue FROM 1 BY 1 UNTIL - InitScoreValue > 9 - COMPUTE AccessRowIdx = InitRowIdx + 1 - COMPUTE AccessEntryIdx = InitEntryIdx + 1 - MOVE InitScoreValue TO - EntryScore(AccessRowIdx AccessEntryIdx) - - DIVIDE InitScoreValue BY 3 GIVING InitDivideResult - REMAINDER InitDivideRemainder - - IF InitDivideRemainder = 0 THEN - COMPUTE InitEntryIdx = InitEntryIdx - 1 - ELSE - COMPUTE InitRowIdx = InitRowIdx - 1 - COMPUTE InitEntryIdx = InitEntryIdx + 1 - END-IF - - COMPUTE InitAdd3 = InitRowIdx + 3 - DIVIDE InitAdd3 BY 3 GIVING InitDivideResult REMAINDER - InitDivideRemainder - COMPUTE InitRowIdx = InitDivideRemainder - - 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) + 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 - SET Win of Score of Player1 TO true - * Accept Input - * Validate Input - * Make Move - * Add Score - END-PERFORM. - - 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. + 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. |
