ABAP联机版五子棋

谁说培训新人ABAP,只能讲一些枯燥乏味的代码?为培训新人,做了一个ABAP的联机版五子棋,激起了他们的学习兴趣,好事一件。现公布代码,供同行选用!

执行画面,输入下棋的时间,并执行程序,10秒内如果有用户输入了相同的下棋时间并且执行程序的话,则两人将自动联机,先执行者为黑棋。

输入限制时间

游戏画面1

游戏画面2

实际使用的话,需要下面的三个表

six

seven

eight

代码如下,没有严格测试过,但是能正常执行。所以仅供参考。

 *&———————————————————————*
*& REPORT  Z_ABAP_GAME
*&
*&———————————————————————*
*&
*&
*&———————————————————————*
REPORT Z_ABAP_GAME
       NO STANDARD PAGE HEADING
       MESSAGE-ID ZEL1.
CLASS LCL_EVENT_HANDLER DEFINITION DEFERRED.

DATA: GO_TIMER TYPE REF TO CL_GUI_TIMER.
DATA: IT_ZGAME TYPE TABLE OF ZGAME WITH HEADER LINE,
      IT_ZGAME_CO TYPE TABLE OF ZGAME WITH HEADER LINE,
      WT_ZGAME_USER TYPE ZGAME_USER,
      GO_EVT_HNDL TYPE REF TO LCL_EVENT_HANDLER,
      GT_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.
DATA: W_SEC(2)      TYPE N,
      W_TIMEFLG(1)  TYPE C,
      W_TABNO       TYPE ZGAME_USER-TABNO,
      W_USER        TYPE ZGAME_USER-UNAME,
      W_ATIMES      TYPE ZGAME_LOG-ATIMES,
      W_WTIMES      TYPE ZGAME_LOG-WTIMES,
      W_LTIMES      TYPE ZGAME_LOG-LTIMES,
      W_P_ATIMES    TYPE ZGAME_LOG-ATIMES,
      W_P_WTIMES    TYPE ZGAME_LOG-WTIMES,
      W_P_LTIMES    TYPE ZGAME_LOG-LTIMES.

CONSTANTS: CNS_ZGAME_FIELD(10) TYPE VALUE ‘IT_ZGAME-F’.
*———————————————————————-*
*  画面パラメータの定義
*———————————————————————-*
SELECTION-SCREEN BEGIN OF BLOCK BLK_1 WITH FRAME TITLE TEXT-002.
PARAMETERS  P_TIME(2) TYPE N.
SELECTION-SCREEN END OF BLOCK BLK_1.

*———————————————————————-*
* INITIALIZATION.
*———————————————————————-*
INITIALIZATION.
  REFRESH:
    IT_ZGAME,
    IT_ZGAME_CO.
  CLEAR:
    W_ATIMES,
    W_WTIMES,
    W_LTIMES,
    W_SEC,
    W_TIMEFLG,
    W_TABNO,
    W_USER,
    WT_ZGAME_USER,
    IT_ZGAME.
*&———————————————————————*
*& START-OF-SELECTION
*&———————————————————————*
START-OF-SELECTION.
  PERFORM FRM_INITIAL_USER.
  PERFORM FRM_TABLE_SET.
  SET PF-STATUS ‘GAME’.
  PERFORM FRM_INITINAL_DATA.
  PERFORM FRM_OUTPUT_DATA.
  PERFORM INIT_TIMER.

AT LINE-SELECTION.
  PERFORM FRM_GET_DATA.
  PERFORM FRM_DATA_UPDATE.
  CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
  EXPORTING
  NEW_CODE = ‘RFSH’.
  CALL METHOD GO_TIMER->RUN
  EXCEPTIONS
  OTHERS 9.

**&———————————————————————*
**& USER-COMMAND
**&———————————————————————*
AT USER-COMMAND.
  PERFORM FRM_USER_COMMAND.
*&———————————————————————*
*& CLASS LCL_EVENT_HANDLER DEFINITION
*&———————————————————————*
CLASS LCL_EVENT_HANDLER DEFINITION.
  PUBLIC SECTION.
    METHODS:
    HANDLE_TIMER FOR EVENT FINISHED OF CL_GUI_TIMER.
ENDCLASS. “LCL_EVENT_HANDLER DEFINITION
*&———————————————————————*
*& CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*&———————————————————————*
CLASS LCL_EVENT_HANDLER IMPLEMENTATION.
  METHOD HANDLE_TIMER.
    PERFORM FRM_RESULT_CHECK.
    PERFORM FRM_GET_DATA.
    CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
    EXPORTING
    NEW_CODE = ‘RFSH’.
    CALL METHOD GO_TIMER->RUN
    EXCEPTIONS
    OTHERS 9.
  ENDMETHOD. “HANDLE_TIMER
ENDCLASS. “LCL_EVENT_HANDLER IMPLEMENTATION
*&———————————————————————*
*& FORM INIT_TIMER
*&———————————————————————*
FORM INIT_TIMER.
  DATA LW_TIME TYPE P.

  LW_TIME = 10.
  CHECK GO_TIMER IS INITIAL.
  CREATE OBJECT GO_TIMER
  EXCEPTIONS
  OTHERS 9.

  CREATE OBJECT GO_EVT_HNDL.
  SET HANDLER GO_EVT_HNDL->HANDLE_TIMER FOR GO_TIMER.

  GO_TIMER->INTERVAL = LW_TIME.
  CALL METHOD GO_TIMER->RUN
  EXCEPTIONS
  OTHERS 9.
ENDFORM. “ INIT_TIMER
*&———————————————————————*
*&      FORM  FRM_GET_DATA
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_INITINAL_DATA.
  DATA:
    LWT_ZGAME TYPE ZGAME,
    LW_FLAG(1) TYPE C,
    LW_ATIMES TYPE ZGAME_LOG-ATIMES,
    LWT_LOG TYPE ZGAME_LOG.

  CLEAR WT_ZGAME_USER.

  SELECT SINGLE *
    FROM ZGAME_USER
    INTO WT_ZGAME_USER
   WHERE UNAME = SY-UNAME.

  IF WT_ZGAME_USER-COLOR = ‘B’.
    SY-TITLE = ‘黒方’.
    DO 20 TIMES.
      LWT_ZGAME-TABNO = WT_ZGAME_USER-TABNO.
      LWT_ZGAME-LINES = LWT_ZGAME-LINES + 1.
      INSERT ZGAME FROM LWT_ZGAME.
      COMMIT WORK.
    ENDDO.
    W_TIMEFLG = ‘B’.
  ELSE.
    SY-TITLE = ‘白方’.
    W_TIMEFLG = ‘W’.
  ENDIF.
  SELECT *
    FROM ZGAME
    INTO TABLE IT_ZGAME
   WHERE TABNO = WT_ZGAME_USER-TABNO.
    IF SY-SUBRC <> 0.
     DO TIMES.
      SELECT *
        FROM ZGAME
        INTO TABLE IT_ZGAME
       WHERE TABNO = WT_ZGAME_USER-TABNO.
       IF SY-SUBRC <> 0.
         WAIT UP TO SECONDS.
       ELSE.
         LW_FLAG = ‘X’.
         EXIT.
       ENDIF.
     ENDDO.
     IF LW_FLAG <> ‘X’.
       CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
         EXPORTING
           MODE_ZGAME_USER       = ‘X’
           UNAME                 = SY-UNAME
           _SCOPE                = ‘3′.
       MESSAGE I002 WITH ‘該当するユーザがいません。’.
       DELETE FROM ZGAME_USER WHERE UNAME = SY-UNAME.
       COMMIT WORK.
       STOP.
     ELSE.
     ENDIF.
    ELSE.
  ENDIF.
  W_SEC = P_TIME.

  SELECT SINGLE
         ATIMES
         WTIMES
         LTIMES
    INTO (W_ATIMES, W_WTIMES, W_LTIMES)
    FROM ZGAME_LOG
   WHERE UNAME = SY-UNAME.

  IF SY-SUBRC <> 0.
    LWT_LOG-UNAME  = SY-UNAME.
    LWT_LOG-ATIMES = 0.
    LWT_LOG-WTIMES = 0.
    LWT_LOG-LTIMES = 0.
    W_ATIMES       = 0.
    W_WTIMES       = 0.
    W_LTIMES       = 0.
    INSERT ZGAME_LOG FROM LWT_LOG.
    COMMIT WORK.
  ELSE.
  ENDIF.

  LW_ATIMES = W_ATIMES + 1.

  UPDATE ZGAME_LOG
     SET ATIMES = LW_ATIMES
    WHERE UNAME = SY-UNAME.
  COMMIT WORK.

ENDFORM.                    “ FRM_GET_DATA
*&———————————————————————*
*&      FORM  FRM_OUTPUT_DATA
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_OUTPUT_DATA .
  DATA:
    LW_ATIMES_I TYPE I,
    LW_WTIMES_I TYPE I,
    LW_LTIMES_I TYPE I,
    LW_RATE  TYPE DECIMALS 4,
    LW_WRATE TYPE DECIMALS 2,
    LW_RRATE TYPE DECIMALS 2,
    LW_LTIMES TYPE ZGAME_LOG-LTIMES,
    LW_WTIMES TYPE ZGAME_LOG-WTIMES,
    LW_MESSAGE(50) TYPE C,
    LW_UNAME TYPE ZGAME_USER-UNAME,
    LW_LODFG TYPE ZGAME_USER-LODFG.

  SELECT SINGLE
        UNAME
        LODFG
   INTO (LW_UNAME, LW_LODFG)
   FROM ZGAME_USER
  WHERE UNAME = W_USER
    AND TABNO = W_TABNO.

  IF LW_LODFG <> ‘X’.
    CLEAR LW_MESSAGE.
    LW_MESSAGE = ‘碁石を入れてください’.
    IF P_TIME <> 0.
      IF W_SEC = 0.
        CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
         EXPORTING
           MODE_ZGAME_USER       = ‘X’
           UNAME                 = SY-UNAME
           _SCOPE                = ‘3′.
        LW_LTIMES = W_LTIMES + 1.

        UPDATE ZGAME_LOG
           SET LTIMES = LW_LTIMES
          WHERE UNAME = SY-UNAME.
        COMMIT WORK.

        MESSAGE I002 WITH ‘時限を越えたので、負けました’.
        SY-TITLE = ‘GAME’.
        LEAVE LIST-PROCESSING.
        STOP.
      ELSE.
      ENDIF.
    ELSE.
    ENDIF.
    IF W_TIMEFLG = ‘B’.
    ELSE.
      IF P_TIME <> 0.
        W_SEC = P_TIME.
        W_TIMEFLG = ‘B’.
      ELSE.
      ENDIF.
    ENDIF.
  ELSE.
    CLEAR LW_MESSAGE.
    CONCATENATE ‘ユーザ’
                W_USER
                ‘を待ってください’
           INTO LW_MESSAGE.
    IF P_TIME <> 0.
      IF W_SEC = 0.
        CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
         EXPORTING
           MODE_ZGAME_USER       = ‘X’
           UNAME                 = SY-UNAME
           _SCOPE                = ‘3′.
        LW_WTIMES = W_WTIMES + 1.
        UPDATE ZGAME_LOG
           SET WTIMES = LW_WTIMES
          WHERE UNAME = SY-UNAME.
        COMMIT WORK.

        MESSAGE I002 WITH ‘相手は時限を越えたので、勝ちました’.
        SY-TITLE = ‘GAME’.
        LEAVE LIST-PROCESSING.
        STOP.
      ELSE.
      ENDIF.
    ELSE.
    ENDIF.
    IF W_TIMEFLG = ‘W’.
    ELSE.
      IF P_TIME <> 0.
        W_SEC = P_TIME.
        W_TIMEFLG = ‘W’.
      ELSE.
      ENDIF.
    ENDIF.

  ENDIF.
  SY-LSIND = 0.

  NEW-PAGE LINE-SIZE 131.

  IF P_TIME = 0.
    WRITE:  031(50) LW_MESSAGE.
  ELSE.
    WRITE:  031(50) LW_MESSAGE.
    IF     W_SEC >= 6.
      WRITE:  090 W_SEC COLOR 5.
    ELSEIF W_SEC >= AND
           W_SEC < 6.
      WRITE:  090 W_SEC COLOR 3.
    ELSEIF W_SEC < 3.
      WRITE:  090 W_SEC COLOR 6.
    ENDIF.
    WRITE:  095 ‘秒’.
  ENDIF.
  WRITE: /031(131) SY-ULINE NO-GAP.

  LOOP AT IT_ZGAME.
    READ TABLE IT_ZGAME_CO INDEX SY-TABIX.
    IF SY-TABIX = 1.
      WRITE: /001(3) ‘ID:’,
              004(12) SY-UNAME,
              017(5) ‘総回:’,
              023(5) W_ATIMES,
              029(2) ‘回’.
    ELSEIF SY-TABIX = 2.
      WRITE: /001(5) ‘勝回:’,
              006(5) W_WTIMES,
              012(2) ‘回’,
              017(5) ‘負回:’,
              023(5) W_LTIMES,
              029(2) ‘回’.
    ELSEIF SY-TABIX = 3.
      IF NOT W_ATIMES IS INITIAL AND
         W_ATIMES <> 0.
        LW_RATE = W_WTIMES / W_ATIMES.
        LW_WRATE = LW_RATE * 100.
        LW_RATE = ( W_ATIMES - W_WTIMES - W_LTIMES ) / W_ATIMES.
        LW_RRATE = LW_RATE * 100.
      ELSE.
        LW_WRATE = 0.
        LW_RRATE = 0.
      ENDIF.
      WRITE: /001(5) ‘勝率:’,
              007(6) LW_WRATE,
              013(1) ‘%’,
              017(5) ‘逃率:’,
              023(6) LW_RRATE,
              029(1) ‘%’.
    ENDIF.

    IF SY-TABIX = 4.
      WRITE: /001(3) ‘ID:’,
              004(12) W_USER,
              017(5) ‘総回:’,
              023(5) W_P_ATIMES,
              029(2) ‘回’.
    ELSEIF SY-TABIX = 5.
      WRITE: /001(5) ‘勝回:’,
              006(5) W_P_WTIMES,
              012(2) ‘回’,
              017(5) ‘負回:’,
              023(5) W_P_LTIMES,
              029(2) ‘回’.
    ELSEIF SY-TABIX = 6.
      IF NOT W_P_ATIMES IS INITIAL AND
        W_P_ATIMES <> 0.
        LW_RATE = W_P_WTIMES / W_P_ATIMES.
        LW_WRATE = LW_RATE * 100.
        LW_RATE = ( W_P_ATIMES - W_P_WTIMES - W_P_LTIMES ) / W_P_ATIMES.
        LW_RRATE = LW_RATE * 100.
      ELSE.
        LW_WRATE = 0.
        LW_RRATE = 0.
      ENDIF.
      WRITE: /001(5) ‘勝率:’,
              007(6) LW_WRATE,
              013(1) ‘%’,
              017(5) ‘逃率:’,
              023(6) LW_RRATE,
              029(1) ‘%’.
    ENDIF.

    IF SY-TABIX > 6.
      WRITE: /031 SY-VLINE NO-GAP.
    ELSE.
      WRITE: 031 SY-VLINE NO-GAP.
    ENDIF.
    IF IT_ZGAME-F1 <> IT_ZGAME_CO-F1.
      WRITE:  033(002) IT_ZGAME-F1 COLOR 1.
    ELSE.
      WRITE:  033(002) IT_ZGAME-F1.
    ENDIF.
    WRITE:  036 SY-VLINE NO-GAP.
    IF IT_ZGAME-F2 <> IT_ZGAME_CO-F2.
      WRITE:  038(002) IT_ZGAME-F2 COLOR 1.
    ELSE.
      WRITE:  038(002) IT_ZGAME-F2.
    ENDIF.
    WRITE:  041 SY-VLINE NO-GAP.
    IF IT_ZGAME-F3 <> IT_ZGAME_CO-F3.
      WRITE:  043 IT_ZGAME-F3 COLOR 1.
    ELSE.
      WRITE:  043 IT_ZGAME-F3.
    ENDIF.
    WRITE:  046 SY-VLINE NO-GAP.
    IF IT_ZGAME-F4 <> IT_ZGAME_CO-F4.
      WRITE:  048 IT_ZGAME-F4 COLOR 1.
    ELSE.
      WRITE:  048 IT_ZGAME-F4.
    ENDIF.
    WRITE:  051 SY-VLINE NO-GAP.
    IF IT_ZGAME-F5 <> IT_ZGAME_CO-F5.
          WRITE:  053 IT_ZGAME-F5 COLOR 1.
    ELSE.
      WRITE:  053 IT_ZGAME-F5.
    ENDIF.
    WRITE:  056 SY-VLINE NO-GAP.
    IF IT_ZGAME-F6 <> IT_ZGAME_CO-F6.
      WRITE:  058 IT_ZGAME-F6 COLOR 1.
    ELSE.
      WRITE:  058 IT_ZGAME-F6.
    ENDIF.
    WRITE:  061 SY-VLINE NO-GAP.
    IF IT_ZGAME-F7 <> IT_ZGAME_CO-F7.
      WRITE:  063 IT_ZGAME-F7 COLOR 1.
    ELSE.
      WRITE:  063 IT_ZGAME-F7.
    ENDIF.
    WRITE:  066 SY-VLINE NO-GAP.
    IF IT_ZGAME-F8 <> IT_ZGAME_CO-F8.
      WRITE:  068 IT_ZGAME-F8 COLOR 1.
    ELSE.
      WRITE:  068 IT_ZGAME-F8.
    ENDIF.
    WRITE:  071 SY-VLINE NO-GAP.
    IF IT_ZGAME-F9 <> IT_ZGAME_CO-F9.
      WRITE:  073 IT_ZGAME-F9 COLOR 1.
    ELSE.
      WRITE:  073 IT_ZGAME-F9.
    ENDIF.
    WRITE:  076 SY-VLINE NO-GAP.
    IF IT_ZGAME-F10 <> IT_ZGAME_CO-F10.
      WRITE:  078 IT_ZGAME-F10 COLOR 1.
    ELSE.
      WRITE:  078 IT_ZGAME-F10.
    ENDIF.
    WRITE:  081 SY-VLINE NO-GAP.
    IF IT_ZGAME-F11 <> IT_ZGAME_CO-F11.
      WRITE:  083 IT_ZGAME-F11 COLOR 1.
    ELSE.
      WRITE:  083 IT_ZGAME-F11.
    ENDIF.
    WRITE:  086 SY-VLINE NO-GAP.
    IF IT_ZGAME-F12 <> IT_ZGAME_CO-F12.
      WRITE:  088 IT_ZGAME-F12 COLOR 1.
    ELSE.
      WRITE:  088 IT_ZGAME-F12.
    ENDIF.
    WRITE:  091 SY-VLINE NO-GAP.
    IF IT_ZGAME-F13 <> IT_ZGAME_CO-F13.
      WRITE:  093 IT_ZGAME-F13 COLOR 1.
    ELSE.
      WRITE:  093 IT_ZGAME-F13.
    ENDIF.
    WRITE:  096 SY-VLINE NO-GAP.
    IF IT_ZGAME-F14 <> IT_ZGAME_CO-F14.
      WRITE:  098 IT_ZGAME-F14 COLOR 1.
    ELSE.
      WRITE:  098 IT_ZGAME-F14.
    ENDIF.
    WRITE:  101 SY-VLINE NO-GAP.
    IF IT_ZGAME-F15 <> IT_ZGAME_CO-F15.
      WRITE:  103 IT_ZGAME-F15 COLOR 1.
    ELSE.
      WRITE:  103 IT_ZGAME-F15.
    ENDIF.
    WRITE:  106 SY-VLINE NO-GAP.
    IF IT_ZGAME-F16 <> IT_ZGAME_CO-F16.
      WRITE:  108 IT_ZGAME-F16 COLOR 1.
    ELSE.
      WRITE:  108 IT_ZGAME-F16.
    ENDIF.
    WRITE:  111 SY-VLINE NO-GAP.
    IF IT_ZGAME-F17 <> IT_ZGAME_CO-F17.
      WRITE:  113 IT_ZGAME-F17 COLOR 1.
    ELSE.
      WRITE:  113 IT_ZGAME-F17.
    ENDIF.
    WRITE:  116 SY-VLINE NO-GAP.
    IF IT_ZGAME-F18 <> IT_ZGAME_CO-F18.
      WRITE:  118 IT_ZGAME-F18 COLOR 1.
    ELSE.
      WRITE:  118 IT_ZGAME-F18.
    ENDIF.
    WRITE:  121 SY-VLINE NO-GAP.
    IF IT_ZGAME-F19 <> IT_ZGAME_CO-F19.
      WRITE:  123 IT_ZGAME-F19 COLOR 1.
    ELSE.
      WRITE:  123 IT_ZGAME-F19.
    ENDIF.
    WRITE:  126 SY-VLINE NO-GAP.
    IF IT_ZGAME-F20 <> IT_ZGAME_CO-F20.
      WRITE:  128 IT_ZGAME-F20 COLOR 1.
    ELSE.
      WRITE:  128 IT_ZGAME-F20.
    ENDIF.

    WRITE:  131 SY-VLINE NO-GAP.
    WRITE: /031(131) SY-ULINE NO-GAP.

  ENDLOOP.
  IF P_TIME <> 0.
    W_SEC = W_SEC - 1.
  ELSE.
  ENDIF.
  REFRESH IT_ZGAME_CO.
  CLEAR IT_ZGAME_CO.
  APPEND LINES OF IT_ZGAME TO IT_ZGAME_CO.
ENDFORM.                    “ FRM_OUTPUT_DATA
*&———————————————————————*
*&      FORM  FRM_DATA_UPDATE
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_DATA_UPDATE .
  FIELD-SYMBOLS: <F> TYPE ANY.
  DATA:
    LW_UNAME TYPE ZGAME_USER-UNAME,
    LW_COUNT(2) TYPE C,
    LW_FIELD(12) TYPE C,
    LW_INT      TYPE I.
  IF SY-UCOMM = ‘PICK’.
    SY-UCOMM = ‘RFSH’.
    SELECT SINGLE *
      FROM ZGAME_USER
      INTO WT_ZGAME_USER
     WHERE UNAME = SY-UNAME.

    IF WT_ZGAME_USER-LODFG = ‘X’.
      IF SY-CUCOL >= 33  AND
         SY-CUCOL <= 131 AND
         SY-LILLI >= 3   AND
         SY-LILLI <= 41.
        LW_INT = SY-CUCOL - 32.
        LW_INT = LW_INT DIV 1.
        LW_COUNT = LW_INT.
        CONCATENATE CNS_ZGAME_FIELD LW_COUNT INTO LW_FIELD.
        LW_INT = ( SY-LILLI - ) / 2.

        READ TABLE IT_ZGAME INDEX LW_INT.
        ASSIGN (LW_FIELD) TO <F>.
        IF <F> IS INITIAL.
          IF WT_ZGAME_USER-COLOR = ‘B’.
            <F> = ‘●’.
          ELSE.
            <F> = ‘○’.
          ENDIF.
          MODIFY ZGAME FROM IT_ZGAME.
          COMMIT WORK.
          GET TIME.
          WT_ZGAME_USER-LODFG = .
          WT_ZGAME_USER-UDATE = SY-DATUM.
          WT_ZGAME_USER-UTIME = SY-UZEIT.
          WT_ZGAME_USER-GTIME = P_TIME.
          MODIFY ZGAME_USER FROM WT_ZGAME_USER.
          COMMIT WORK.
          W_SEC = P_TIME.
          UPDATE ZGAME_USER
             SET LODFG = ‘X’
           WHERE UNAME = W_USER.
          COMMIT WORK.
          W_SEC = 10.
        ELSE.
          MESSAGE S002 WITH ‘ここで碁石を入れることができません’.
        ENDIF.
      ELSE.
      ENDIF.
    ELSE.
    ENDIF.
  ENDIF.

ENDFORM.                    “ FRM_DATA_UPDATE
*&———————————————————————*
*&      FORM  FRM_INITIAL_USER
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_INITIAL_USER.
  DATA:
    LW_TABIX TYPE SY-TABIX,
    LIT_ZGAME_USER TYPE TABLE OF ZGAME_USER WITH HEADER LINE.

  SELECT *
    FROM ZGAME_USER
    INTO TABLE LIT_ZGAME_USER.
  LOOP AT LIT_ZGAME_USER.
    LW_TABIX = SY-TABIX.
    CALL FUNCTION ‘ENQUEUE_EZEZGAME_USER’
     EXPORTING
       MODE_ZGAME_USER       = ‘X’
       UNAME                 = LIT_ZGAME_USER-UNAME
       _SCOPE                = ‘2′
     EXCEPTIONS
       FOREIGN_LOCK          = 1
       SYSTEM_FAILURE        = 2
       OTHERS                3.
    IF SY-SUBRC <> 0.
    ELSE.
      DELETE FROM ZGAME WHERE TABNO = LIT_ZGAME_USER-TABNO.
      COMMIT WORK.
      DELETE FROM ZGAME_USER WHERE UNAME = LIT_ZGAME_USER-UNAME.
      COMMIT WORK.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = LIT_ZGAME_USER-UNAME
         _SCOPE                = ‘3′.

      DELETE LIT_ZGAME_USER INDEX LW_TABIX.
    ENDIF.
  ENDLOOP.
  READ TABLE LIT_ZGAME_USER WITH KEY UNAME = SY-UNAME.
  IF SY-SUBRC = 0.
    MESSAGE I002 WITH ‘同時に二つのゲーム’
                      ‘を開始することができません’.
    STOP.
  ELSE.
  ENDIF.
ENDFORM.                    “ FRM_INITIAL_USER
*&———————————————————————*
*&      FORM  FRM_TABLE_SET
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_TABLE_SET.
  DATA:
    LW_BEGIN(1)    TYPE C,
    LW_WATFG       TYPE ZGAME_USER-WATFG,
    LW_TABNO       TYPE ZGAME_USER-TABNO,
    LWT_ZGAME_USER TYPE ZGAME_USER.

  SELECT SINGLE
         UNAME
         TABNO
         WATFG
    INTO (W_USER, W_TABNO, LW_WATFG)
    FROM ZGAME_USER
   WHERE UNAME <> SY-UNAME
     AND WATFG = ‘X’
     AND GTIME = P_TIME.

  IF SY-SUBRC = 0.
    CLEAR LWT_ZGAME_USER.
    LWT_ZGAME_USER-UNAME = SY-UNAME.
    LWT_ZGAME_USER-TABNO = W_TABNO.
    LWT_ZGAME_USER-COLOR = ‘W’.
    LWT_ZGAME_USER-WATFG = .
    LWT_ZGAME_USER-GAMFG = ‘X’.
    GET TIME.
    LWT_ZGAME_USER-UDATE = SY-DATUM.
    LWT_ZGAME_USER-UTIME = SY-UZEIT.
    LWT_ZGAME_USER-GTIME = P_TIME.
    CALL FUNCTION ‘ENQUEUE_EZEZGAME_USER’
     EXPORTING
       MODE_ZGAME_USER       = ‘X’
       UNAME                 = SY-UNAME
       _SCOPE                = ‘2′
     EXCEPTIONS
       FOREIGN_LOCK          = 1
       SYSTEM_FAILURE        = 2
       OTHERS                3.
    MODIFY ZGAME_USER FROM LWT_ZGAME_USER.
    COMMIT WORK.
  ELSE.
    CLEAR:
      LW_TABNO,
      LWT_ZGAME_USER.

    SELECT MAX( TABNO )
      INTO LW_TABNO
      FROM ZGAME_USER.

    LW_TABNO = LW_TABNO + 1.
    LWT_ZGAME_USER-UNAME = SY-UNAME.
    LWT_ZGAME_USER-TABNO = LW_TABNO.
    LWT_ZGAME_USER-COLOR = ‘B’.
    LWT_ZGAME_USER-WATFG = ‘X’.
    LWT_ZGAME_USER-GAMFG = .
    GET TIME.
    LWT_ZGAME_USER-UDATE = SY-DATUM.
    LWT_ZGAME_USER-UTIME = SY-UZEIT.
    LWT_ZGAME_USER-GTIME = P_TIME.
    CALL FUNCTION ‘ENQUEUE_EZEZGAME_USER’
     EXPORTING
       MODE_ZGAME_USER       = ‘X’
       UNAME                 = SY-UNAME
       _SCOPE                = ‘2′
     EXCEPTIONS
       FOREIGN_LOCK          = 1
       SYSTEM_FAILURE        = 2
       OTHERS                3.
    MODIFY ZGAME_USER FROM LWT_ZGAME_USER.
    COMMIT WORK.
    DO 10 TIMES.
      SELECT SINGLE
             UNAME
             TABNO
        INTO (W_USER, W_TABNO)
        FROM ZGAME_USER
       WHERE UNAME <> SY-UNAME
         AND TABNO = LW_TABNO.

      IF SY-SUBRC = 0.
        LWT_ZGAME_USER-UNAME = SY-UNAME.
        LWT_ZGAME_USER-TABNO = W_TABNO.
        LWT_ZGAME_USER-COLOR = ‘B’.
        LWT_ZGAME_USER-WATFG = .
        LWT_ZGAME_USER-GAMFG = ‘X’.
        LWT_ZGAME_USER-LODFG = ‘X’.
        GET TIME.
        LWT_ZGAME_USER-UDATE = SY-DATUM.
        LWT_ZGAME_USER-UTIME = SY-UZEIT.
        LWT_ZGAME_USER-GTIME = P_TIME.
        MODIFY ZGAME_USER FROM LWT_ZGAME_USER.
        COMMIT WORK.
        LW_BEGIN = ‘X’.
        EXIT.
      ELSE.
        WAIT UP TO SECONDS.
      ENDIF.
    ENDDO.
    IF LW_BEGIN <> ‘X’.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = SY-UNAME
         _SCOPE                = ‘3′.
      MESSAGE I002 WITH ‘該当するユーザがいません。’.
      DELETE FROM ZGAME_USER WHERE UNAME = SY-UNAME.
      COMMIT WORK.
      STOP.
    ELSE.
    ENDIF.
  ENDIF.

  SELECT SINGLE
         ATIMES
         WTIMES
         LTIMES
    INTO (W_P_ATIMES, W_P_WTIMES, W_P_LTIMES)
    FROM ZGAME_LOG
   WHERE UNAME = W_USER.

  IF SY-SUBRC <> 0.
    W_P_ATIMES = 0.
    W_P_WTIMES = 0.
    W_P_LTIMES = 0.
  ELSE.
  ENDIF.

ENDFORM.                    “ FRM_TABLE_SET
*&———————————————————————*
*&      FORM  FRM_GET_DATA
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_GET_DATA.
  DATA:
    LW_WTIMES TYPE ZGAME_LOG-WTIMES,
    LW_UTIME TYPE ZGAME_USER-UTIME,
    LW_UNAME TYPE ZGAME_USER-UNAME.
  REFRESH IT_ZGAME.
  CLEAR IT_ZGAME.

  SELECT *
    FROM ZGAME
    INTO TABLE IT_ZGAME
   WHERE TABNO = W_TABNO.

  GET TIME.

  UPDATE ZGAME_USER
     SET UDATE = SY-DATUM
         UTIME = SY-UZEIT
   WHERE UNAME = SY-UNAME.

  COMMIT WORK.

  SELECT SINGLE
         UNAME
         UTIME
    INTO (LW_UNAME, LW_UTIME)
    FROM ZGAME_USER
   WHERE UNAME = W_USER
     AND TABNO = W_TABNO.

  LW_UTIME = LW_UTIME + 5.

  IF SY-UZEIT > LW_UTIME.

    CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
     EXPORTING
       MODE_ZGAME_USER       = ‘X’
       UNAME                 = SY-UNAME
       _SCOPE                = ‘3′.

    LW_WTIMES = W_WTIMES + 1.

    UPDATE ZGAME_LOG
       SET WTIMES = LW_WTIMES
      WHERE UNAME = SY-UNAME.

    COMMIT WORK.

    MESSAGE I002 WITH ‘ユーザ’
                      LW_UNAME
                      ‘はサーバーに接続できませんでした’.
    SY-TITLE = ‘GAME’.
    LEAVE LIST-PROCESSING.
    STOP.
  ELSE.
  ENDIF.
ENDFORM.                    “ FRM_GET_DATA

*&———————————————————————*
*&      FORM  FRM_WIN_CHECK
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_WIN_CHECK USING I_COLOR
                CHANGING O_WIN.
  FIELD-SYMBOLS: <F> TYPE ANY.
  DATA: BEGIN OF LIT_POINT_X OCCURS 0,
          LINE TYPE I,
          ROW  TYPE I,
        END OF LIT_POINT_X.

  DATA: BEGIN OF LIT_POINT_Y OCCURS 0,
          ROW  TYPE I,
          LINE TYPE I,
        END OF LIT_POINT_Y.

  DATA:
    LIT_POINT_X_CO LIKE TABLE OF LIT_POINT_X WITH HEADER LINE,
    LIT_POINT_Y_CO LIKE TABLE OF LIT_POINT_Y WITH HEADER LINE,
    LWT_POINT_X_CO1 LIKE LIT_POINT_X,
    LWT_POINT_X_CO2 LIKE LIT_POINT_X,
    LWT_POINT_Y_CO1 LIKE LIT_POINT_Y,
    LWT_POINT_Y_CO2 LIKE LIT_POINT_Y.

  DATA:
    LW_X         TYPE I,
    LW_Y         TYPE I,
    LW_COLOR     TYPE ZGAME_USER-COLOR,
    LW_COUNT(2)  TYPE C,
    LW_FIELD(12) TYPE C,
    LW_LINE      TYPE SY-TABIX,
    LW_LINES     TYPE I.

  LW_COLOR = I_COLOR.
  LOOP AT IT_ZGAME.
    LW_LINE = SY-TABIX.
    CLEAR LW_COUNT.
    DO 20 TIMES.
     LW_COUNT = LW_COUNT + 1.
     CONCATENATE CNS_ZGAME_FIELD LW_COUNT INTO LW_FIELD.
     ASSIGN (LW_FIELD) TO <F>.
     IF <F> = LW_COLOR.
       LIT_POINT_X-LINE = LW_LINE.
       LIT_POINT_X-ROW  = LW_COUNT.
       APPEND LIT_POINT_X.
       LIT_POINT_Y-ROW  = LW_COUNT.
       LIT_POINT_Y-LINE = LW_LINE.
       APPEND LIT_POINT_Y.
     ELSE.
     ENDIF.
    ENDDO.
  ENDLOOP.
  SORT LIT_POINT_X BY LINE ASCENDING
                       ROW DESCENDING.
  LOOP AT LIT_POINT_X.
    APPEND LIT_POINT_X TO LIT_POINT_X_CO.
    AT END OF LINE.
      CLEAR LW_LINES.
      DESCRIBE TABLE LIT_POINT_X_CO LINES LW_LINES.
      IF LW_LINES < 5.
        CLEAR LIT_POINT_X_CO.
        REFRESH LIT_POINT_X_CO.
        CONTINUE.
      ELSE.
        CLEAR O_WIN.
        DO.
          CLEAR LWT_POINT_X_CO1.
          READ TABLE LIT_POINT_X_CO INTO LWT_POINT_X_CO1 INDEX 1.
          IF SY-SUBRC <> 0.
            EXIT.
          ELSE.
          ENDIF.
          CLEAR LWT_POINT_X_CO2.
          READ TABLE LIT_POINT_X_CO INTO LWT_POINT_X_CO2 INDEX 2.
          IF SY-SUBRC <> 0.
            EXIT.
          ELSE.
          ENDIF.
          LWT_POINT_X_CO1-ROW = LWT_POINT_X_CO1-ROW - 1.
          IF LWT_POINT_X_CO1-ROW = LWT_POINT_X_CO2-ROW.
            O_WIN = O_WIN + 1.
            IF O_WIN = 4.
              EXIT.
            ELSE.
            ENDIF.
          ELSE.
            CLEAR O_WIN.
          ENDIF.
          DELETE LIT_POINT_X_CO INDEX 1.
        ENDDO.
        IF O_WIN = 4.
          EXIT.
        ELSE.
          REFRESH LIT_POINT_X_CO.
          CLEAR LIT_POINT_X_CO.
          CONTINUE.
        ENDIF.
      ENDIF.
    ENDAT.
  ENDLOOP.

  IF O_WIN = 4.
    EXIT.
  ELSE.
  ENDIF.

  SORT LIT_POINT_Y BY ROW ASCENDING
                     LINE DESCENDING.
  LOOP AT LIT_POINT_Y.
    APPEND LIT_POINT_Y TO LIT_POINT_Y_CO.
    AT END OF ROW.
      CLEAR LW_LINES.
      DESCRIBE TABLE LIT_POINT_Y_CO LINES LW_LINES.
      IF LW_LINES < 5.
        CLEAR LIT_POINT_Y_CO.
        REFRESH LIT_POINT_Y_CO.
        CONTINUE.
      ELSE.
        CLEAR O_WIN.
        DO.
          CLEAR LWT_POINT_Y_CO1.
          READ TABLE LIT_POINT_Y_CO INTO LWT_POINT_Y_CO1 INDEX 1.
          IF SY-SUBRC <> 0.
            EXIT.
          ELSE.
          ENDIF.
          CLEAR LWT_POINT_Y_CO2.
          READ TABLE LIT_POINT_Y_CO INTO LWT_POINT_Y_CO2 INDEX 2.
          IF SY-SUBRC <> 0.
            EXIT.
          ELSE.
          ENDIF.
          LWT_POINT_Y_CO1-LINE = LWT_POINT_Y_CO1-LINE - 1.
          IF LWT_POINT_Y_CO1-LINE = LWT_POINT_Y_CO2-LINE.
            O_WIN = O_WIN + 1.
            IF O_WIN = 4.
              EXIT.
            ELSE.
            ENDIF.
          ELSE.
            CLEAR O_WIN.
          ENDIF.
          DELETE LIT_POINT_Y_CO INDEX 1.
        ENDDO.
        IF O_WIN = 4.
          EXIT.
        ELSE.
          REFRESH LIT_POINT_Y_CO.
          CLEAR LIT_POINT_Y_CO.
          CONTINUE.
        ENDIF.
      ENDIF.
    ENDAT.
  ENDLOOP.

  IF O_WIN = 4.
    EXIT.
  ELSE.
  ENDIF.

  CLEAR O_WIN.
  LOOP AT LIT_POINT_X.
    CLEAR O_WIN.
     LW_Y = LIT_POINT_X-LINE.
     LW_X = LIT_POINT_X-ROW.
    DO.
      LW_Y = LW_Y + 1.
      LW_X = LW_X + 1.
      READ TABLE LIT_POINT_X INTO LWT_POINT_X_CO1 WITH KEY LINE = LW_Y
                                                            ROW = LW_X.
      IF SY-SUBRC = 0.
        O_WIN = O_WIN + 1.
        IF O_WIN = 4.
          EXIT.
        ELSE.
        ENDIF.
      ELSE.
        CLEAR O_WIN.
        EXIT.
      ENDIF.
    ENDDO.

    IF O_WIN = 4.
      EXIT.
    ELSE.
      CONTINUE.
    ENDIF.
  ENDLOOP.

  IF O_WIN = 4.
    EXIT.
  ELSE.
  ENDIF.

  CLEAR O_WIN.
  LOOP AT LIT_POINT_X.
    CLEAR O_WIN.
     LW_Y = LIT_POINT_X-LINE.
     LW_X = LIT_POINT_X-ROW.
    DO.
      LW_Y = LW_Y + 1.
      LW_X = LW_X - 1.
      READ TABLE LIT_POINT_X INTO LWT_POINT_X_CO1 WITH KEY LINE = LW_Y
                                                            ROW = LW_X.
      IF SY-SUBRC = 0.
        O_WIN = O_WIN + 1.
        IF O_WIN = 4.
          EXIT.
        ELSE.
        ENDIF.
      ELSE.
        CLEAR O_WIN.
        EXIT.
      ENDIF.
    ENDDO.

    IF O_WIN = 4.
      EXIT.
    ELSE.
      CONTINUE.
    ENDIF.
  ENDLOOP.

ENDFORM.                    “ FRM_WIN_CHECK
*&———————————————————————*
*&      FORM  FRM_USER_COMMAND
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_USER_COMMAND .
  DATA: LW_WIN TYPE I.
  IF SY-UCOMM = ‘RFSH’.
    PERFORM FRM_OUTPUT_DATA.
  ELSEIF SY-UCOMM = ‘EXIT’.
    CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
     EXPORTING
       MODE_ZGAME_USER       = ‘X’
       UNAME                 = SY-UNAME
       _SCOPE                = ‘3′.
    LEAVE LIST-PROCESSING.
  ELSE.
  ENDIF.

ENDFORM.                    “ FRM_USER_COMMAND
*&———————————————————————*
*&      FORM  FRM_RESULT_CHECK
*&———————————————————————*
*       TEXT
*———————————————————————-*
*  –>  P1        TEXT
*  <–  P2        TEXT
*———————————————————————-*
FORM FRM_RESULT_CHECK .
  DATA: LW_WIN TYPE I,
        LW_LTIMES TYPE ZGAME_LOG-LTIMES,
        LW_WTIMES TYPE ZGAME_LOG-WTIMES.

  PERFORM FRM_WIN_CHECK USING ‘●’
                     CHANGING LW_WIN.
  IF LW_WIN = 4.
    IF WT_ZGAME_USER-COLOR = ‘B’.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = SY-UNAME
         _SCOPE                = ‘3′.

      LW_WTIMES = W_WTIMES + 1.
      UPDATE ZGAME_LOG
         SET WTIMES = LW_WTIMES
        WHERE UNAME = SY-UNAME.
      COMMIT WORK.

      MESSAGE I002 WITH ‘勝利’.
      SY-TITLE = ‘GAME’.
      LEAVE LIST-PROCESSING.
      STOP.
    ELSE.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = SY-UNAME
         _SCOPE                = ‘3′.

      LW_LTIMES = W_LTIMES + 1.
      UPDATE ZGAME_LOG
         SET LTIMES = LW_LTIMES
        WHERE UNAME = SY-UNAME.
      COMMIT WORK.

      MESSAGE I002 WITH ‘失敗’.
      SY-TITLE = ‘GAME’.
      LEAVE LIST-PROCESSING.
      STOP.
    ENDIF.
  ELSE.
  ENDIF.
  CLEAR LW_WIN.
  PERFORM FRM_WIN_CHECK USING ‘○’
                     CHANGING LW_WIN.
  IF LW_WIN = 4.
    IF WT_ZGAME_USER-COLOR = ‘B’.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = SY-UNAME
         _SCOPE                = ‘3′.
      LW_LTIMES = W_LTIMES + 1.
      UPDATE ZGAME_LOG
         SET LTIMES = LW_LTIMES
        WHERE UNAME = SY-UNAME.
      COMMIT WORK.

      MESSAGE I002 WITH ‘失敗’.
      SY-TITLE = ‘GAME’.
      LEAVE LIST-PROCESSING.
      STOP.
    ELSE.
      CALL FUNCTION ‘DEQUEUE_EZEZGAME_USER’
       EXPORTING
         MODE_ZGAME_USER       = ‘X’
         UNAME                 = SY-UNAME
         _SCOPE                = ‘3′.

      LW_WTIMES = W_WTIMES + 1.
      UPDATE ZGAME_LOG
         SET WTIMES = LW_WTIMES
        WHERE UNAME = SY-UNAME.
      COMMIT WORK.

      MESSAGE I002 WITH ‘勝利’.
      SY-TITLE = ‘GAME’.
      LEAVE LIST-PROCESSING.
      STOP.
    ENDIF.
  ELSE.
  ENDIF.

ENDFORM.                    “ FRM_RESULT_CHECK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值