在SAP GUI中玩扫雷小游戏
在GUI中玩扫雷小游戏
ABAP代码:
*&---------------------------------------------------------------------* *& Report ZTEST_GAME001 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZTEST_GAME001 NO STANDARD PAGE HEADING LINE-SIZE 125. INCLUDE <icon>.CONSTANTS:" >> board cell valuesblank_hidden TYPE c VALUE '0',blank_marked TYPE c VALUE 'm',blank_opened TYPE c VALUE '.',bomb_hidden TYPE c VALUE '*',bomb_marked TYPE c VALUE 'M',bomb_opened TYPE c VALUE '&',endgame_bomb_boom TYPE c VALUE 'X',endgame_bomb_missmark TYPE c VALUE '@',border TYPE c VALUE '#'," >> game stategame_in VALUE '1',game_over VALUE '2',game_win VALUE '3'.DATA:board(9999) TYPE c, " 2D board, x_size * y_size + bordersofs TYPE i, " board[ofs] = cell unique IDmin TYPE i, " board[min] .. board[max]max TYPE i,rdx TYPE i, " = 2 + width of boardrdy TYPE i, " = 2 + height of boardsquare TYPE i, " = x_size * y_size = visible areasquare2 TYPE i, " = rdx * rdy = visible area + borderrange TYPE i, " = max - min + 1rest TYPE i, " = square - bomb_cnt = empty cells to inventgame TYPE c, " gamestate = 1,2,3game_size TYPE c, " B=Beginner, I=Interm, E=Expert, C=Customgame_time(5) TYPE c, " secondsb_left(4) TYPE c. " unmarked bombs left" >> eight directions: North, South, East, West, NE, NW, SE, SW DATA: eight_directions TYPE TABLE OF i INITIAL SIZE 8 WITH HEADER LINE ." >> cells2update list, to track board[] changes TYPES:BEGIN OF celltype,offset(4) TYPE c,color TYPE c,END OF celltype. DATA: cells2update TYPE TABLE OF celltype INITIAL SIZE 1000 WITH HEADER LINE." >> misc CONSTANTS:x_ofs TYPE i VALUE 1,y_ofs TYPE i VALUE 5. DATA:game_time1 TYPE timestamp, " game begingame_time2 TYPE timestamp." >> high_scores CONSTANTS:database_id_prefix(21) TYPE c VALUE 'ABAPMINESWEEPERSCORES'. TYPES:BEGIN OF score_line,user LIKE sy-uname,time(5) TYPE c,END OF score_line.DATA:high_scores TYPE SORTED TABLE OF score_lineWITH UNIQUE KEY time WITH HEADER LINE,database_id LIKE indx-srtfd. " export/import to database ID" >> game difficulty SELECTION-SCREEN BEGIN OF BLOCK bl_game_difficulty.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (23) hstitle1. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS g1 RADIOBUTTON GROUP oneUSER-COMMAND radiogroup01. SELECTION-SCREEN: COMMENT (10) text1. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS g2 RADIOBUTTON GROUP one. SELECTION-SCREEN: COMMENT (12) text2. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS g3 RADIOBUTTON GROUP one. SELECTION-SCREEN: COMMENT (10) text3. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS g4 RADIOBUTTON GROUP one. SELECTION-SCREEN: COMMENT (10) text4. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: END OF BLOCK bl_game_difficulty." >> High Scores table SELECTION-SCREEN BEGIN OF BLOCK bl_high_scores.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (1) dummy1. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (23) hstitle2. SELECTION-SCREEN: END OF LINE.DEFINE displ_hsline.selection-screen: begin of line.selection-screen: comment (1) hs1_&1.selection-screen: comment (12) hs2_&1.selection-screen: comment (5) hs3_&1.selection-screen: end of line. END-OF-DEFINITION.SELECTION-SCREEN ULINE /1(20). displ_hsline 0. SELECTION-SCREEN ULINE /1(20). displ_hsline 1. displ_hsline 2. displ_hsline 3. displ_hsline 4. displ_hsline 5. displ_hsline 6. displ_hsline 7. displ_hsline 8. displ_hsline 9.SELECTION-SCREEN: END OF BLOCK bl_high_scores." >> Window: Custom Game DimensionsSELECTION-SCREEN BEGIN OF SCREEN 1001.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (12) txtcustw. PARAMETERS: x_size TYPE i DEFAULT '09'.SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (12) txtcusth. PARAMETERS: y_size TYPE i DEFAULT '09'. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT (12) txtcustb. PARAMETERS: bomb_cnt TYPE i DEFAULT '10'. SELECTION-SCREEN: END OF LINE.SELECTION-SCREEN END OF SCREEN 1001." >> modify board[ofs] and track changes DEFINE setcell.board+ofs(1) = &1.cells2update-offset = ofs.cells2update-color = &1.append cells2update.if game_time1 is initial.get time stamp field game_time1.endif. END-OF-DEFINITION.*----------------------------------------------------------------------* * CLASS cl_my_gui_html_viewer DEFINITION *----------------------------------------------------------------------* * Custom HTML contol *----------------------------------------------------------------------* CLASS cl_my_gui_html_viewer DEFINITION INHERITING FROMcl_gui_html_viewer.PUBLIC SECTION.METHODS: constructor IMPORTING parent TYPE REF TO cl_gui_container.METHODS: html_board_update.PRIVATE SECTION.METHODS: on_sapevent FOR EVENT sapevent OF cl_gui_html_viewerIMPORTING action query_table.DATA: js TYPE STANDARD TABLE OF char255 INITIAL SIZE 1000.ENDCLASS. "cl_my_gui_html_viewer DEFINITIONDATA:lo_dock TYPE REF TO cl_gui_docking_container,lo_cont TYPE REF TO cl_gui_container,html_control TYPE REF TO cl_my_gui_html_viewer,wnd_style TYPE i.INITIALIZATION.hstitle1 = ' :: GAME DIFFICULTY ::'.text1 = 'Beginner'.text2 = 'Intermediate'.text3 = 'Expert'.text4 = 'Custom'.txtcustw = 'Width'.txtcusth = 'Height'.txtcustb = 'Bombs'.hstitle2 = ' :: HIGH SCORES ::'.hs1_0 = '#'.hs2_0 = 'user'.hs3_0 = 'time'.hs1_1 = '1'.hs1_2 = '2'.hs1_3 = '3'.hs1_4 = '4'.hs1_5 = '5'.hs1_6 = '6'.hs1_7 = '7'.hs1_8 = '8'.hs1_9 = '9'." >> create controlswnd_style = cl_gui_control=>ws_thickframe + cl_gui_control=>ws_child.CREATE OBJECT lo_dockEXPORTINGrepid = sy-cprogdynnr = sy-dynnrratio = 80side = cl_gui_docking_container=>dock_at_rightname = 'DOCK_CONT'style = wnd_style.lo_cont = lo_dock.CREATE OBJECT html_controlEXPORTINGparent = lo_cont." >>PERFORM game_create USING 'B' x_size y_size bomb_cnt.PERFORM html_load_gifs.PERFORM html_show.AT LINE-SELECTION. " abap-mode, cmd 'PICK'ADD -1 TO sy-lsind.IF sy-lisel CS 'switch'.LEAVE LIST-PROCESSING.ELSE.CHECK game = game_in.PERFORM cell_get_clicked CHANGING ofs.CHECK ofs > 0.PERFORM cell_open USING ofs.IF rest <= 0 AND game = game_in.GET TIME STAMP FIELD game_time2.game_time = game_time2 - game_time1.PERFORM game_ok.ENDIF.PERFORM game_print_abap.ENDIF.AT PF09. " abap-mode, cmd 'MARK'ADD -1 TO sy-lsind.IF game = game_in.PERFORM cell_get_clicked CHANGING ofs.CHECK ofs > 0.PERFORM cell_mark USING ofs.PERFORM game_print_abap.ENDIF.AT SELECTION-SCREEN OUTPUT.IF lines( cells2update ) > 0." here: switch back from abap to htmlCALL 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 1001STARTING 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_markedOR '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 onlyWRITE 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 ORcol < 0 OR col > x_size.ofs = 0.ENDIF. ENDFORM. "cell_get_clickedDATA: 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 itselfsetcell 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 markedLOOP AT eight_directions.ofs = x + eight_directions.CASE board+ofs(1).WHEN bomb_markedOR blank_markedOR 'a' " digit_makedOR 'b' " ..OR 'c'OR 'd'OR 'e'OR 'f'OR 'g'OR 'h'.value = value - 1.ENDCASE.ENDLOOP." 3 >> check its EQnessCHECK value = 0." 4 >> here: opening is possible" 5 >> do openLOOP 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_markedOR '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 bombsWHILE board(square2) CA '*abcdefghm'. " digit_marked + blank_markedofs = 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 bombsWHILE 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 USINGVALUE(sz) TYPE cVALUE(x) TYPE iVALUE(y) TYPE iVALUE(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 inventrdx = 2 + x_size. " width + left and right borderrdy = 2 + y_size. " height + top and button bordersquare2 = rdx * rdy.IF square2 > 9999.MESSAGE e000(su) WITH 'board too large (9999)'.ENDIF." >> board[9999]'s used spacemin = 1 + 1 * rdx. " topleftmax = square2 - rdx - 2. " bottomrightrange = max - min + 1." >> directionsREFRESH eight_directions.eight_directions = -1 + rdx * -1. APPEND eight_directions. " NWeight_directions = 00 + rdx * -1. APPEND eight_directions. " Northeight_directions = +1 + rdx * -1. APPEND eight_directions. " NEeight_directions = -1 + rdx * 00. APPEND eight_directions. " Weight_directions = +1 + rdx * 00. APPEND eight_directions. " Eeight_directions = -1 + rdx * +1. APPEND eight_directions. " SWeight_directions = 00 + rdx * +1. APPEND eight_directions. " Seight_directions = 01 + rdx * +1. APPEND eight_directions. " SE" >> bomb placement" >> speed optimization:" if bombs < 50%, place bombs randomly" if bombs > 50%, place spaces randomlyhalf = x_size * y_size DIV 2.IF bomb_cnt < half.drop_bombs = 'X'. " straight orderdrop_cnt = bomb_cnt.backgr = blank_hidden.foregr = bomb_hidden.ELSE.drop_bombs = ' '. " reversed orderdrop_cnt = rest.backgr = bomb_hidden.foregr = blank_hidden.ENDIF." >> fill backgroundofs = min.DO range TIMES.board+ofs(1) = backgr.ADD 1 TO ofs.ENDDO." >> horizontal borderDO rdx TIMES.ofs = sy-index - 1.board+ofs(1) = border.ofs = square2 - sy-index .board+ofs(1) = border.ENDDO." >> vertical borderDO y_size TIMES.ofs = rdx * sy-index.board+ofs(1) = border.ofs = sy-index * rdx + rdx - 1.board+ofs(1) = border.ENDDO." >> actual placementDATA: 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 cellsWHEN 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 aroundLOOP 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 aroundLOOP 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 digitsTRANSLATE 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 = parentuiflag = 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 eventMETHOD 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-clickCHECK 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-clickCHECK 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 HTMLMETHOD 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 stringCONCATENATE 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 tableofs = 0.end = strlen( buf ).WHILE ofs < end.new = ofs + 249. " 255 - strlen ( b+=""; ) is 249IF 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 transferCALL METHOD me->set_script( script = js[] ).CALL METHOD me->execute_script( )." >>REFRESH js.REFRESH cells2update.ENDMETHOD. "html_board_updateENDCLASS. "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 htmlCONCATENATE'<html><head>''<meta http-equiv="content-type" content="text/html">''<style type="text/css">''* { font: bold 12px sans-serif}''span { position: absolute; width: 16px; height: 16px;'' font-size: 6pt; background: url("blank.gif")}''div { background: silver; margin: 5px 0;'' text-align: center; border: 2px inset white}''td { text-align: center; padding: 0}''td div{height: 24px; width: 30px; margin: 0;'' padding: 3px; border: 1px gray solid}''#wMain{position: absolute; padding: 0 8px;'' border: 2px outset white}''#wTool{height: 34px}''</style>''<script>''var DX=10, DY=10, BB=98,'' game=1, tID, tm=0, mouse_left=0, mouse_right=2,'' images=[], SZ=16, x, y, b="",'' imagesInfo = ['' "blank *0ABCDEFGH",'' "bombdeath X", "bombrevealed &",'' "bombmisflagged @", "bombflagged mMabcdefgh",'' "open1 1", "open2 2", "open3 3",'' "open4 4", "open5 5", "open6 6",'' "open7 7", "open8 8", "open0 ."''];''/*VARIABLES_INITIALIZATION_HERE_DONT_DELETE*/''function init(){'' c1.innerText = BB;'' c2.onclick = abapHandler("IMG" , mouse_left, "newgame");'' document.onclick = abapHandler("SPAN", mouse_left, "click");'' document.οnmοuseup= abapHandler("SPAN", mouse_right,"mouseup");'' var p, w = DX*SZ+4; var h = DY*SZ+4;'' setSize(wBrd, w, h);'' setSize(wMain, w+20);'' map(imagesInfo, function(x){'' map((p = x.split(" "))[1].split(""),'' function(ch){images[ch]=p[0]+".gif"})}'' )''}''function updateCells(game_state, bomb_left){'' game = game_state; c1.innerText = bomb_left;'' var x, i, seq = b.split("|"); b = "";'' for(i=0;i<seq.length;i++)'' if (x=seq[i]) with(document.getElementById("x"+x.slice(0,-1)))'' style.backgroundImage = "url("+images[x.slice(-1)]+")";'' if (game==2) {clearTimeout(tID); c2.src = "facedead.gif"}'' if (game==3) {clearTimeout(tID); c2.src = "facewin.gif" }''}''function abapHandler(tag, mouse_button, action){'' return('' function(){'' var ev = window.event, obj = ev.srcElement;'' if (obj.nodeName == tag && ev.button==mouse_button) {'' tID = tID ? tID : setTimeout("onTimer()", 1000);'' callback.href ='' "SAPEVENT:"+action+"?ID="+obj.id.slice(1)+"&TIME="+tm;'' callback.click();'' }'' }'' )''}''function onTimer(){'' c3.innerText = ++tm;'' tID = (game==1) ? setTimeout("onTimer()", 1000) : tID;''}''function setSize(obj, w, h){'' obj.style.width = w;'' if (h) obj.style.height = h;''}''function map(list, func){'' var a = new Array(list.length);'' for (var i=0;i<list.length;i++) a[i]=func(list[i],i);'' return a;''}''</script></head>''<body οnlοad="init()">''<div id=wMain>''<div id=wTool><table border=0 id=wHdr>''<tr>'' <td width=34px><div id=c1>0</div></td>'' <td width=100%><img id=c2 src="facesmile.gif"></td>'' <td width=34px><div id=c3>0</div></td>''</tr></table></div>''<div id=wBrd>''<script>'' for(y=0;y<DY;y++) for(x=0;x<DX;x++) document.write('' "<span id=x"+((y+1)*(DX+2)+x+1)+" style=\"left:"'' +(10+SZ*x)+"px;top:"+(52+SZ*y)+"px;\"></span>")''</script>''</div>''<div><a id=btnSwitch href="SAPEVENT:switch?0">''switch to ABAP</a>''</div></div>''<a id=callback style="display:none"'' href="SAPEVENT:click?dummy">SAPEVENT:click</a>''</body>''</html>'INTO html_str SEPARATED BY '~'.ENDIF.CONDENSE html_str." >> patch html with game parametersDATA: 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'/*VARIABLES_INITIALIZATION_HERE_DONT_DELETE*/'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 clientSPLIT 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 USINGimage_name TYPE cs1 TYPE cs2 TYPE cs3 TYPE cs4 TYPE cs5 TYPE cs6 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'EXPORTINGb64data = gif_base64IMPORTINGbindata = gif_binaryEXCEPTIONSOTHERS = 1.CHECK sy-subrc EQ 0.PERFORM xstring_to_tableTABLES gif_binary_tableUSING gif_binaryCHANGING gif_size.CALL METHOD html_control->load_dataEXPORTINGurl = image_nametype = 'image'subtype = 'gif'size = gif_sizeCHANGINGdata_table = gif_binary_tableEXCEPTIONSdp_invalid_parameter = 1dp_error_general = 2cntl_error = 3OTHERS = 4. ENDFORM. "html_load_gif*---------------------------------------------------------------------* * FORM XSTRING_TO_TABLE * *---------------------------------------------------------------------* * convert xstring to xtable[255] *---------------------------------------------------------------------* FORM xstring_to_tableTABLES table1USING buffer TYPE xstringCHANGING binary_size TYPE i.DATA: rows TYPE i, pos TYPE i.FIELD-SYMBOLS: <fs> TYPE x.ASSIGN COMPONENT 0 OF STRUCTURE table1 TO <fs> TYPE 'X'.binary_size = xstrlen( buffer ).rows = ( binary_size + 255 - 1 ) DIV 255.DO rows TIMES.<fs> = 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(IMPORTINGassigned_url = doc_urlCHANGINGdata_table = htmlEXCEPTIONSdp_invalid_parameter = 1dp_error_general = 2cntl_error = 3OTHERS = 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: <fs1> TYPE c, <fs2> TYPE c.DO 9 TIMES.line = sy-index.CONCATENATE 'hs2_' line INTO s.ASSIGN (s) TO <fs1>.CONCATENATE 'hs3_' line INTO s.ASSIGN (s) TO <fs2>.READ TABLE high_scores INDEX sy-index.IF sy-subrc EQ 0.<fs1> = high_scores-user.<fs2> = high_scores-time.ELSE.CLEAR: <fs1>, <fs2>.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
效果:
在SAP GUI中玩扫雷小游戏相关推荐
- C语言简单的键盘玩扫雷小游戏(完结)
1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() { //随机数种子 srand((unsigned ...
- 使用C语言写一个扫雷小游戏
前言 相信扫雷游戏小伙伴们肯定都玩过吧,学习了C语言中的数组.函数等基础内容之后就可以自己写一个简易的扫雷小游戏了,今天就我写扫雷小游戏的过程及思路写一篇博客,希望大家看完我的博客能有所收获. 软件及 ...
- 如何开发一个扫雷小游戏?
如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...
- 用C语言实现一个简单的扫雷小游戏(附全代码及教程)
本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...
- C语言实现扫雷小游戏 纯小白 非黑窗口
C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...
- C/C++语言扫雷小游戏(eaxyX图形库的应用)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.扫雷的玩法,以及实现功能介绍 二.代码实现 1.引入库 2.宏定义部分 3.初始化游戏界面 4.加载图片 5.绘制 ...
- 用c语言实现扫雷小游戏。
相信小伙伴在学习c语言的时候想做一些小趣事,下面就是用c语言来实现一个扫雷小游戏,不过是简单的实现扫雷(只是通过数组的方式来实现),适合新手学习. 我用的是vs敲的这个代码,大家可以用vs运行(可能有 ...
- c语言字符游动程序,C语言实现扫雷小游戏详解
本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 一.实现功能 首先显示一个小菜单,选择是否玩游戏.当用户选择退出时,程序运行结束,当用户选择玩游戏时,将提示用户输入扫雷位 ...
- Python【小游戏合集】之重温童年最爱的扫雷小游戏
导语: 哈喽吖!有许多铁汁们私信小编说用Python自行制作小游戏 之后简直就是上头了~让wo多出一点小游戏合集(看来铁汁们跟小编一样都酷爱游戏) 有求必应~小游戏立刻安排上啦~~(扫雷真的是 ...
最新文章
- rust腐蚀 木制窗户怎么修_装修窗帘怎么选最划算?记住这3点,至少能省大几千...
- Windows禁止启动某个程序!偷偷禁止,别人就打不开。。。比如,微信 LOL 吃鸡 爱奇艺
- python有多态特性吗_Python:多态、协议和鸭子类型
- 73款阿里巴巴开源软件详解
- 搜出来的文本:从MCMC到模拟退火
- 深入理解Cache工作原理
- Linux系统里让vim支持markdown格式的语法高亮
- 第一站---大连---看海之旅
- 一道PHP面试题,求两个文件的相对路径
- tomcat 404错误 原因_软件测试人员定位bug原因的10大妙招分享
- Leetcode 300.最长上升子序列(求长度)
- 网易云音乐下载|网易云音乐电脑版下载
- win10保护色设置及还原
- LibreELEC(kodi)安装
- 底量超顶量超级大黑马指标源码_清华女教授忠言:只要出现“底量超顶量”走势,后期必有暴走趋势...
- qcloud windows rtx cpu 100%定位
- 华为机试真题 C++ 实现【乱序整数序列两数之和绝对值最小】
- 分享一个jQuery的自动客户端本地保存插件Sisyphus.js - 帮助你自动保存用户输入内容...
- 520快到了,给你对象写个怦然心动吧
- 开源按键组件Multi_Button的使用,含测试工程