谁说培训新人ABAP,只能讲一些枯燥乏味的代码?为培训新人,做了一个ABAP的联机版五子棋,激起了他们的学习兴趣,好事一件。现公布代码,供同行选用!
执行画面,输入下棋的时间,并执行程序,10秒内如果有用户输入了相同的下棋时间并且执行程序的话,则两人将自动联机,先执行者为黑棋。

实际使用的话,需要下面的三个表
代码如下,没有严格测试过,但是能正常执行。所以仅供参考。
*&———————————————————————*
*& 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 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.
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 = 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. “ 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 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 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 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 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 >= 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.
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 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 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 1 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