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 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 '&',
"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 C VALUE 'X',
ENDGAME_BOMB_MISSMARK TYPE C VALUE '@',
BORDER TYPE C VALUE '#',
" >> game state
GAME_IN VALUE '1',
GAME_OVER VALUE '2',
GAME_WIN VALUE '3'.
DATA:
BOARD(9999) TYPE 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(5) TYPE 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 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 begin
GAME_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
