REPORT 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 <ICON>. * 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, X TYPE I, O TYPE I, B TYPE I, XA TYPE I, OA TYPE I, BA TYPE I, END OF 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 <FS1>.
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 <FS1>. PERFORM FSOFFSET USING <FS1> 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 <FS1>. 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 <FS1>.
CLEAR TAB. TAB-COL = SY-INDEX. IF <FS1> CA ' '. TAB-LIN = SY-FDPOS. ELSE. CONTINUE. ENDIF. PERFORM CUENTA_POSIB CHANGING TAB. APPEND TAB. ENDDO.
* IF MAQUINA = C_O. * SORT TAB BY O DESCENDING * B DESCENDING * BA DESCENDING * OA DESCENDING * XA X. * ELSE. * SORT TAB BY X DESCENDING * B DESCENDING * BA DESCENDING * XA DESCENDING * OA O. * ENDIF.
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 <FS1>. PERFORM FSOFFSET_CAMBIO USING TAB-LIN 1 MAQUINA CHANGING <FS1>. ENDFORM.
*----------------------------------------------------------------------* * FORM COMPRUEBA_SELECCION * *----------------------------------------------------------------------* FORM COMPRUEBA_SELECCION. DATA: TMP_LIN TYPE I, TMP_COL TYPE I, TMP_I TYPE I, TMP_CAR(80).
FIELD-SYMBOLS <FS1>.
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 < 5 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 <FS1>. PERFORM FSOFFSET USING <FS1> 7 1 CHANGING TFS. IF NOT TFS IS INITIAL. MESSAGE E899 WITH 'Selection is not valid'. ENDIF.
IF <FS1> CA ' '. PERFORM FSOFFSET_CAMBIO USING SY-FDPOS 1 USUARIO CHANGING <FS1>. ELSE. PERFORM FSOFFSET_CAMBIO USING 0 1 USUARIO CHANGING <FS1>. ENDIF. *** Comprueba 4 CLEAR TAB. TAB-COL = TMP_COL. IF <FS1> 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 <FS>. 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 <FS>. PERFORM FSOFFSET USING <FS> 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 * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* * --> VALUE(P_CHAR) * * --> VALUE(P_OFF) * * --> VALUE(P_TAM) * * --> VALUE(P_RESULT) * *---------------------------------------------------------------------* 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: <MIFS>. 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 <MIFS>.
P_RESULT = <MIFS>. ENDFORM.
*---------------------------------------------------------------------* * FORM FSOFFSET_CAMBIO * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* * --> VALUE(P_OFF) * * --> VALUE(P_TAM) * * --> VALUE(P_VALOR) * * --> VALUE(P_CHAR) * *---------------------------------------------------------------------* 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: <MIFS>. 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 <MIFS>.
<MIFS> = P_VALOR. ENDFORM.
***** *----------------------------------------------------------------------* * FORM SUMA_LINEA * *----------------------------------------------------------------------* FORM SUMA_LINEA USING VALUE(PCOL) VALUE(PLIN) VALUE(PINCC) VALUE(PINCL) CHANGING TAB STRUCTURE TAB. FIELD-SYMBOLS <FS>. 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 < 1 OR TMP_CINI > 8 OR TMP_CFIN < 1 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 <FS>. PERFORM FSOFFSET USING <FS> TMP_LINI 1 CHANGING TMP_LIN+0(1).
TMP_C+1(1) = TMP_CINI + 1 * PINCC. ASSIGN (TMP_C) TO <FS>. TMP_N = TMP_LINI + 1 * PINCL. PERFORM FSOFFSET USING <FS> TMP_N 1 CHANGING TMP_LIN+1(1).
IF TMP_I > 2. TMP_C+1(1) = TMP_CINI + 2 * PINCC. ASSIGN (TMP_C) TO <FS>. TMP_N = TMP_LINI + 2 * PINCL. PERFORM FSOFFSET USING <FS> 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 <FS>. TMP_N = TMP_LINI + 3 * PINCL. PERFORM FSOFFSET USING <FS> 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. |