Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Form get_zufallszahl
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->IV_ZAHL_LIMIT text
*----------------------------------------------------------------------*
FORM get_zufallszahl USING iv_zahl_limit TYPE i.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = iv_zahl_limit
ran_int_min = 1
IMPORTING
ran_int = lv_zufalls_zahl
EXCEPTIONS
invalid_input = 2
OTHERS = 1.
ENDFORM. "get_zufallszahl
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZTS_WALDBRAND
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zts_waldbrand.
"! TODO Aus- und Eingabe in Prozent
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-t01.
PARAMETERS p_feuer TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK a.
SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-t02.
PARAMETERS p_wachs TYPE i DEFAULT 1.
SELECTION-SCREEN END OF BLOCK b.
SELECTION-SCREEN BEGIN OF BLOCK d WITH FRAME TITLE text-t04.
PARAMETERS p_aktion TYPE i DEFAULT 5.
SELECTION-SCREEN END OF BLOCK d.
SELECTION-SCREEN BEGIN OF BLOCK e WITH FRAME TITLE text-t05.
PARAMETERS p_laenge TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK e.
SELECTION-SCREEN BEGIN OF BLOCK f WITH FRAME TITLE text-t06.
PARAMETERS p_hoehe TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK f.
* DATENTYP | BEDEUTUNG |
*-----------|------------------|
* i | Ganze Zahl |
* f | Gleitpunktzahl |
* c | Textfeld |
*------------------------------|
CONSTANTS cv_frei(1) TYPE c VALUE '-'.
CONSTANTS cv_baum(1) TYPE c VALUE 'T'.
CONSTANTS cv_brennender_baum(1) TYPE c VALUE 'F'.
CONSTANTS cv_zahl_zwei TYPE i VALUE 2. "aufbau_wald
TYPES: BEGIN OF ty_merken,
zeile TYPE i,
spalte TYPE i,
wert(1) TYPE c,
END OF ty_merken.
*&---------------------------------------------------------------------*
*& Interne Tabellen *
*&---------------------------------------------------------------------*
DATA lt_wald_new TYPE STANDARD TABLE OF ty_merken. "Namenskonvention
DATA lt_wald_old TYPE STANDARD TABLE OF ty_merken. "Namenskonvention
*&---------------------------------------------------------------------*
*& Strukturen *
*&---------------------------------------------------------------------*
DATA ls_wald_new TYPE ty_merken. "Namenskonvention
DATA ls_wald_old TYPE ty_merken. "Namenskonvention
DATA ls_wald_old_chg TYPE ty_merken. "Namenskonvention
*&---------------------------------------------------------------------*
*& Variablen *
*&---------------------------------------------------------------------*
DATA lv_zufalls_zahl TYPE i.
DATA lv_zaehler_spalte TYPE i.
DATA lv_zaehler_zeile TYPE i.
DATA lv_zaehler_aktion TYPE n.
DATA lv_spalte_links TYPE i.
DATA lv_spalte_rechts TYPE i.
DATA lv_zeile_oben TYPE i.
DATA lv_zeile_unten TYPE i.
DATA lv_zeile_old TYPE i.
*&---------------------------------------------------------------------*
*& HAUPTPROGRAMM *
*&---------------------------------------------------------------------*
PERFORM initialisierung_wald.
DO p_aktion TIMES.
PERFORM zeitschritt_simulieren.
ENDDO.
*&---------------------------------------------------------------------*
*& UNTERPROGRAMME *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form initialize_wald
*&---------------------------------------------------------------------*
*& Startvorgang des Waldes
*&---------------------------------------------------------------------*
FORM initialisierung_wald.
lv_zaehler_aktion = 0.
* WRITE:/ lv_zaehler_aktion , '. Schritt: Einfügen des Waldes.'.
CLEAR lv_zaehler_aktion.
*Ursprünglichen Wald aufbauen
PERFORM aufbau_wald.
*Ausgabe
* PERFORM display_wald.
lt_wald_old = lt_wald_new.
CLEAR lt_wald_new.
ENDFORM. "starten_von_wald
*&---------------------------------------------------------------------*
*& Form zeitschritt_simulieren
*&---------------------------------------------------------------------*
* Iterationsschritt ausführen
*----------------------------------------------------------------------*
FORM zeitschritt_simulieren.
lv_zaehler_aktion = lv_zaehler_aktion + 1.
WRITE:/ lv_zaehler_aktion , '. Schritt: Stadium nach ' , lv_zaehler_aktion , ' Iteration.'.
WRITE:/ .
* Hier werden die weitern schritte ausgegeben
* Werte der alten Matrix übernehmen bzw. verändern wenn nötig
LOOP AT lt_wald_old INTO ls_wald_old.
IF ls_wald_old-wert = cv_frei.
PERFORM feldaenderung_bei_wert_leer.
ELSEIF ls_wald_old-wert = cv_baum.
PERFORM feldaenderung_bei_wert_baum.
ELSEIF ls_wald_old-wert = cv_brennender_baum.
PERFORM feldaenderung_bei_wert_feuer.
ENDIF.
ENDLOOP.
* Ausgabe
PERFORM display_wald.
ENDFORM. "zeitschritt_simulieren
*&---------------------------------------------------------------------*
*& Form feldaenderung_bei_wert_leer
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_leer.
* Entscheiden ob Baum wächst oder Feld leer bleibt (mit - oder " " aufgefüllt, je nachdem wie die vorgaben im Code sind)
PERFORM get_zufallszahl USING p_wachs.
IF lv_zufalls_zahl = 1.
PERFORM ls_wald_new_fuellen USING cv_baum ls_wald_old-spalte ls_wald_old-zeile.
ELSE.
PERFORM ls_wald_new_fuellen USING cv_frei ls_wald_old-spalte ls_wald_old-zeile.
ENDIF.
INSERT ls_wald_new INTO TABLE lt_wald_new.
CLEAR ls_wald_new.
ENDFORM. "feldaenderung_bei_wert_leer
*&---------------------------------------------------------------------*
*& Form feldaenderung_bei_wert_baum
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_baum.
* Umliegende Felder prüfen, ob brennend oder nicht.
PERFORM umliegende_felder_pruefen.
* Wenn kein brennender Baum umliegend, Feld unverändert.
IF ls_wald_new-wert <> cv_brennender_baum.
ls_wald_new = ls_wald_old.
ENDIF.
INSERT ls_wald_new INTO TABLE lt_wald_new.
CLEAR ls_wald_new.
ENDFORM. "feldaenderung_bei_wert_baum
*&---------------------------------------------------------------------*
*& Form umliegende_felder_und_tree_auf_fire_prüfen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Gibt das feuer an die umligenden Bäume weiter und testet ob
*& ein Baum verfügbar ist = Ob ein Baum da steht, ob er brennt und
*& ob er nicht brennt.
*&---------------------------------------------------------------------*
FORM umliegende_felder_pruefen.
* Links von dem Aktiven Feld prüfen
lv_spalte_links = ls_wald_old-spalte - 1.
READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_links zeile = ls_wald_old-zeile INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_brennender_baum.
PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
ENDIF.
* Rechts von dem Aktiven Feld prüfen
IF ls_wald_new-wert <> cv_brennender_baum.
lv_spalte_rechts = ls_wald_old-spalte + 1.
READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_rechts zeile = ls_wald_old-zeile INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_brennender_baum.
PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
ENDIF.
ENDIF.
* Über dem Aktiven Feld prüfen
IF ls_wald_new-wert <> cv_brennender_baum.
lv_zeile_oben = ls_wald_old-zeile + 1.
READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_oben INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_brennender_baum.
PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
ENDIF.
ENDIF.
* Unter dem aktuellen Feld prüfen
IF ls_wald_new-wert <> cv_brennender_baum.
lv_zeile_unten = ls_wald_old-zeile - 1.
READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_unten INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_brennender_baum.
PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
ENDIF.
ENDIF.
ENDFORM. "umliegende_felder_und_tree_auf_fire_prüfen
*&---------------------------------------------------------------------*
*& Form feldaenderung_bei_wert_feuer
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_feuer.
DATA lv_baum_bool TYPE abap_bool.
lv_baum_bool = abap_true.
lv_spalte_links = ls_wald_old-spalte + 1.
READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_links zeile = ls_wald_old-zeile INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_baum.
lv_baum_bool = abap_false.
ENDIF.
* Rechts vom Aktiven Feld prüfen
lv_spalte_rechts = ls_wald_old-spalte + 1.
READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_rechts zeile = ls_wald_old-zeile INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_baum.
lv_baum_bool = abap_false.
ENDIF.
* Über dem Aktiven Feld prüfen
lv_zeile_oben = ls_wald_old-zeile - 1.
READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_oben INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_baum.
lv_baum_bool = abap_false.
ENDIF.
* Unter dem Aktiven Feld prüfen
lv_zeile_unten = ls_wald_old-zeile + 1.
READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_unten INTO ls_wald_old_chg.
IF ls_wald_old_chg-wert = cv_baum.
lv_baum_bool = abap_false.
ENDIF.
IF lv_baum_bool = abap_true.
PERFORM ls_wald_new_fuellen USING cv_frei ls_wald_old-spalte ls_wald_old-zeile.
ELSE.
ls_wald_new = ls_wald_old.
ENDIF.
INSERT ls_wald_new INTO TABLE lt_wald_new.
CLEAR ls_wald_new.
ENDFORM. "feldändern_bei_wert_feuer
*&---------------------------------------------------------------------*
*& Form aufbau_wald
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM aufbau_wald.
DO p_hoehe TIMES.
lv_zaehler_zeile = lv_zaehler_zeile + 1.
* Abstand zum linken Rand
WRITE ' '.
DO p_laenge TIMES.
lv_zaehler_spalte = lv_zaehler_spalte + 1.
PERFORM get_zufallszahl USING cv_zahl_zwei.
IF lv_zufalls_zahl = 1.
p_feuer = 100 / p_feuer.
PERFORM get_zufallszahl USING p_feuer.
IF lv_zufalls_zahl = 1.
PERFORM ls_wald_new_fuellen USING cv_brennender_baum lv_zaehler_spalte lv_zaehler_zeile.
ELSE.
PERFORM ls_wald_new_fuellen USING cv_baum lv_zaehler_spalte lv_zaehler_zeile.
ENDIF.
ELSEIF lv_zufalls_zahl = 2.
PERFORM ls_wald_new_fuellen USING cv_frei lv_zaehler_spalte lv_zaehler_zeile.
ELSEIF lv_zufalls_zahl = 0.
p_feuer = p_feuer / 100.
ENDIF.
INSERT ls_wald_new INTO TABLE lt_wald_new.
ENDDO.
CLEAR lv_zaehler_spalte.
ENDDO.
ENDFORM. "aufbau_wald
*&---------------------------------------------------------------------*
*& Form ls_wald_new_fuellen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->VALUE text
* -->(1) text
*----------------------------------------------------------------------*
FORM ls_wald_new_fuellen USING iv_wert TYPE c iv_spalte TYPE i iv_zeile TYPE i.
ls_wald_new-wert = iv_wert.
ls_wald_new-spalte = iv_spalte.
ls_wald_new-zeile = iv_zeile.
ENDFORM. "ls_wald_new_fuellen
*&---------------------------------------------------------------------*
*& Form get_zufallszahl
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->IV_ZAHL_LIMIT text
*----------------------------------------------------------------------*
FORM get_zufallszahl USING iv_zahl_limit TYPE i.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = iv_zahl_limit
ran_int_min = 1
IMPORTING
ran_int = lv_zufalls_zahl
EXCEPTIONS
invalid_input = 2
OTHERS = 1.
ENDFORM. "get_zufallszahl
*&---------------------------------------------------------------------*
*& Form display_wald
*&---------------------------------------------------------------------*
* Ausgabe
*----------------------------------------------------------------------*
FORM display_wald.
LOOP AT lt_wald_new INTO ls_wald_new.
IF ls_wald_new-zeile > lv_zeile_old.
NEW-LINE.
WRITE ' '.
ENDIF.
IF ls_wald_new-wert = cv_baum.
WRITE ls_wald_new-wert COLOR 5.
ELSEIF ls_wald_new-wert = cv_brennender_baum.
WRITE ls_wald_new-wert COLOR 6.
ELSE.
WRITE ls_wald_new-wert.
ENDIF.
lt_wald_old = lt_wald_new.
lv_zeile_old = ls_wald_new-zeile.
ENDLOOP.
CLEAR lv_zeile_old.
CLEAR lt_wald_new.
WRITE:/ .
WRITE:/ .
ENDFORM. "display_wald
Code: Alles auswählen.
FORM get_zufallszahl USING u_limit TYPE i CHANGING c_number TYPE i.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = u_limit
ran_int_min = 1
IMPORTING
ran_int = c_number
EXCEPTIONS
invalid_input = 2
OTHERS = 1.
ENDFORM.
Super, danke schon mal dafür.Damit hast du eine saubere Trennung zwischen den einzelnen Logiken in deinem Programm.
So, wo liegt nun dein Problem? Du hast irgendwie vergessen eine Frage zu formulieren.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& HAUPTPROGRAMM *
*&---------------------------------------------------------------------*
START-OF-SELECTION. "= Definierter Einsprungspunkt
IF p_feuer > 100.
message ...
ELSE.
PERFORM initialisierung_wald.
DO p_aktion TIMES.
PERFORM zeitschritt_simulieren.
ENDDO.
ENDIF.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
drama
Stimmt.ewx hat geschrieben:Für die Validierung von Eingabe-Parametern dann aber bitte das Ereignis AT SELECTION-SCREEN nehmen...