Sie sind auf Seite 1von 5

PROGRAM tic_tac_toe

IMPLICIT NONE
INTEGER :: I, J, K=0, L=0
LOGICAL :: Check_win_X, Check_win_O, Check_draw
LOGICAL :: X_can_win, O_can_win, still_in_play = .TRUE.
CHARACTER, DIMENSION( 1:3, 1:3 ) :: game_board, XOXOX
DO I = 1, 3
DO J = 1, 3
game_board(I, J) = '_'
END DO
END DO
DO WHILE( still_in_play )
PRINT *, 'Enter row and then column, & seperated by white space'
READ *, I, J
DO WHILE ( game_board( I, J ) == 'X' .OR. &
game_board( I, J ) == 'O' )
PRINT *, 'Already taken. Choose another square.'
PRINT *, 'Enter row and then column, seperated by white space'
READ *, I, J
END DO
game_board( I, J ) = 'X'
PRINT *
PRINT *, 'Your move:'
CALL print_board( game_board )
IF ( Check_win_X( game_board ) ) THEN
PRINT *
PRINT *, 'X''s win!'
PRINT *
still_in_play = .FALSE.
ELSE IF ( Check_draw ( game_board ) ) THEN
PRINT *
PRINT *, 'It''s a draw.'
PRINT *
still_in_play = .FALSE.
ELSE
IF ( O_can_win( game_board, K, L ) ) THEN
game_board ( K, L ) = 'O'
! In case O can win on this move.
ELSE IF ( X_can_win ( game_board, K, L ) ) THEN
game_board ( K, L ) = 'O'
! In case X can win on the next move.
ELSE IF ( game_board ( 2, 2 ) /= 'X' .AND. &
game_board ( 2, 2 ) /= 'O' ) THEN
game_board ( 2, 2 ) = 'O'
! Grab the center square if it's available.
ELSE
! Just move somewhere.
K = 0; L = 0
DO I = 1, 3
DO J = 1, 3
IF ( game_board ( I, J ) /= 'X' .AND. &
game_board ( I, J ) /= 'O' ) THEN
K = I; L = J
EXIT
END IF
END DO
END DO
game_board ( K, L ) = 'O'
END IF
PRINT *
PRINT *, 'My move:'
CALL print_board ( game_board )
IF ( Check_win_O ( game_board ) ) THEN
PRINT *
PRINT *, 'O''s win!'
PRINT *
still_in_play = .FALSE.
END IF
END IF
END DO ! end of DO WHILE ( still_in_play )
END PROGRAM tic_tac_toe
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Subroutines:
! print_board ( board )
! Functions:
! Check_draw ( board )
! Check_win_X ( board )
! Check_win_O ( board)
! X_can_win ( board, K, L )
! O_can_win ( board, K, L )
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE print_board ( board )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
INTEGER :: I
PRINT *
DO I = 1, 3
PRINT *, board ( I, : )
END DO
PRINT *
END SUBROUTINE print_board
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOGICAL FUNCTION Check_draw ( board )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
INTEGER I, J
Check_draw = .TRUE.
DO I = 1, 3
DO J = 1, 3
Check_draw = Check_draw .AND. &
( board ( I, J ) == 'O' .OR. board ( I, J ) == '
X' )
END DO
END DO
END FUNCTION Check_draw
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOGICAL FUNCTION Check_win_X ( board )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
INTEGER I, J
LOGICAL :: win
Check_win_X = .FALSE.
DO I = 1, 3
win = .TRUE.
DO J = 1, 3
win = win .AND. board ( I, J ) == 'X'
END DO
IF ( win ) THEN
Check_win_X = .TRUE.
EXIT
END IF
END DO
DO J = 1, 3
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, J ) == 'X'
END DO
IF ( win ) THEN
Check_win_X = .TRUE.
EXIT
END IF
END DO
! checking the diagonals :
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, I ) == 'X'
END DO
IF ( win ) THEN
Check_win_X = .TRUE.
END IF
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, 4-I ) == 'X'
END DO
IF ( win ) THEN
Check_win_X = .TRUE.
END IF
END FUNCTION Check_win_x
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOGICAL FUNCTION Check_win_O ( board )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
INTEGER I, J
LOGICAL :: win
Check_win_O = .FALSE.
DO I = 1, 3
win = .TRUE.
DO J = 1, 3
win = win .AND. board ( I, J ) == 'O'
END DO
IF ( win ) THEN
Check_win_O = .TRUE.
EXIT
END IF
END DO
DO J = 1, 3
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, J ) == 'O'
END DO
IF ( win ) THEN
Check_win_O = .TRUE.
EXIT
END IF
END DO
! checking the diagonals :
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, I ) == 'O'
END DO
IF ( win ) THEN
Check_win_O = .TRUE.
END IF
win = .TRUE.
DO I = 1, 3
win = win .AND. board ( I, 4-I ) == 'O'
END DO
IF ( win ) THEN
Check_win_O = .TRUE.
END IF
END FUNCTION Check_win_O
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOGICAL FUNCTION X_can_win ( board, K, L )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
CHARACTER, DIMENSION ( 3, 3 ) :: XOXOX
INTEGER, INTENT(OUT) :: K, L
INTEGER :: I, J
LOGICAL :: Check_win_X
x_can_win = .FALSE.
DO I = 1, 3
DO J = 1, 3
XOXOX = board
IF ( XOXOX ( I, J ) /= 'X' .AND. &
XOXOX ( I, J ) /= 'O' ) THEN
XOXOX ( I, J ) = 'X'
IF ( Check_win_X ( xoxox ) ) THEN
K = I; L = J
X_can_win = .TRUE.
END IF
END IF
END DO
END DO
END FUNCTION X_can_win
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOGICAL FUNCTION O_can_win ( board, K, L )
IMPLICIT NONE
CHARACTER, DIMENSION ( 3, 3 ), INTENT(IN) :: board
CHARACTER, DIMENSION ( 3, 3 ) :: XOXOX
INTEGER, INTENT(OUT) :: K, L
INTEGER :: I, J
LOGICAL :: Check_win_O
O_can_win = .FALSE.
DO I = 1, 3
DO J = 1, 3
XOXOX = board
IF ( XOXOX ( I, J ) /= 'X' .AND. &
XOXOX ( I, J ) /= 'O' ) THEN
XOXOX ( I, J ) = 'O'
IF ( Check_win_O ( xoxox ) ) THEN
K = I; L = J
O_can_win = .TRUE.
END IF
END IF
END DO
END DO
END FUNCTION O_can_win

Das könnte Ihnen auch gefallen