abap 扫雷游戏

 

*&---------------------------------------------------------------------*
*& Report  Z_TEST33
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Z_TEST33 NO STANDARD PAGE HEADING LINE-SIZE 125.
"REPORT  zminesweeper NO STANDARD PAGE HEADING LINE-SIZE 125.
* ------------------------------------------------------------
* ABAP Minesweeper
* (c) Andrey Timofeev
* http://mrand.name/sap-abap
* license: free, "as is"
* ------------------------------------------------------------
* Installation: compile and run.
*   (for SAP 4.x, use http://mrand.name/sap-abap/sweeper4.txt)
* ------------------------------------------------------------
*  v1.0    2009.04.01
*     initial release
*


INCLUDE <ICON>.


CONSTANTS:
" >> board cell values
   BLANK_HIDDEN  TYPE VALUE '0',
   BLANK_MARKED  TYPE VALUE 'm',
   BLANK_OPENED  TYPE VALUE '.',

   BOMB_HIDDEN   TYPE VALUE '*',
   BOMB_MARKED   TYPE VALUE 'M',
   BOMB_OPENED   TYPE VALUE '&',

   "digit_hidden TYPE c VALUE 'A', "  A B C D E F G H
   "digit_marked TYPE c VALUE 'a', "  a b c d e f g h
   "digit_opened TYPE c VALUE '1', "  1 2 3 4 5 6 7 8

   ENDGAME_BOMB_BOOM       TYPE VALUE 'X',
   ENDGAME_BOMB_MISSMARK   TYPE VALUE '@',
   BORDER                  TYPE VALUE '#',

" >> game state
   GAME_IN   VALUE '1',
   GAME_OVER VALUE '2',
   GAME_WIN  VALUE '3'.

DATA:
   BOARD(9999TYPE C,  " 2D board,  x_size * y_size + borders
   OFS         TYPE I,  " board[ofs] = cell unique ID
   MIN         TYPE I,  " board[min] .. board[max]
   MAX         TYPE I,
   RDX         TYPE I,  " = 2 + width  of board
   RDY         TYPE I,  " = 2 + height of board
   SQUARE      TYPE I,  " = x_size * y_size = visible area
   SQUARE2     TYPE I,  " =    rdx *    rdy = visible area + border
   RANGE       TYPE I,  " = max - min + 1
   REST        TYPE I,  " = square - bomb_cnt = empty cells to invent
   GAME        TYPE C,  " gamestate  = 1,2,3
   GAME_SIZE   TYPE C,  " B=Beginner, I=Interm, E=Expert, C=Custom
   GAME_TIME(5TYPE C" seconds
   B_LEFT(4)   TYPE C.  " unmarked bombs left

"  >> eight directions: North, South, East, West, NE, NW, SE, SW
DATA:  EIGHT_DIRECTIONS TYPE TABLE OF INITIAL SIZE WITH HEADER LINE .

" >> cells2update list, to track board[] changes
TYPES:
   BEGIN OF CELLTYPE,
      OFFSET(4TYPE C,
      COLOR TYPE C,
   END OF CELLTYPE.
DATA: CELLS2UPDATE TYPE TABLE OF CELLTYPE INITIAL SIZE 1000 WITH HEADER LINE.

" >> misc
CONSTANTS:
   X_OFS TYPE VALUE 1,
   Y_OFS TYPE VALUE 5.
DATA:
   GAME_TIME1 TYPE TIMESTAMP" game    begin
   GAME_TIME2 TYPE TIMESTAMP.


" >> high_scores
CONSTANTS:
   DATABASE_ID_PREFIX(21TYPE VALUE 'ABAPMINESWEEPERSCORES'.
TYPES:
   BEGIN OF SCORE_LINE,
      USER    LIKE SY-UNAME,
      TIME(5TYPE C,
   END OF SCORE_LINE.

DATA:
   HIGH_SCORES TYPE SORTED TABLE OF SCORE_LINE
        WITH 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-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT  (23) HSTITLE1.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
PARAMETERS G1 RADIOBUTTON GROUP ONE
        USER-COMMAND RADIOGROUP01.
SELECTION-SCREENCOMMENT (10) TEXT1.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
PARAMETERS G2 RADIOBUTTON GROUP ONE.
SELECTION-SCREENCOMMENT (12) TEXT2.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
PARAMETERS G3 RADIOBUTTON GROUP ONE.
SELECTION-SCREENCOMMENT (10) TEXT3.
SELECTION-SCREENEND OF LINE.


SELECTION-SCREENBEGIN OF LINE.
PARAMETERS G4 RADIOBUTTON GROUP ONE.
SELECTION-SCREENCOMMENT (10) TEXT4.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENEND OF BLOCK BL_GAME_DIFFICULTY.


" >> High Scores table
SELECTION-SCREEN BEGIN OF BLOCK BL_HIGH_SCORES.

SELECTION-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT  (1) DUMMY1.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT  (23) HSTITLE2.
SELECTION-SCREENEND OF LINE.

DEFINE DISPL_HSLINE.
  SELECTION-SCREENBEGIN OF LINE.
  SELECTION-SCREENCOMMENT  (1) HS1_&1.
  SELECTION-SCREENCOMMENT (12) HS2_&1.
  SELECTION-SCREENCOMMENT  (5) HS3_&1.
  SELECTION-SCREENEND 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-SCREENEND OF BLOCK BL_HIGH_SCORES.



" >> Window: Custom Game Dimensions

SELECTION-SCREEN BEGIN OF SCREEN 1001.

SELECTION-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT (12) TXTCUSTW.
PARAMETERS: X_SIZE TYPE I  DEFAULT '09'.

SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT (12) TXTCUSTH.
PARAMETERS: Y_SIZE TYPE I  DEFAULT '09'.
SELECTION-SCREENEND OF LINE.

SELECTION-SCREENBEGIN OF LINE.
SELECTION-SCREENCOMMENT (12) TXTCUSTB.
PARAMETERS: BOMB_CNT TYPE DEFAULT '10'.
SELECTION-SCREENEND 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 FROM          CL_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_VIEWER                  
IMPORTING ACTION QUERY_TABLE.     
DATA: JS TYPE STANDARD TABLE OF CHAR255 INITIAL SIZE 1000.

ENDCLASS.                    "cl_my_gui_html_viewer DEFINITION


DATA:     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 controls   WND_STYLE 
= CL_GUI_CONTROL=>WS_THICKFRAME + CL_GUI_CONTROL=>WS_CHILD.   

CREATE OBJECT LO_DOCK     
EXPORTING       REPID 
= SY-CPROG       DYNNR 
= SY-DYNNR       RATIO 
80       SIDE  
= CL_GUI_DOCKING_CONTAINER=>DOCK_AT_RIGHT       NAME  
'DOCK_CONT'       STYLE 
= WND_STYLE.   LO_CONT 

= LO_DOCK.   

CREATE OBJECT HTML_CONTROL     
EXPORTING       PARENT 
= 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 -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 <= 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 -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 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 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 TO OFS.     
NEW-LINE.   
ENDDO.   
WRITEAT X_OFS '' NO-GAP'    switch back   ' COLOR 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(OFSTYPE I.   
DATA: CH TYPE C.   CH 
= BOARD+OFS(1).   
CASE CH.     
WHEN BLANK_HIDDEN. SETCELL BLANK_MARKEDADD -TO B_LEFT.     
WHEN BLANK_MARKED. SETCELL BLANK_HIDDENADD +1 TO B_LEFT.     
WHEN BOMB_HIDDEN.  SETCELL BOMB_MARKED.  ADD -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 -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(OFSTYPE I.   
CASE BOARD+OFS(1).     
WHEN BLANK_HIDDEN.       
PERFORM CELL_FLOODFILL USING OFS.     
WHEN 'A'. SETCELL  '1'ADD -TO REST.     
WHEN 'B'. SETCELL  '2'ADD -TO REST.     
WHEN 'C'. SETCELL  '3'ADD -TO REST.     
WHEN 'D'. SETCELL  '4'ADD -TO REST.     
WHEN 'E'. SETCELL  '5'ADD -TO REST.     
WHEN 'F'. SETCELL  '6'ADD -TO REST.     
WHEN 'G'. SETCELL  '7'ADD -TO REST.     
WHEN 'H'. SETCELL  '8'ADD -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 DIV 2.   OFS 
1 + ROW ) * RDX + COL + 1.   
IF ROW < OR ROW > Y_SIZE OR      COL < 
OR COL > X_SIZE.     OFS 
0.   
ENDIF.
ENDFORM.                    "cell_get_clicked



DATA: FLOODFILL TYPE TABLE OF INITIAL SIZE 1000.

*&---------------------------------------------------------------------*
*&      Form  cell_flood_fill
*&---------------------------------------------------------------------*
*      open all adjacent empty cells
*----------------------------------------------------------------------*
FORM CELL_FLOODFILL USING VALUE(XTYPE I.   
DATA: OFS TYPE I.   OFS 

X + 00" cell itself   SETCELL BLANK_OPENED
ADD -TO REST.   

APPEND 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 -TO REST.           
APPEND OFS TO FLOODFILL.         
WHEN 'A'. SETCELL '1'ADD -TO REST.         
WHEN 'B'. SETCELL '2'ADD -TO REST.         
WHEN 'C'. SETCELL '3'ADD -TO REST.         
WHEN 'D'. SETCELL '4'ADD -TO REST.         
WHEN 'E'. SETCELL '5'ADD -TO REST.         
WHEN 'F'. SETCELL '6'ADD -TO REST.         
WHEN 'G'. SETCELL '7'ADD -TO REST.         
WHEN 'H'. SETCELL '8'ADD -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(XTYPE I.   
DATA: OFS TYPE I.   
DATAVALUE 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 -TO REST.       
WHEN 'B'. SETCELL '2'ADD -TO REST.       
WHEN 'C'. SETCELL '3'ADD -TO REST.       
WHEN 'D'. SETCELL '4'ADD -TO REST.       
WHEN 'E'. SETCELL '5'ADD -TO REST.       
WHEN 'F'. SETCELL '6'ADD -TO REST.       
WHEN 'G'. SETCELL '7'ADD -TO REST.       
WHEN 'H'. SETCELL '8'ADD -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 -TO B_LEFT.   
" >> show actual bombs   
WHILE BOARD(SQUARE2CA '*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(SUWITH 'Game over'.
ENDFORM.                                                    "game_lose


*&---------------------------------------------------------------------*
*&      Form  game_ok
*&---------------------------------------------------------------------*
FORM GAME_OK.   GAME 

= GAME_WIN.   B_LEFT 
0.   
" >> show bombs   
WHILE BOARD(SQUARE2CS BOMB_HIDDEN.     OFS 
= SY-FDPOS.     SETCELL BOMB_MARKED
.   
ENDWHILE.   

MESSAGE S000(SUWITH '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 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(SQUARE2USING '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-VALUEENDIF.     

READ TABLE QUERY_TABLE WITH KEY NAME =  'TIME' INTO PARAM.     
IF SY-SUBRC EQ 0.  GAME_TIME = PARAM-VALUEENDIF.     

CASE ACTION.       

WHEN 'click'.    " left-click         
CHECK GAME = GAME_IN.         
PERFORM CELL_OPEN USING CELL_OFS.         
IF REST <= 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 INEW TYPE I, LEN TYPE IEND 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 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       

'<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: 8px 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.onmouseup= 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 onload="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 parameters   
DATA: XSTR(4TYPE C, YSTR(4TYPE 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(SUWITH '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.   

DATAROWS TYPE I, POS TYPE I.   
FIELD-SYMBOLS:   <FS> TYPE X.   

ASSIGN COMPONENT OF STRUCTURE TABLE1 TO <FS> TYPE 'X'.   BINARY_SIZE 
XSTRLENBUFFER ).   
ROWS ( BINARY_SIZE + 255 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(      
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(STID DATABASE_ID.
ENDFORM.                    "high_scores_read


*---------------------------------------------------------------------*
*       FORM high_scores_show                                         *
*---------------------------------------------------------------------*
FORM HIGH_SCORES_SHOW.   
DATA: S(6TYPE CLINE TYPE C.   
FIELD-SYMBOLS: <FS1> TYPE C, <FS2> TYPE C.   

DO TIMES.     
LINE = SY-INDEX.     
CONCATENATE 'hs2_' LINE INTO S.     
ASSIGN (STO <FS1>.     
CONCATENATE 'hs3_' LINE INTO S.     
ASSIGN (STO <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(STID DATABASE_ID.
ENDFORM.                    "high_scores_update

 

posted @ 2017-11-15 15:00  以成Ronny  阅读(339)  评论(0)    收藏  举报