0
点赞
收藏
分享

微信扫一扫

ABAP游戏:扫雷 代码二_SAP刘梦_新浪博客

AT SELECTION-SCREEN OUTPUT.
IF LINES( cells2update ) > 0.
" here: switch back from abap to html
CALL METHOD html_control->html_board_update( ).
ENDIF.


AT SELECTION-SCREEN ON RADIOBUTTON GROUP one.
CHECK sy-ucomm = 'RADIOGROUP01'.
IF g1 = 'X'.
PERFORM game_create USING 'B' 09 09 10.
ELSEIF g2 = 'X'.
PERFORM game_create USING 'I' 16 16 40.
ELSEIF g3 = 'X'.
PERFORM game_create USING 'E' 30 16 99.
ELSE.
CALL SELECTION-SCREEN 1001
STARTING AT 20 4.
PERFORM game_create USING 'C' x_size y_size bomb_cnt.
ENDIF.

PERFORM html_show.


*&---------------------------------------------------------------------*
*& Form game_print_abap.
*&---------------------------------------------------------------------*
FORM game_print_abap.
DATA: ofs TYPE i, ch TYPE c.

SKIP TO LINE 3.

WRITE: / 'Bombs left: ', b_left NO-ZERO.

ofs = rdx.
SKIP TO LINE y_ofs.

DO y_size TIMES.
WRITE AT x_ofs '|' NO-GAP.

DO x_size TIMES.
ADD 1 TO ofs.
ch = board ofs(1).
CASE ch.
WHEN blank_opened.
WRITE: ' '.

WHEN '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8'.
WRITE: ' ' NO-GAP, ch NO-GAP.

WHEN bomb_marked.
WRITE icon_breakpoint AS ICON NO-GAP.

WHEN blank_marked
OR 'a' OR 'b' OR 'c' OR 'd' OR 'e' OR 'f' OR 'g' OR 'h'.
WRITE icon_breakpoint AS ICON NO-GAP.

WHEN endgame_bomb_missmark.
WRITE icon_breakpoint_disable AS ICON NO-GAP.

WHEN endgame_bomb_boom.
WRITE icon_system_cancel AS ICON NO-GAP.

WHEN bomb_opened. "endgame only
WRITE icon_dummy AS ICON NO-GAP.

WHEN OTHERS.
WRITE: icon_wd_transparent_container AS ICON NO-GAP.
ENDCASE.
ENDDO.
WRITE '|'.
ADD 2 TO ofs.
NEW-LINE.
ENDDO.
WRITE: AT x_ofs '' NO-GAP, ' switch back ' COLOR 2 HOTSPOT ON.

IF game = game_over.
WRITE: /, /4 'Game over', /, /.
ELSEIF game = game_win.
WRITE: /, /4 'You win', /, /.
ELSE.
SKIP 3.
ENDIF.
WRITE: / ' open: double-click'.
WRITE: / ' mark: click and press F9'.
ENDFORM. "game_print_abap


*&---------------------------------------------------------------------*
*& Form CELL_MARK
*&---------------------------------------------------------------------*
* mark a cell with 'bomb sign'
*----------------------------------------------------------------------*
FORM cell_mark USING value(ofs) TYPE i.
DATA: ch TYPE c.
ch = board ofs(1).
CASE ch.
WHEN blank_hidden. setcell blank_marked. ADD -1 TO b_left.
WHEN blank_marked. setcell blank_hidden. ADD 1 TO b_left.
WHEN bomb_hidden. setcell bomb_marked. ADD -1 TO b_left.
WHEN bomb_marked. setcell bomb_hidden. ADD 1 TO b_left.

WHEN 'A' OR 'B' OR 'C' OR 'D' OR 'E' OR 'F' OR 'G' OR 'H'.
TRANSLATE ch TO LOWER CASE.
setcell ch. ADD -1 TO b_left.

WHEN 'a' OR 'b' OR 'c' OR 'd' OR 'e' OR 'f' OR 'g' OR 'h'.
TRANSLATE ch TO UPPER CASE.
setcell ch. ADD 1 TO b_left.

ENDCASE.
ENDFORM. "CELL_MARK



*&---------------------------------------------------------------------*
*& Form cell_open
*&---------------------------------------------------------------------*
* open a cell, at one's own risk
*----------------------------------------------------------------------*
FORM cell_open USING value(ofs) TYPE i.
CASE board ofs(1).
WHEN blank_hidden.
PERFORM cell_floodfill USING ofs.
WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.
WHEN '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8'.
PERFORM cell_open_around USING ofs.
WHEN bomb_hidden.
setcell endgame_bomb_boom.
PERFORM game_lose.
ENDCASE.
ENDFORM. "cell_open

*&---------------------------------------------------------------------*
*& Form cell_get_clicked
*&---------------------------------------------------------------------*
FORM cell_get_clicked CHANGING ofs TYPE i.
DATA: row TYPE i, col TYPE i.
row = sy-curow - y_ofs.
col = ( sy-cucol - x_ofs - 2 ) DIV 2.
ofs = ( 1 row ) * rdx col 1.
IF row < 0 OR row > y_size OR
col < 0 OR col > x_size.
ofs = 0.
ENDIF.
ENDFORM. "cell_get_clicked



DATA: floodfill TYPE TABLE OF i INITIAL SIZE 1000.

*&---------------------------------------------------------------------*
*& Form cell_flood_fill
*&---------------------------------------------------------------------*
* open all adjacent empty cells
*----------------------------------------------------------------------*
FORM cell_floodfill USING value(x) TYPE i.
DATA: ofs TYPE i.

ofs = x 00. " cell itself
setcell blank_opened. ADD -1 TO rest.

APPEND x TO floodfill.
LOOP AT floodfill INTO x.
LOOP AT eight_directions.
ofs = x eight_directions.

CASE board ofs(1).
WHEN blank_hidden.
setcell blank_opened. ADD -1 TO rest.
APPEND ofs TO floodfill.
WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.
ENDCASE.
ENDLOOP.
ENDLOOP.
REFRESH floodfill.
ENDFORM. "cell_flood_fill



*&---------------------------------------------------------------------*
*& Form cell_open_eight_directions
*&---------------------------------------------------------------------*
* Open up to 8 cells around current one
*----------------------------------------------------------------------*
FORM cell_open_around USING value(x) TYPE i.
DATA: ofs TYPE i.
DATA: value TYPE i.

" 1 >> get cell's VALUE (1 to 8)
value = board x(1).

" 2 >> look around it, get count of marked
LOOP AT eight_directions.
ofs = x eight_directions.
CASE board ofs(1).
WHEN bomb_marked
OR blank_marked
OR 'a' " digit_maked
OR 'b' " ..
OR 'c'
OR 'd'
OR 'e'
OR 'f'
OR 'g'
OR 'h'.
value = value - 1.
ENDCASE.
ENDLOOP.

" 3 >> check its EQness
CHECK value = 0.

" 4 >> here: opening is possible

" 5 >> do open
LOOP AT eight_directions.
ofs = x eight_directions.
CASE board ofs(1).
WHEN blank_hidden.
PERFORM cell_floodfill USING ofs.

WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.

WHEN blank_marked
OR 'a'
OR 'b'
OR 'c'
OR 'd'
OR 'e'
OR 'f'
OR 'g'
OR 'h'.
setcell endgame_bomb_missmark.

WHEN bomb_hidden.
setcell endgame_bomb_boom.
PERFORM game_lose.
ENDCASE.

ENDLOOP.
ENDFORM. "cell_open_eight_directions



*&---------------------------------------------------------------------*
*& Form game_lose
*&---------------------------------------------------------------------
FORM game_lose.

game = game_over.
ADD -1 TO b_left.
" >> show actual bombs
WHILE board(square2) CA '*abcdefghm'. " digit_marked blank_marked
ofs = sy-fdpos.
IF board ofs(1) = bomb_hidden. " if = '*'
setcell bomb_opened.
ELSE.
setcell endgame_bomb_missmark.
ENDIF.
ENDWHILE.

MESSAGE s000(su) WITH 'Game over'.
ENDFORM. "game_lose

*&---------------------------------------------------------------------*
*& Form game_ok
*&---------------------------------------------------------------------*
FORM game_ok.

game = game_win.
b_left = 0.
" >> show bombs
WHILE board(square2) CS bomb_hidden.
ofs = sy-fdpos.
setcell bomb_marked.
ENDWHILE.

MESSAGE s000(su) WITH 'You win!' .

CHECK game_size <> 'C'.

PERFORM high_scores_read.
PERFORM high_scores_update.
PERFORM high_scores_show.

ENDFORM. "game_ok


*&---------------------------------------------------------------------*
*& Form game_create
*&---------------------------------------------------------------------*
FORM game_create USING
value(sz) TYPE c
value(x) TYPE i
value(y) TYPE i
value(b) TYPE i.

DATA:
ofs TYPE i,
j TYPE i,
drop_cnt TYPE i,
drop_bombs TYPE c.
DATA:
prng TYPE REF TO cl_abap_random_int,
backgr TYPE c,
foregr TYPE c,
half TYPE i.


game_size = sz.
x_size = x.
y_size = y.
bomb_cnt = b.

CONCATENATE database_id_prefix game_size INTO database_id.

CLEAR:
game_time,
game_time1,
game_time2.

game = game_in.

PERFORM high_scores_read.
PERFORM high_scores_show.

CLEAR: board.

square = x_size * y_size.
IF bomb_cnt > square.
bomb_cnt = square. " limit bombs to 100%
ENDIF.
b_left = bomb_cnt.

rest = square - bomb_cnt. " empty places to invent

rdx = 2 x_size. " width left and right border
rdy = 2 y_size. " height top and button border

square2 = rdx * rdy.

IF square2 > 9999.
MESSAGE e000(su) WITH 'board too large (9999)'.
ENDIF.

" >> board[9999]'s used space
min = 1 1 * rdx. " topleft
max = square2 - rdx - 2. " bottomright
range = max - min 1.

" >> directions
REFRESH eight_directions.
eight_directions = -1 rdx * -1. APPEND eight_directions. " NW
eight_directions = 00 rdx * -1. APPEND eight_directions. " North
eight_directions = 1 rdx * -1. APPEND eight_directions. " NE
eight_directions = -1 rdx * 00. APPEND eight_directions. " W
eight_directions = 1 rdx * 00. APPEND eight_directions. " E
eight_directions = -1 rdx * 1. APPEND eight_directions. " SW
eight_directions = 00 rdx * 1. APPEND eight_directions. " S
eight_directions = 01 rdx * 1. APPEND eight_directions. " SE

" >> bomb placement

" >> speed optimization:
" if bombs < 50%, place bombs randomly
" if bombs > 50%, place spaces randomly

half = x_size * y_size DIV 2.
IF bomb_cnt < half.
drop_bombs = 'X'. " straight order
drop_cnt = bomb_cnt.
backgr = blank_hidden.
foregr = bomb_hidden.
ELSE.
drop_bombs = ' '. " reversed order
drop_cnt = rest.
backgr = bomb_hidden.
foregr = blank_hidden.
ENDIF.

" >> fill background
ofs = min.
DO range TIMES.
board ofs(1) = backgr.
ADD 1 TO ofs.
ENDDO.

" >> horizontal border
DO rdx TIMES.

ofs = sy-index - 1.
board ofs(1) = border.

ofs = square2 - sy-index .
board ofs(1) = border.
ENDDO.
" >> vertical border
DO y_size TIMES.
ofs = rdx * sy-index.
board ofs(1) = border.
ofs = sy-index * rdx rdx - 1.
board ofs(1) = border.
ENDDO.


" >> actual placement
DATA: seed TYPE i.
seed = cl_abap_random=>seed( ).


prng = cl_abap_random_int=>create(
seed = seed min = min max = max ).

DO drop_cnt TIMES.
DO.
ofs = prng->get_next( ).

CASE board ofs(1).
WHEN foregr OR border.
" skip used cells
WHEN OTHERS.
EXIT. " found unused (BG 1 2 3 4 5 6 7 8)
ENDCASE.
ENDDO.

board ofs(1) = foregr.

IF drop_bombs = 'X'.
" add 1 point to cells around
LOOP AT eight_directions.
j = ofs eight_directions.
CASE board j(1).
WHEN bomb_hidden OR border.

WHEN OTHERS.
board j(1) = board j(1) 1.
ENDCASE.
ENDLOOP.
ELSE.
" get 1 point from every bomb around
LOOP AT eight_directions.
j = ofs eight_directions.
CASE board j(1).
WHEN bomb_hidden.
board ofs(1) = board ofs(1) 1.
ENDCASE.
ENDLOOP.
ENDIF.
ENDDO.

" >> hide digits
TRANSLATE board(square2) USING '1A2B3C4D5E6F7G8H'.

ENDFORM. "game_create








*----------------------------------------------------------------------*
* CLASS my_cl_gui_html_viewer IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_my_gui_html_viewer IMPLEMENTATION.

METHOD constructor.
DATA: myevent_tab TYPE cntl_simple_events,
myevent TYPE cntl_simple_event.

CALL METHOD super->constructor(
parent = parent
uiflag = html_control->uiflag_noiemenu
).

myevent-appl_event = 'X'.
myevent-eventid = html_control->m_id_sapevent.
APPEND myevent TO myevent_tab.
myevent-eventid = html_control->m_id_navigate_complete.
APPEND myevent TO myevent_tab.

CALL METHOD html_control->set_registered_events(
events = myevent_tab
).

SET HANDLER me->on_sapevent FOR html_control.

ENDMETHOD. "constructor

" >> HTML callback event
METHOD on_sapevent. " arguments: action, query_table[]
DATA: param LIKE LINE OF query_table.
DATA: cell_ofs TYPE i.


READ TABLE query_table WITH KEY name = 'ID' INTO param.
IF sy-subrc EQ 0. cell_ofs = param-value. ENDIF.

READ TABLE query_table WITH KEY name = 'TIME' INTO param.
IF sy-subrc EQ 0. game_time = param-value. ENDIF.

CASE action.

WHEN 'click'. " left-click
CHECK game = game_in.
PERFORM cell_open USING cell_ofs.
IF rest <= 0 AND game = game_in.
PERFORM game_ok.
ENDIF.
CALL METHOD me->html_board_update( ).

WHEN 'mouseup'. " right-click
CHECK game = game_in.
PERFORM cell_mark USING cell_ofs.
CALL METHOD me->html_board_update( ).

WHEN 'newgame'.
PERFORM game_create USING game_size x_size y_size bomb_cnt.
PERFORM html_show.

WHEN 'switch'.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
PERFORM game_print_abap.
ENDCASE.

ENDMETHOD. "on_sapevent

" >> transport board[]'s changes (saved in cells2update[]), to HTML
METHOD html_board_update.
DATA: ofs TYPE i, new TYPE i, len TYPE i, end TYPE i.
DATA: buf TYPE string.
DATA: jsline LIKE LINE OF js.

" >> convert cells2update[] to plain string
CONCATENATE LINES OF cells2update INTO buf SEPARATED BY '|'.
CONDENSE buf NO-GAPS.

" >> convert plain string to JavaScript code
" and pack it to HTML_VIEWER's compatible table
ofs = 0.
end = STRLEN( buf ).

WHILE ofs < end.
new = ofs 249. " 255 - strlen ( b =""; ) is 249

IF new > end. "
len = end - ofs.
ELSE.
len = 249.
ENDIF.

CONCATENATE 'b ="' buf ofs(len) '";' INTO jsline.
APPEND jsline TO js.

ofs = ofs len.
ENDWHILE.


CONCATENATE 'updateCells(' game ',"' b_left 1 '")' INTO jsline.
APPEND jsline TO js.

" >> actual transfer
CALL METHOD me->set_script( script = js[] ).
CALL METHOD me->execute_script( ).


" >>
REFRESH js.
REFRESH cells2update.

ENDMETHOD. "html_board_update

ENDCLASS. "cl_my_gui_html_viewer IMPLEMENTATION


*&---------------------------------------------------------------------*
*& Form html_create
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->S text
*----------------------------------------------------------------------*
FORM html_create TABLES html.
DATA: html_str TYPE string, s TYPE string,
table1 TYPE TABLE OF char255 WITH HEADER LINE INITIAL SIZE 150.


IF 1 = 2.

" CALL FUNCTION 'WS_UPLOAD'
" EXPORTING
" filename = 'C:\SAP\game\source.html'
" filetype = 'ASC'
" TABLES
" data_tab = html[]
" EXCEPTIONS
" OTHERS = 1.
" CHECK sy-subrc EQ 0.
"
" CONCATENATE LINES OF html INTO html_str SEPARATED BY '~'.

ELSE.


" >> create html
CONCATENATE

''
''
''

'


''
'
'
'
'
''
' '
' '
' '
'
0
'
'
'
'
'
'
'
'
'switch to ABAP'
'
'
'
' href="SAPEVENT:click?dummy">SAPEVENT:click'
''
''


INTO html_str SEPARATED BY '~'.

ENDIF.

CONDENSE html_str.



" >> patch html with game parameters
DATA: xstr(4) TYPE c, ystr(4) TYPE c.
WRITE x_size TO xstr NO-GROUPING.
WRITE y_size TO ystr NO-GROUPING.

CONCATENATE 'DX=' xstr ',DY=' ystr ',BB="' b_left '";' INTO s.

REPLACE FIRST OCCURRENCE OF
''
IN html_str WITH s.

IF sy-subrc <> 0.
MESSAGE e000(su) WITH 'html template is broken'.
ENDIF.

" >> performance improvement: condense html to width 255,
" to reduce whitespaces sent to client

SPLIT html_str AT '~' INTO TABLE table1.

DATA: ofs TYPE i, len TYPE i, nex TYPE i.

REFRESH html.
ofs = 0.
LOOP AT table1.
len = STRLEN( table1 ).
CHECK len > 0.
nex = ofs len.

IF nex < 255.
html ofs(len) = table1.
ofs = nex.
ELSE.
APPEND html.
html = table1.
ofs = len.
ENDIF.
ENDLOOP.
APPEND html.

ENDFORM. "html_create

*&---------------------------------------------------------------------*
*& Form load_graphics
*&---------------------------------------------------------------------*
* create GIF-images from scratch
*----------------------------------------------------------------------*
FORM html_load_gifs.


PERFORM html_load_gif USING 'open0.gif'
'R0lGODlhEAAQAIAAAHt7e729vSH5BAAAAAAALAAAAAAQABAAA'
'AIdhI9pwe0PnnRxzmphlniz7oGbmJGWeXmU2qAcyxQAOw=='
'' '' '' ''.

PERFORM html_load_gif USING 'open1.gif'
'R0lGODlhEAAQAJEAAAAA/3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIpjI9pwu0fnnRRAiCruxg 3lEbmFlX Z1eGjZaw6'
'EMGLsjLU7Tq9v9UwAAOw==' '' '' ''.

PERFORM html_load_gif USING 'open2.gif'
'R0lGODlhEAAQAJEAAAB7AHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAItjI9pwu0fnnSRgYsvtbm3ijkhU02jUIon ngbt3'
'4wMJFzR9sCnsm1lPrphI0CADs=' '' '' ''.

PERFORM html_load_gif USING 'open3.gif'
'R0lGODlhEAAQAJEAAHt7e729vf8AAAAAACH5BAAAAAAALAAAA'
'AAQABAAAAIshI9pwe0PnnQxiIsxZbmLVk0aE0pjUFrd5niseI'
'ETF5O0V6O3K89S6tMFHQUAOw==' '' '' ''.

PERFORM html_load_gif USING 'open4.gif'
'R0lGODlhEAAQAJEAAAAAe3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIujI9pwu0fnnSxgSsuoE5n3FTfNnKMV4anxoJC1b'
'bqhDLiU79Tau/5vZsFTcNGAQA7' '' '' ''.

PERFORM html_load_gif USING 'open5.gif'
'R0lGODlhEAAQAJEAAHsAAHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIpjI9pwu0fnnRRgItzq7mDzWATaF0jw3kmqYro6Q'
'rVFKcte5MntUO9UwAAOw==' '' '' ''.

PERFORM html_load_gif USING 'open6.gif'
'R0lGODlhEAAQAJEAAAB7e3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIsjI9pwu0fnnSRgYsvtTlvgU1NFYoC2ZUMmmorBz'
'gqK7sn3I5NG sm9AMGGwUAOw==' '' '' ''.

PERFORM html_load_gif USING 'open7.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIqjI9pwu0fnnRRgItzq7mDPTEYGI5MJZlneVGTuq'
'at 8CxYwtoSPO9zygAADs=' '' '' ''.

PERFORM html_load_gif USING 'open8.gif'
'R0lGODlhEAAQAIAAAHt7e729vSH5BAAAAAAALAAAAAAQABAAA'
'AIphI9pwe0PnnSRqdXqPdliXwXaJ37hRmVXWoZt96onuFpywk'
'6Sq8O9UwAAOw==' '' '' ''.

PERFORM html_load_gif USING 'blank.gif'
'R0lGODlhEAAQAJEAAHt7e729vf///wAAACH5BAAAAAAALAAAA'
'AAQABAAAAIqlI8ZyRdggpxUAiiqfnjXG3kTmIlWZ3KhSaZqya'
'LxKrYpyF36ruf8DygAADs=' '' '' ''.

PERFORM html_load_gif USING 'bombdeath.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e/8AAP///yH5BAAAAAAALAAAA'
'AAQABAAAAI0jI9pwu0fHgNSREnlFRR4zzUb933O5g1DmVlNup'
'YiydbuVIMMmrdjfnrRQL5KK4ipjCqOAgA7' '' '' ''.

PERFORM html_load_gif USING 'bombflagged.gif'
'R0lGODlhEAAQAKIAAAAAAHt7e729vf8AAP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAQABAAAAM8SLrc0nCJoIS92AZK8hjZVl'
'nfF3JkCWJil5osisFXmwnAOWJ5vOOAoM8VLBY1MqMR bsxJ5u'
'oVAqdWjcJADs=' '' ''.

PERFORM html_load_gif USING 'bombmisflagged.gif'
'R0lGODlhEAAQAKIAAAAAAHt7e729vf8AAP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAQABAAAANEGLrcKjDKGSYEVtQxJI6cBo'
'VAWQqhOA5mmaoCwBEuG1WXzHInVLU6Vgtm4gg/RJ0SiVsVOzf'
'QsRZFQWNSn9UjCTUzkwQAOw==' '' ''.

PERFORM html_load_gif USING 'bombrevealed.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e729vf///yH5BAAAAAAALAAAA'
'AAQABAAAAI0jI9pwu0fHgNSREnlFRR4zzUb933O5g1DmVlNup'
'YiydbuVIMMmrdjfnrRQL5KK4ipjCqOAgA7' '' '' ''.

PERFORM html_load_gif USING 'facedead.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAOAGLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU /0Aop2g2CsOmsA'
'PiHhz4qqhnRN63UpRVuPx21qKz0jtWZwWlsOwmq tGG6PWLKI'
'yY4qzWtPSW4kYXNBdWU8cEiIUzRxMoQqlFlCUg ZDZianZydm'
'gkAOw=='.

PERFORM html_load_gif USING 'facesmile.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAN/GLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU /0Aop2gaDyGlMw'
'aLvoUtpY 6UC7/YCwzSZyxwxnvaiyGUi qXFu9BW8PcblojKM'
'i8Tn111VCkNEZn2CXzxqOUlWLnsyjiqTiC0Pl5hemJsBmpyYC'
'QA7'.

PERFORM html_load_gif USING 'facesmile.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAN/GLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU /0Aop2gaDyGlMw'
'aLvoUtpY 6UC7/YCwzSZyxwxnvaiyGUi qXFu9BW8PcblojKM'
'i8Tn111VCkNEZn2CXzxqOUlWLnsyjiqTiC0Pl5hemJsBmpyYC'
'QA7'.

PERFORM html_load_gif USING 'facewin.gif'
'R0lGODlhGgAaAKIAAAAAAHt7AHt7e729vf//AP///wAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAOEKLrczkOUSau9M0rMr95DKI'
'4kyWRlWp6FCrxvypYvYdvxOI/A7eO6BSrU /0Aot2gaDyGlEW'
'YtEZAfkBLnLS6rV5RvTCMWwt/W8tigMoNaM/Ephy5Y8p9dCE6'
'izverFB4XUBwInZNVoWGd4mKhoc5SXouUjKTKphPQlcPnQ2cn'
'qGgoZ4JADs='.
ENDFORM. "html_load_gifs

*&---------------------------------------------------------------------*
*& Form create_gif
*&---------------------------------------------------------------------*
FORM html_load_gif USING
image_name TYPE c
s1 TYPE c
s2 TYPE c
s3 TYPE c
s4 TYPE c
s5 TYPE c
s6 TYPE c.

DATA: gif_size TYPE i,
gif_base64 TYPE string,
gif_binary TYPE xstring,
gif_binary_table TYPE TABLE OF w3mime.

CONCATENATE s1 s2 s3 s4 s5 s6 INTO gif_base64.

CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = gif_base64
IMPORTING
bindata = gif_binary
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.

PERFORM xstring_to_table
TABLES gif_binary_table
USING gif_binary
CHANGING gif_size.

CALL METHOD html_control->load_data
EXPORTING
url = image_name
type = 'image'
subtype = 'gif'
size = gif_size
CHANGING
data_table = gif_binary_table
EXCEPTIONS
dp_invalid_parameter = 1
dp_error_general = 2
cntl_error = 3
OTHERS = 4.
ENDFORM. "html_load_gif


*---------------------------------------------------------------------*
* FORM XSTRING_TO_TABLE *
*---------------------------------------------------------------------*
* convert xstring to xtable[255]
*---------------------------------------------------------------------*
FORM xstring_to_table
TABLES table1
USING buffer TYPE xstring
CHANGING binary_size TYPE i.

DATA: rows TYPE i, pos TYPE i.
FIELD-SYMBOLS: TYPE x.

ASSIGN COMPONENT 0 OF STRUCTURE table1 TO TYPE 'X'.
binary_size = XSTRLEN( buffer ).
rows = ( binary_size 255 - 1 ) DIV 255.
DO rows TIMES.
= buffer pos.
pos = pos 255.
APPEND table1.
ENDDO.
ENDFORM. "xstring_to_table


*&---------------------------------------------------------------------*
*& Form html_show
*&---------------------------------------------------------------------*
FORM html_show.
DATA: doc_url(80),
html TYPE TABLE OF w3html INITIAL SIZE 150.

PERFORM html_create TABLES html.

CALL METHOD html_control->load_data(
IMPORTING assigned_url = doc_url
CHANGING data_table = html
EXCEPTIONS
dp_invalid_parameter = 1
dp_error_general = 2
cntl_error = 3
OTHERS = 4
).

CALL METHOD html_control->show_url( url = doc_url ).

ENDFORM. "html_show






*---------------------------------------------------------------------*
* FORM high_scores_read *
*---------------------------------------------------------------------*
FORM high_scores_read.
REFRESH high_scores.
IMPORT lines = high_scores[] FROM DATABASE indx(st) ID database_id.
ENDFORM. "high_scores_read


*---------------------------------------------------------------------*
* FORM high_scores_show *
*---------------------------------------------------------------------*
FORM high_scores_show.
DATA: s(6) TYPE c, line TYPE c.
FIELD-SYMBOLS: TYPE c, TYPE c.

DO 9 TIMES.
line = sy-index.
CONCATENATE 'hs2_' line INTO s.
ASSIGN (s) TO .
CONCATENATE 'hs3_' line INTO s.
ASSIGN (s) TO .
READ TABLE high_scores INDEX sy-index.
IF sy-subrc EQ 0.
= high_scores-user.
= high_scores-time.
ELSE.
CLEAR: , .
ENDIF.
ENDDO.
ENDFORM. "high_scores_show



*---------------------------------------------------------------------*
* FORM high_scores_update *
*---------------------------------------------------------------------*
FORM high_scores_update.

high_scores-user = sy-uname.
WRITE game_time TO high_scores-time RIGHT-JUSTIFIED.

INSERT high_scores INTO TABLE high_scores[].

LOOP AT high_scores FROM 10.
DELETE high_scores INDEX sy-tabix.
ENDLOOP.

EXPORT lines = high_scores[] TO DATABASE indx(st) ID database_id.
ENDFORM. "high_scores_update
0

举报

相关推荐

0 条评论