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...