ABAP联机版五子棋


快过年了,找点事在系统里玩玩,原文截图是系统标识是NW7, 难道是AC的某人写的?

原文地址:http://scnblogs.techweb.com.cn/morehigh/archives/28.html

运行效果:




实际使用的话,需要下面的三个表, 代码如下,没有严格测试过,但是能正常执行。所以仅供参考。



原文代码有些小问题,以下是我修进过的代码,可以COPY即玩,不过有慢哟

*&———————————————————————*
*& REPORT  ZTEST001
*&
*&———————————————————————*
REPORT ztest001 NO STANDARD PAGE HEADING.

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 c 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.

  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
  "handle_timer
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION
"lcl_event_handler implementation
*&———————————————————————*
*& FORM INIT_TIMER
*&———————————————————————*
FORM init_timer.
  DATA lw_time TYPE p.

  lw_time = 5 / 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.                    "HANDLE_TIMER

" init_timer

*&———————————————————————*
*&      FORM  FRM_GET_DATA
*&———————————————————————*
*       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 5 TIMES.
      SELECT *
        FROM zgame
        INTO TABLE it_zgame
       WHERE tabno = wt_zgame_user-tabno.
      IF sy-subrc <> 0.
        WAIT UP TO 1 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 '有问题没有用户。' TYPE 'I'.
      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.                    "HANDLE_TIMER

*&———————————————————————*
*&      FORM  FRM_OUTPUT_DATA
*&———————————————————————*
*       TEXT
*———————————————————————-*
FORM frm_output_data .
  DATA:
    lw_atimes_i TYPE i,
    lw_wtimes_i TYPE i,
    lw_ltimes_i TYPE i,
    lw_rate  TYPE p DECIMALS 4,
    lw_wrate TYPE p DECIMALS 2,
    lw_rrate TYPE p 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 '经超出了时间限制,你输了!' TYPE 'I'.
        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 '对手超时,你赢了!' TYPE 'I'.
        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 >= 3 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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    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 HOTSPOT.
    ENDIF.

    WRITE:  131 sy-vline NO-GAP.
    WRITE: /031(131) sy-uline NO-GAP.

  ENDLOOP.

  IF p_time <> 0.
    w_sec = w_sec - 1.
  ENDIF.

  REFRESH it_zgame_co.

  CLEAR it_zgame_co.
  APPEND LINES OF it_zgame TO it_zgame_co.

ENDFORM.                    "HANDLE_TIMER

*&———————————————————————*
*&      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 5 + 1.
        lw_count = lw_int.

        CONCATENATE cns_zgame_field lw_count INTO lw_field.

        lw_int = ( sy-lilli - 1 ) / 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  '不能在这里下子!' TYPE 'S'.
        ENDIF.
      ELSE.
      ENDIF.
    ELSE.
    ENDIF.
  ENDIF.

ENDFORM.                    "HANDLE_TIMER

" 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 '不能同时开始两场比赛!' TYPE 'I'.
    STOP.
  ELSE.
  ENDIF.
ENDFORM.                    "HANDLE_TIMER

*&———————————————————————*
*&      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 1 SECONDS.
      ENDIF.
    ENDDO.
    IF lw_begin <> 'X'.
      CALL FUNCTION 'DEQUEUE_EZEZGAME_USER'
        EXPORTING
          mode_zgame_user = 'X'
          uname           = sy-uname
          _scope          = '3'.
      MESSAGE '您没有玩伴!' TYPE 'I'.
      DELETE FROM zgame_user WHERE uname = sy-uname.
      COMMIT WORK.
      STOP.
    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.
  ENDIF.

ENDFORM.                    "HANDLE_TIMER

*&———————————————————————*
*&      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.

    DATA: lv_str TYPE string.
    CONCATENATE '用户' lw_uname '联机失败!'
      INTO lv_str.
    MESSAGE lv_str TYPE 'I'.

    sy-title = 'GAME'.
    LEAVE LIST-PROCESSING.
    STOP.
  ENDIF.
ENDFORM.                    "HANDLE_TIMER

*&———————————————————————*
*&      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.                    "HANDLE_TIMER

*&———————————————————————*
*&      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.                    "HANDLE_TIMER

*&———————————————————————*
*&      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 '勝利' TYPE 'I'.
      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 '失敗' TYPE 'I'.
      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 '失敗' TYPE 'I'.
      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 '勝利' TYPE 'I'.
      sy-title = 'GAME'.
      LEAVE LIST-PROCESSING.
      STOP.
    ENDIF.
  ELSE.
  ENDIF.

ENDFORM.                    "HANDLE_TIMER
" frm_result_check






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值