快过年了,找点事在系统里玩玩,原文截图是系统标识是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