Enterprise Resource Planning PortalERPGenie.COM Enterprise Resource Planning Portal

   Advertise | Founder BLOG

Web ERPGenie.COM  Other Search Options

Home | Vote for us |

ERPGenie.COM -> SAP Technical -> ABAP -> Example code -> Connect 4 (Contributed by Antonio Silva Huertas)

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
DATABEGIN 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.
  WRITEAT /OFFS SY-ULINE(41).
ENDFORM.

*----------------------------------------------------------------------*
* FORM DIBUJA_INTER *
*----------------------------------------------------------------------*
FORM DIBUJA_INTER.
  WRITEAT /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.

  WRITEAT /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.

Contact Us | Polls | Add URL | Contribute | About | Privacy | Terms | Feedback | Help!

Message Board | Discussion Forum | BLOG | Consultants: Post your resume | Companies: Advertise on ERPGenie.COM | Post Job
Genie Press | ERPTopSites | Financials Consultant | Consultant Review | Gallia Consulting | Supply Chain Project | SAP Financials Forum