REPORT zac_tictacto.
TYPES:BEGIN OF lty_table,
var1 TYPE c,
var2 TYPE c,
var3 TYPE c,
END OF lty_table.
DATA lv_counter1 TYPE i.
DATA lv_counter2 TYPE i.
DATA lv_helper TYPE c.
DATA lv_flag TYPE c.
DATA lv_final TYPE i VALUE 9.
DATA lwa1 TYPE lty_table.
DATA lwa2 TYPE lty_table.
DATA lwa3 TYPE lty_table.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ZSTATUS'.
* SET TITLEBAR 'xxx'.
CASE sy-ucomm.
WHEN 'CLEAR' OR 'RESET'.
CLEAR:lwa1,lwa2,lwa3,lv_flag.
* WHEN .
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'CHECK'.
WHEN 'CLEAR' OR 'RESET'.
CLEAR:lwa1,lwa2,lwa3,lv_flag,lv_counter1.
WHEN 'SAVE'.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
WHEN 'CANCEL'.
WHEN '1'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa1-var1 = 'X'.
ELSE.
lwa1-var1 = 'O'.
ENDIF.
PERFORM check_if_win..
WHEN '2'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa2-var1 = 'X'.
ELSE.
lwa2-var1 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '3'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa3-var1 = 'X'.
ELSE.
lwa3-var1 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '4'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa1-var2 = 'X'.
ELSE.
lwa1-var2 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '5'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa2-var2 = 'X'.
ELSE.
lwa2-var2 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '6'.
PERFORM check_if_win.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa3-var2 = 'X'.
ELSE.
lwa3-var2 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '7'.
PERFORM check_if_win.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa1-var3 = 'X'.
ELSE.
lwa1-var3 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '8'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa2-var3 = 'X'.
ELSE.
lwa2-var3 = 'O'.
ENDIF.
PERFORM check_if_win.
WHEN '9'.
IF lv_flag = 'X'.
EXIT.
ENDIF.
lv_counter1 = lv_counter1 + 1 .
IF lv_counter1 = 1 OR lv_counter1 = 3 OR lv_counter1 = 5 OR lv_counter1 = 7 .
lwa3-var3 = 'X'.
ELSE.
lwa3-var3 = 'O'.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form CHECK_IF_WIN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM check_if_win .
* Row 1
IF lwa1-var1 = 'X' AND lwa2-var1 = 'X' AND lwa3-var1 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa1-var1 = 'O' AND lwa2-var1 = 'O' AND lwa3-var1 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* Row 2
IF lwa1-var2 = 'X' AND lwa2-var2 = 'X' AND lwa3-var2 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa1-var2 = 'O' AND lwa2-var2 = 'O' AND lwa3-var2 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* Row 3
IF lwa1-var3 = 'X' AND lwa2-var3 = 'X' AND lwa3-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa1-var3 = 'O' AND lwa2-var3 = 'O' AND lwa3-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* col 1
IF lwa1-var1 = 'X' AND lwa1-var2 = 'X' AND lwa1-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa1-var1 = 'O' AND lwa1-var2 = 'O' AND lwa1-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* col 2
IF lwa2-var1 = 'X' AND lwa2-var2 = 'X' AND lwa2-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa2-var1 = 'O' AND lwa2-var2 = 'O' AND lwa2-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* col 3
IF lwa3-var1 = 'X' AND lwa3-var2 = 'X' AND lwa3-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa3-var1 = 'O' AND lwa3-var2 = 'O' AND lwa3-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* diag1
IF lwa1-var1 = 'X' AND lwa2-var2 = 'X' AND lwa3-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa1-var1 = 'O' AND lwa2-var2 = 'O' AND lwa3-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
* diag2
IF lwa3-var1 = 'X' AND lwa2-var2 = 'X' AND lwa1-var3 = 'X'.
MESSAGE 'X WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ELSEIF lwa3-var1 = 'O' AND lwa2-var2 = 'O' AND lwa1-var3 = 'O'.
MESSAGE 'O WIN' TYPE 'I'.
lv_flag = 'X'.
EXIT.
ENDIF.
ENDFORM.