ZCONECTA NO STANDARD PAGE HEADING
MESSAGE-ID BD
LINE-SIZE 132
LINE-COUNT 65.
* Autor: Silva Huertas, Antonio Miguel
* E-mail: alg@guay.com
INCLUDE .
* Tablas
* Variables globales
DATA: C1(8),"Columnas
C2(8),
C3(8),
C4(8),
C5(8),
C6(8),
C7(8),
C8(8).
DATA: TFS(20).
DATA: D_RET LIKE SY-SUBRC.
DATA: MAQUINA,
TURNO,
LINEA TYPE I,
OFFS TYPE I VALUE 20,
GANA_MAQUINA,
GANA_USUARIO.
* Constantes
CONSTANTS: C_O VALUE 'O',
C_X VALUE 'X'.
* Tablas internas
DATA: BEGIN OF TAB OCCURS 10,
COL TYPE I,
LIN TYPE I,
XTYPE I,
OTYPE I,
BTYPE I,
XA TYPE I,
OA TYPE I,
BA TYPE I,
ENDOF TAB.
* Parámetros
PARAMETER: USUARIO OBLIGATORY DEFAULT C_X,
ICONOS AS CHECKBOX DEFAULT C_X.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF USUARIO = C_O.
MAQUINA = C_X.
ELSEIF USUARIO = C_X.
MAQUINA = C_O.
ELSE.
MESSAGE E899 WITH 'Permitted values O y X'.
ENDIF.
*----------------------------------------------------------------------*
* AT LINE-SELECTION *
*----------------------------------------------------------------------*
AT LINE-SELECTION.
PERFORM DECIDE_TURNO.
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
TURNO = C_O.
PERFORM DECIDE_TURNO_INICIO.
*----------------------------------------------------------------------*
* TOP-OF-PAGE.
*----------------------------------------------------------------------*
TOP-OF-PAGE.
*----------------------------------------------------------------------*
* FORM DIBUJA_TABLA *
*----------------------------------------------------------------------*
FORM DIBUJA_TABLA.
DATA: DCOL TYPE I.
WRITE: 'TABLA'.
DO 8 TIMES.
DCOL = 9 - SY-INDEX.
PERFORM DIBUJA_LINEA USING DCOL.
PERFORM DIBUJA_INTER.
ENDDO.
PERFORM DIBUJA_RAYA.
SY-LSIND = SY-LSIND - 1.
IF GANA_USUARIO = 'X'.
WRITE: / 'HAS GANADO'.
ELSEIF GANA_MAQUINA = 'X'.
WRITE: / 'GANO YO'.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM DIBUJA_RAYA *
*----------------------------------------------------------------------*
FORM DIBUJA_RAYA.
WRITE: AT /OFFS SY-ULINE(41).
ENDFORM.
*----------------------------------------------------------------------*
* FORM DIBUJA_INTER *
*----------------------------------------------------------------------*
FORM DIBUJA_INTER.
WRITE: AT /OFFS SY-VLINE.
DO 8 TIMES.
WRITE: ' ' HOTSPOT ON, SY-VLINE.
ENDDO.
ENDFORM.
*----------------------------------------------------------------------*
* FORM DIBUJA_LINEA *
*----------------------------------------------------------------------*
FORM DIBUJA_LINEA USING VALUE(P_LIN) TYPE I.
FIELD-SYMBOLS .
DATA: TMP_COL(2).
P_LIN = P_LIN - 1.
WRITE: AT /OFFS SY-VLINE.
DO 8 TIMES.
TMP_COL+0(1) = 'C'.
TMP_COL+1(1) = SY-INDEX.
ASSIGN (TMP_COL) TO .
PERFORM FSOFFSET USING P_LIN 1 CHANGING TFS.
IF TFS IS INITIAL.
WRITE: ' ' HOTSPOT ON.
ELSE.
IF ICONOS = C_X.
IF TFS = C_O."C_O
WRITE ICON_LED_GREEN AS ICON HOTSPOT OFF.
ELSE. "C_X
WRITE ICON_CANCEL AS ICON HOTSPOT OFF.
ENDIF.
ELSE. "ICONOS = BLANCO
IF TFS = C_O."C_O
WRITE: 'O ' HOTSPOT OFF.
ELSE. "C_X
WRITE: 'X ' HOTSPOT OFF.
ENDIF.
ENDIF.
ENDIF.
WRITE: SY-VLINE.
ENDDO.
LINEA = 1.
HIDE: LINEA.
ENDFORM.
*----------------------------------------------------------------------*
* FORM DECIDE_TURNO *
*----------------------------------------------------------------------*
FORM DECIDE_TURNO.
IF TURNO = MAQUINA.
PERFORM PIENSA_CASILLA.
TURNO = USUARIO.
PERFORM DIBUJA_TABLA.
ELSE.
PERFORM COMPRUEBA_SELECCION.
TURNO = MAQUINA.
PERFORM DECIDE_TURNO.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM DECIDE_TURNO_INICIO *
*----------------------------------------------------------------------*
FORM DECIDE_TURNO_INICIO.
CLEAR GANA_USUARIO.
CLEAR GANA_MAQUINA.
IF TURNO = MAQUINA.
PERFORM PIENSA_CASILLA.
TURNO = USUARIO.
ENDIF.
PERFORM DIBUJA_TABLA.
ENDFORM.
*----------------------------------------------------------------------*
* FORM PIENSA_CASILLA *
*----------------------------------------------------------------------*
FORM PIENSA_CASILLA.
FIELD-SYMBOLS .
DATA: TMP_COL(2),
TMP_O TYPE I,
TMP_X TYPE I,
TMP_N TYPE I.
REFRESH TAB.
DO 8 TIMES.
TMP_COL+0(1) = 'C'.
TMP_COL+1(1) = SY-INDEX.
ASSIGN (TMP_COL) TO .
CLEAR TAB.
TAB-COL = SY-INDEX.
IF CA ' '.
TAB-LIN = SY-FDPOS.
ELSE.
CONTINUE.
ENDIF.
PERFORM CUENTA_POSIB CHANGING TAB.
APPEND TAB.
ENDDO.
SORT TAB BY O DESCENDING
B DESCENDING
BA DESCENDING
OA DESCENDING
XA X.
READ TABLE TAB INDEX 1.
TMP_O = TAB-O.
SORT TAB BY X DESCENDING
B DESCENDING
BA DESCENDING
XA DESCENDING
OA O.
READ TABLE TAB INDEX 1.
TMP_X = TAB-X.
DELETE TAB WHERE O < TMP_O AND X < TMP_X.
IF ( TMP_O = 4 AND USUARIO = C_O ) OR
( TMP_X = 4 AND USUARIO = C_X ).
GANA_USUARIO = 'X'.
ELSEIF TMP_O <> 3 AND TMP_X <> 3. "TOMA UNA DE LAS POSIB. AL AZAR
DESCRIBE TABLE TAB LINES TMP_N.
GET TIME.
TMP_N = ( SY-UZEIT MOD TMP_N ) + 1.
READ TABLE TAB INDEX TMP_N.
ELSEIF MAQUINA = C_O.
IF TMP_O = 3. "GANA MAQUINA
SORT TAB BY O DESCENDING
B DESCENDING
BA DESCENDING
OA DESCENDING
XA X.
GANA_MAQUINA = 'X'.
ELSEIF TMP_X = 3."PA QUE NO GANE USUARIO
SORT TAB BY X DESCENDING
B DESCENDING
BA DESCENDING
XA DESCENDING
OA O.
ENDIF.
READ TABLE TAB INDEX 1.
ELSE. "C_X
IF TMP_X = 3. "GANA MAQUINA
SORT TAB BY X DESCENDING
B DESCENDING
BA DESCENDING
XA DESCENDING
OA O.
GANA_MAQUINA = 'X'.
ELSEIF TMP_O = 3."PA QUE NO GANE USUARIO
SORT TAB BY O DESCENDING
B DESCENDING
BA DESCENDING
OA DESCENDING
XA X.
ENDIF.
READ TABLE TAB INDEX 1.
ENDIF.
CHECK SY-SUBRC = 0.
CHECK GANA_USUARIO IS INITIAL.
TMP_COL+0(1) = 'C'.
TMP_COL+1(1) = TAB-COL.
ASSIGN (TMP_COL) TO .
PERFORM FSOFFSET_CAMBIO USING TAB-LIN 1 MAQUINA CHANGING .
ENDFORM.
*----------------------------------------------------------------------*
* FORM COMPRUEBA_SELECCION *
*----------------------------------------------------------------------*
FORM COMPRUEBA_SELECCION.
DATA: TMP_LIN TYPE I,
TMP_COL TYPE I,
TMP_ITYPE I,
TMP_CAR(80).
FIELD-SYMBOLS .
TMP_LIN = LINEA.
CLEAR LINEA.
CHECK SY-UCOMM = 'PICK'.
TMP_COL = ( SY-CUCOL - OFFS + 3 ).
TMP_I= TMP_COL MOD 5.
IF TMP_LIN <> 1
OR TMP_COL <> 43
OR TMP_I > 3.
MESSAGE E899 WITH 'Invalid selection'.
ENDIF.
TMP_COL = TMP_COL DIV 5.
TMP_CAR(1) = 'C'. TMP_CAR+1(1) = TMP_COL.
ASSIGN (TMP_CAR) TO .
PERFORM FSOFFSET USING 7 1 CHANGING TFS.
IF NOT TFS IS INITIAL.
MESSAGE E899 WITH 'Selection is not valid'.
ENDIF.
IF CA ' '.
PERFORM FSOFFSET_CAMBIO USING SY-FDPOS 1 USUARIO CHANGING .
ELSE.
PERFORM FSOFFSET_CAMBIO USING 0 1 USUARIO CHANGING .
ENDIF.
*** Comprueba 4
CLEAR TAB.
TAB-COL = TMP_COL.
IF CA ' '.
TAB-LIN = SY-FDPOS - 1.
ELSE.
TAB-LIN = 8.
ENDIF.
PERFORM CUENTA_POSIB CHANGING TAB.
IF ( TAB-O = 4 AND USUARIO = C_O ) OR
( TAB-X = 4 AND USUARIO = C_X ).
GANA_USUARIO = 'X'.
ENDIF.
TURNO = MAQUINA.
ENDFORM.
*----------------------------------------------------------------------*
* FORM CUENTA_POSIB *
*----------------------------------------------------------------------*
FORM CUENTA_POSIB CHANGING PTAB STRUCTURE TAB.
DATA: TMP_COL TYPE I,
TMP_LIN TYPE I.
*1 2 3
*4 5
*6 7 8
*
* Casilla 1
TMP_COL = TAB-COL - 1.
TMP_LIN = TAB-LIN + 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 2
TMP_COL = TAB-COL.
TMP_LIN = TAB-LIN + 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 3
TMP_COL = TAB-COL + 1.
TMP_LIN = TAB-LIN + 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 4
TMP_COL = TAB-COL - 1.
TMP_LIN = TAB-LIN.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 5
TMP_COL = TAB-COL + 1.
TMP_LIN = TAB-LIN.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 6
TMP_COL = TAB-COL - 1.
TMP_LIN = TAB-LIN - 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 7
TMP_COL = TAB-COL.
TMP_LIN = TAB-LIN - 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
* Casilla 8
TMP_COL = TAB-COL + 1.
TMP_LIN = TAB-LIN - 1.
PERFORM SUMA_CASILLA USING TMP_COL TMP_LIN CHANGING PTAB.
*
* Horizontal
* perform suma_horizontal using tab-col tab-lin changing ptab.
PERFORM SUMA_LINEA USING TAB-COL TAB-LIN 1 0 CHANGING PTAB.
* Vertical
* perform suma_vertical using tab-col tab-lin changing ptab.
PERFORM SUMA_LINEA USING TAB-COL TAB-LIN 0 1 CHANGING PTAB.
* Diagonal 1
* perform suma_diagonal1 using tab-col tab-lin changing ptab.
PERFORM SUMA_LINEA USING TAB-COL TAB-LIN 1 1 CHANGING PTAB.
* Diagonal 2
* perform suma_diagonal2 using tab-col tab-lin changing ptab.
PERFORM SUMA_LINEA USING TAB-COL TAB-LIN 1 -1 CHANGING PTAB.
ENDFORM.
*----------------------------------------------------------------------*
* FORM SUMA_CASILLA *
*----------------------------------------------------------------------*
FORM SUMA_CASILLA USING
VALUE(PCOL) TYPE I
VALUE(PLIN) TYPE I
CHANGING TAB STRUCTURE TAB.
*ORM SUMA_CASILLA USING VALUE(PCOL) VALUE(PLIN)
* CHANGING TAB STRUCTURE TAB.
FIELD-SYMBOLS .
DATA: TMP_C(2) TYPE C.
TMP_C = 'C '.
CHECK PCOL >= 1 AND PCOL <= 8 AND PLIN >= 0 AND PLIN <= 7.
TMP_C+1(1) = PCOL.
ASSIGN (TMP_C) TO .
PERFORM FSOFFSET USING PLIN 1 CHANGING TFS.
CASE TFS.
WHEN C_O.
ADD 1 TO TAB-OA.
WHEN C_X.
ADD 1 TO TAB-XA.
WHEN ' '.
ADD 1 TO TAB-BA.
ENDCASE.
ENDFORM.
*---------------------------------------------------------------------*
* FORM FSOFFSET *
*---------------------------------------------------------------------*
FORM FSOFFSET USING VALUE(P_CHAR)TYPE C
VALUE(P_OFF) TYPE I
VALUE(P_TAM) TYPE I
CHANGING VALUE(P_RESULT) TYPE C.
FIELD-SYMBOLS: .
DATA: TMPCAR(80).
TMPCAR(10) = 'p_char+'.
TMPCAR+10(10) = P_OFF.
TMPCAR+20(1) = '('.
TMPCAR+21(10) = P_TAM.
TMPCAR+31(1) = ')'.
CONDENSE TMPCAR NO-GAPS.
ASSIGN (TMPCAR) TO .
P_RESULT = .
ENDFORM.
*---------------------------------------------------------------------*
* FORM FSOFFSET_CAMBIO *
*---------------------------------------------------------------------*
FORM FSOFFSET_CAMBIO USING VALUE(P_OFF) TYPE I
VALUE(P_TAM) TYPE I
VALUE(P_VALOR) TYPE C
CHANGING VALUE(P_CHAR)TYPE C.
FIELD-SYMBOLS: .
DATA: TMPCAR(80).
TMPCAR(10) = 'p_char+'.
TMPCAR+10(10) = P_OFF.
TMPCAR+20(1) = '('.
TMPCAR+21(10) = P_TAM.
TMPCAR+31(1) = ')'.
CONDENSE TMPCAR NO-GAPS.
ASSIGN (TMPCAR) TO .
= P_VALOR.
ENDFORM.
*----------------------------------------------------------------------*
* FORM SUMA_LINEA *
*----------------------------------------------------------------------*
FORM SUMA_LINEA USING VALUE(PCOL) VALUE(PLIN)
VALUE(PINCC) VALUE(PINCL)
CHANGING TAB STRUCTURE TAB.
FIELD-SYMBOLS .
DATA: TMP_CINI TYPE I,
TMP_CFIN TYPE I,
TMP_LINI TYPE I,
TMP_LFIN TYPE I,
TMP_I TYPE I,
TMP_N TYPE I,
TMP_C(2) TYPE C,
TMP_LIN(4).
TMP_C = 'C '.
DO 3 TIMES.
TMP_I = SY-INDEX + 1.
TMP_CINI = PCOL - PINCC * ( TMP_I - 1 ).
TMP_CFIN = PCOL.
TMP_LINI = PLIN - PINCL * ( TMP_I - 1 ).
TMP_LFIN = PLIN.
DO TMP_I TIMES.
IF TMP_CINI <> 8
OR TMP_CFIN <> 8
OR TMP_LINI > 7 OR TMP_LINI < 0
OR TMP_LFIN > 7 OR TMP_LFIN < 0.
TMP_CINI = TMP_CINI + PINCC.
TMP_CFIN = TMP_CFIN + PINCC.
TMP_LINI = TMP_LINI + PINCL.
TMP_LFIN = TMP_LFIN + PINCL.
CONTINUE.
ENDIF.
CLEAR TMP_LIN.
TMP_C+1(1) = TMP_CINI.
ASSIGN (TMP_C) TO .
PERFORM FSOFFSET USING TMP_LINI 1 CHANGING TMP_LIN+0(1).
TMP_C+1(1) = TMP_CINI + 1 * PINCC.
ASSIGN (TMP_C) TO .
TMP_N = TMP_LINI + 1 * PINCL.
PERFORM FSOFFSET USING TMP_N 1 CHANGING TMP_LIN+1(1).
IF TMP_I > 2.
TMP_C+1(1) = TMP_CINI + 2 * PINCC.
ASSIGN (TMP_C) TO .
TMP_N = TMP_LINI + 2 * PINCL.
PERFORM FSOFFSET USING TMP_N 1 CHANGING TMP_LIN+2(1).
ENDIF.
IF TMP_I > 3.
TMP_C+1(1) = TMP_CINI + 3 * PINCC.
ASSIGN (TMP_C) TO .
TMP_N = TMP_LINI + 3 * PINCL.
PERFORM FSOFFSET USING TMP_N 1 CHANGING TMP_LIN+3(1).
ENDIF.
IF TMP_LIN CO 'O '.
IF TMP_LIN = 'OOOO'.
TMP_N = 4.
ELSEIF TMP_LIN CP '*O*O*O*'.
TMP_N = 3.
ELSEIF TMP_LIN CP '*O*O*'.
TMP_N = 2.
ELSEIF TMP_LIN CP '*O*'.
TMP_N = 1.
ELSE. "BLANCO.
TMP_N = 0.
ENDIF.
IF TMP_N > TAB-O.
TAB-O = TMP_N.
ELSEIF TMP_N = 0.
IF TAB-B < TMP_I.
TAB-B = TMP_I.
ENDIF.
ENDIF.
ELSEIF TMP_LIN CO 'X '.
IF TMP_LIN = 'XXXX'.
TMP_N = 4.
ELSEIF TMP_LIN CP '*X*X*X*'.
TMP_N = 3.
ELSEIF TMP_LIN CP '*X*X*'.
TMP_N = 2.
ELSEIF TMP_LIN CP '*X*'.
TMP_N = 1.
ELSE. "BLANCO.
TMP_N = 0.
ENDIF.
IF TMP_N > TAB-X.
TAB-X = TMP_N.
ELSEIF TMP_N = 0.
IF TAB-B < TMP_I.
TAB-B = TMP_I.
ENDIF.
ENDIF.
ELSEIF TMP_LIN CO ' '.
IF TAB-B < TMP_I.
TAB-B = TMP_I.
ENDIF.
ENDIF.
TMP_CINI = TMP_CINI + PINCC.
TMP_CFIN = TMP_CFIN + PINCC.
TMP_LINI = TMP_LINI + PINCL.
TMP_LFIN = TMP_LFIN + PINCL.
ENDDO.
ENDDO.
ENDFORM.








