*&---------------------------------------------------------------------*
*& Report ZMINE
*&
*&---------------------------------------------------------------------*
*& Das Spiel Minesweeper in SAP - ABAP realisieren.
*& Allerdings ohne Zeitabfrage, weil die sehr vom Server und dessen Last abhängt
*& Daher kann eine objektive Zeitmessung nicht erfolgen
*& COPYRIGHT Markus Völker - [email]mgv@gmx.de[/email]
*&---------------------------------------------------------------------*
REPORT zmine.
*Anlegen der Variablen für das Minenfeld und den Zugriff darauf (Workarray)
*sowie des eigentlichen Spielfeldes
*******
TYPES:
*******
BEGIN OF tt_minefield,
1 TYPE c,
2 TYPE c,
3 TYPE c,
4 TYPE c,
5 TYPE c,
6 TYPE c,
7 TYPE c,
8 TYPE c,
9 TYPE c,
END OF tt_minefield.
*******
TYPES: tt_minefield_ty TYPE STANDARD TABLE OF tt_minefield
*******
WITH NON-UNIQUE DEFAULT KEY.
******
DATA:
******
it_minefield TYPE tt_minefield_ty , "das Minenfeld
wa_minefield TYPE LINE OF tt_minefield_ty, "der Zugriff darauf
blinder TYPE tt_minefield_ty, "verdeckt das Minenfeld
wa_blinder TYPE LINE OF tt_minefield_ty, "und zugriff
result TYPE string, "ergebnisfeld der Blindtabelle zum löschen der Leerzeichen
zeile TYPE i, "angabe der aktuell zu durchlaufenden Zeile
spalte TYPE i, "angabe der aktuell zu durchlauifenden spalte
counter TYPE i, "Hilfs-zähl-variable
x TYPE i, "x-Achse
tempx type i, "Variable um die WErte x -1 und x+1 aufzunehmen
y TYPE i, "y-Achse
z Type i, "temporäre Variable zur definition des Minenfeldes
substance TYPE c, "Inhalt des Angeklickten Feldes
temp_substance TYPE c "Übergabe des gefundenen Inhalts
.
***************
FIELD-SYMBOLS:
***************
<mine_line> TYPE LINE OF tt_minefield_ty, "Linie eines Minenfeldes
<blinder_line> TYPE LINE OF tt_minefield_ty, "Linie der blindertabelle
<blinder_content> TYPE c, "Inhalt einer Zelle der Blindertabelle
<content> TYPE c "inhalt der Spalten einer Zeile
.
***************************
* Funktionen *
***************************
include z_mine_functions. "Funktionen zum setzen, finden und holen von Werten aus ITs
***************************
*****************
INITIALIZATION.
*****************
*Belege das Minenfeld mit Minen
include z_build_minefield.
*Belege Minenfeld mit Zahlen um die Minen
include z_minefield.
*Belege das Blind-Feld mit #
PERFORM fill_table USING '#'
CHANGING blinder.
* LOOP AT blinder ASSIGNING <blinder_line>.
* DO.
* ASSIGN COMPONENT sy-index OF STRUCTURE <blinder_line> TO <blinder_content>.
* IF sy-subrc <> 0. EXIT. ENDIF.
* <blinder_content> = '#'.
* ENDDO.
* ENDLOOP.
**********************
START-OF-SELECTION.
**********************
*erste AUSGABE des Blindfeldes
LOOP AT blinder ASSIGNING <blinder_line>.
CONCATENATE
<blinder_line>-1 <blinder_line>-2 <blinder_line>-3
<blinder_line>-4 <blinder_line>-5 <blinder_line>-6
<blinder_line>-7 <blinder_line>-8 <blinder_line>-9
INTO result.
WRITE: / result.
ENDLOOP.
***************************************************************************************************
* Bei jeder Feldauswahl wird in at line-selection der aktuelle X und Y Wert des Cursors abgefragt *
***************************************************************************************************
AT LINE-SELECTION.
* sollte der Anwender die F3 Taste benutzt haben und erneut aussuchen muss das Programm trotzdem
* abgebrochen werden.
IF substance = 'X'.
LEAVE PROGRAM.
ENDIF.
* da es nicht mehr als 20 subscreens geben darf wird der Index bei 15 zurueckgesetzt
IF sy-lsind > 2.
sy-lsind = 2.
ENDIF.
* Holen von X und Y
GET CURSOR LINE y OFFSET x.
* Für die korrekt umrechnung in Koordinaten muss Y-2 und X+1 gerechnet werden
IF sy-lsind = 1.
y = y - 2.
ENDIF.
x = x + 1.
* Abfrage was sich auf der geklickten Stelle befindet und schreibe das in Blinder
PERFORM get_attr USING it_minefield x y
CHANGING substance.
PERFORM set_attr USING x y substance
CHANGING blinder.
**********************************************************************************
* wenn auf der geklickten Stelle eine 0 steht, dann sollen alle 8 Felder drumrum *
* auch freigelegt werden, da bei einer 0 keine Mine dort sein kann *
* REKURSIV werden alle anderen Felder drumrum auch freigelegt *
**********************************************************************************
IF substance = '0'.
PERFORM copy_all_8 USING x y x y.
ENDIF.
************************************************************************************************
* wenn weder eine 0 noch eine Mine gefunden wurde, dann prüfe ob gewonnen wurde und stelle *
* einfach die Tabelle blinder dar. *
************************************************************************************************
IF substance <> 'X'.
z = 0.
LOOP AT blinder ASSIGNING <blinder_line>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <blinder_line> TO <content>.
IF sy-subrc <> 0. EXIT. ENDIF.
IF <content> = '#'.
z = z + 1.
ENDIF.
ENDDO.
ENDLOOP.
* ES GIBT NUR NOCH DIE MINEN, DAS SPIEL IST GEWONNEN!
IF z = 9.
WRITE: / 'Herzlichen Glückwunsch! Sie haben gewonnen!'.
WRITE: /,/,/.
substance = 'X'.
HIDE: substance.
ENDIF.
* Gebe die Tabelle Blinder aus und warte auf Eingaben
LOOP AT blinder ASSIGNING <blinder_line>.
CONCATENATE
<blinder_line>-1 <blinder_line>-2 <blinder_line>-3
<blinder_line>-4 <blinder_line>-5 <blinder_line>-6
<blinder_line>-7 <blinder_line>-8 <blinder_line>-9
INTO result.
WRITE: / result.
ENDLOOP.
* CHEAT zum testen... :D
******** WRITE: / 'CHEAT': , / , / , / , /.
********
******** LOOP AT it_minefield INTO wa_blinder.
******** WRITE: /
******** wa_blinder-1,
******** wa_blinder-2,
******** wa_blinder-3,
******** wa_blinder-4,
******** wa_blinder-5,
******** wa_blinder-6,
******** wa_blinder-7,
******** wa_blinder-8,
******** wa_blinder-9
******** .
******** ENDLOOP.
ELSE.
* Wenn X gefunden wurde, soll das Minenfeld ausgegeben werden und das Spiel beendet werden.
WRITE: / 'Leider haben sie das Spiel verloren!'.
WRITE: / , / .
LOOP AT it_minefield ASSIGNING <blinder_line>.
CONCATENATE
<blinder_line>-1 <blinder_line>-2 <blinder_line>-3
<blinder_line>-4 <blinder_line>-5 <blinder_line>-6
<blinder_line>-7 <blinder_line>-8 <blinder_line>-9
INTO result.
WRITE: / result.
ENDLOOP.
HIDE: substance.
ENDIF.