Skip to content

Commit

Permalink
Added computer player with random moves.
Browse files Browse the repository at this point in the history
  • Loading branch information
JanEricNitschke committed Mar 30, 2024
1 parent d12ba90 commit 2fc44aa
Showing 1 changed file with 103 additions and 6 deletions.
109 changes: 103 additions & 6 deletions tictactoe_cobol/tictactoe_cobol.cob
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
* Comment
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
PROGRAM-ID. TicTacToe-Cobol.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 GAME-BOARD VALUE IS "123456789".
Expand All @@ -9,18 +8,45 @@
01 GAME-STATUS PIC X(1).
88 GAME-OVER VALUE "Y".
01 ACTIVE-PLAYER PIC X(1) VALUE "X".
88 X-TURN VALUE "X".
88 O-TURN VALUE "O".
01 LOOP-IDX-1 PIC 9(2).
01 LOOP-IDX-2 PIC 9(2).
* Rows | Cols | Diags
01 WIN-CONDITIONS.
03 WIN-CONDITION OCCURS 8.
05 WIN-VALUE OCCURS 3 TIMES PIC 9(1).

01 YES-NO-FLAG PIC X(1).
88 JA VALUE "Y".
88 NEIN VALUE "N".

01 X-AI-SETTING PIC X(1).
88 X-AI VALUE "Y".
01 O-AI-SETTING PIC X(1).
88 O-AI VALUE "Y".
01 O-AI-STRENGTH PIC 9(1) VALUE 0.
01 X-AI-STRENGTH PIC 9(1) VALUE 0.
01 AI-STRENGTH PIC 9(1) VALUE 0.

01 EMPTY-CELLS-AREA.
03 EMPTY-CELLS OCCURS 9 TIMES PIC 9(1).

01 RANDOM-IDX PIC 9 COMP.
PROCEDURE DIVISION.
* Initialize win conditions
MOVE 123456789147258369159357 TO WIN-CONDITIONS.

PERFORM GET-SETTINGS.

PERFORM UNTIL GAME-OVER
PERFORM DO-MOVE
EVALUATE TRUE
WHEN X-TURN AND X-AI
PERFORM AI-MOVE
WHEN O-TURN AND O-AI
PERFORM AI-MOVE
WHEN OTHER
PERFORM PLAYER-MOVE
END-EVALUATE

PERFORM CHECK-GAME-WON
IF NOT GAME-OVER
Expand Down Expand Up @@ -65,10 +91,10 @@
DISPLAY "The game is a draw!"
END-IF.

DO-MOVE.
PLAYER-MOVE.
MOVE 0 TO SPOT
PERFORM UNTIL SPOT > 0
DISPLAY "Player " ACTIVE-PLAYER"turn:"
DISPLAY "Player " ACTIVE-PLAYER " turn:"
PERFORM DISPLAY-BOARD
DISPLAY "Where to make your next move? [1-9]"
ACCEPT SPOT
Expand All @@ -85,9 +111,80 @@
END-IF
END-PERFORM.

RANDOM-MOVE.
PERFORM SET-EMPTY-CELLS
MOVE 0 TO RANDOM-IDX
PERFORM UNTIL RANDOM-IDX > 0 AND EMPTY-CELLS (RANDOM-IDX) = 1
COMPUTE RANDOM-IDX =
FUNCTION RANDOM(FUNCTION CURRENT-DATE (9:7)) * 9 + 1
END-PERFORM
MOVE ACTIVE-PLAYER TO GAME-SPOT (RANDOM-IDX).

SWAP-ACTIVE-PLAYER.
IF ACTIVE-PLAYER = "X"
MOVE "O" TO ACTIVE-PLAYER
ELSE
MOVE "X" TO ACTIVE-PLAYER
END-IF.


GET-YES-NO.
MOVE " " TO YES-NO-FLAG
PERFORM UNTIL JA OR NEIN
DISPLAY "Enter Y for Yes or N for No:"
ACCEPT YES-NO-FLAG
END-PERFORM.

GET-SETTINGS.
DISPLAY "Should 'X' be played by the computer?"
PERFORM GET-YES-NO.
MOVE YES-NO-FLAG TO X-AI-SETTING.
IF X-AI
SET X-AI TO TRUE
PERFORM SHOW-STRENGTH-OPTIONS
ACCEPT X-AI-STRENGTH
END-IF.

DISPLAY "Should 'O' be played by the computer?"
PERFORM GET-YES-NO.
MOVE YES-NO-FLAG TO O-AI-SETTING.
IF O-AI
SET O-AI TO TRUE
PERFORM SHOW-STRENGTH-OPTIONS
ACCEPT O-AI-STRENGTH
END-IF.

SHOW-STRENGTH-OPTIONS.
DISPLAY "AI strength settings:"
DISPLAY "0: Easy"
DISPLAY "1: Medium"
DISPLAY "2: Hard"
DISPLAY "3: Impossible"
DISPLAY "How strong should the AI be?".

SET-EMPTY-CELLS.
PERFORM VARYING LOOP-IDX-1 FROM 1 BY 1 UNTIL LOOP-IDX-1 > 9
IF GAME-SPOT(LOOP-IDX-1) NOT = "X"
AND GAME-SPOT(LOOP-IDX-1) NOT = "O"
MOVE 1 TO EMPTY-CELLS(LOOP-IDX-1)
ELSE
MOVE 0 TO EMPTY-CELLS(LOOP-IDX-1)
END-IF
END-PERFORM.

AI-MOVE.
IF X-TURN
MOVE X-AI-STRENGTH TO AI-STRENGTH
ELSE
MOVE O-AI-STRENGTH TO AI-STRENGTH
END-IF
DISPLAY "AI turn as player " ACTIVE-PLAYER " with strength "
AI-STRENGTH "."
PERFORM DISPLAY-BOARD
EVALUATE AI-STRENGTH
WHEN 0
PERFORM RANDOM-MOVE
WHEN OTHER
PERFORM RANDOM-MOVE
END-EVALUATE
CONTINUE AFTER 1 SECONDS.

0 comments on commit 2fc44aa

Please sign in to comment.