Lerne und übe ABAP – Minesweeper

Verbessere Deine ABAP-Kenntnisse durch Übungen. Mit der ABAP-Übung „Minesweeper“ kannst Du Dein eigenes ABAP-Programm erstellen, das die Anzahl der Minen auf einem kompletten Minesweeper-Spielfeld addiert. Auf der Übungsplattform exercism stehen Dir 40 anspruchsvolle ABAP Übungen zur Verfügung. Du hast die Möglichkeit, diese Übungen entweder in Deinem SAP-System zu testen oder Dich kostenlos auf der Plattform anzumelden und die Übungen zu bearbeiten. Außerdem hast Du die Möglichkeit, Dir die Lösungen anderer Benutzer anzusehen und Deine eigene Lösung damit zu vergleichen.

Aufgabenstellung

Füge die Minenzahlen zu einem fertigen Minesweeper-Brett hinzu.

Minesweeper ist ein beliebtes Spiel, bei dem der Benutzer die Minen mit Hilfe von numerischen Hinweisen finden muss, die angeben, wie viele Minen direkt (horizontal, vertikal, diagonal) an ein Feld angrenzen.

In dieser Übung musst Du einen Code erstellen, der die Anzahl der Minen zählt, die an ein gegebenes leeres Feld angrenzen, und dieses Feld durch die Anzahl ersetzt.

Das Spielfeld ist ein Rechteck, das aus Leerzeichen (‚ ‚) besteht. Eine Mine wird durch ein Sternchen (‚*‘) dargestellt.

Wenn ein bestimmtes Feld keine angrenzenden Minen hat, bleibt es leer.

Du könntest zum Beispiel ein 5 x 4 Feld wie folgt erhalten (leere Felder werden hier mit dem Zeichen ‚-‚ dargestellt, um sie auf dem Bildschirm anzuzeigen):

·*·*·
··*··
··*··
·····

Und Dein Code wandelt es in dieses um:

1*3*1
13*31
·2*2·
·111·

Beispiel Programmierung

CLASS zcl_minesweeper DEFINITION PUBLIC FINAL CREATE PUBLIC.

  PUBLIC SECTION.

    METHODS annotate
        IMPORTING
          !input        TYPE string_table
        RETURNING
          VALUE(result) TYPE string_table.

ENDCLASS.

CLASS zcl_minesweeper IMPLEMENTATION.

  METHOD annotate.
    " add solution here
    FIELD-SYMBOLS <fs_other_line> TYPE string.
    FIELD-SYMBOLS <fs_current_line> TYPE string.
    DATA(lt_result) = input.

    LOOP AT lt_result ASSIGNING <fs_current_line>.
      CHECK <fs_current_line> CA '*'.
      DATA(lv_current_row) = sy-tabix.

      DO strlen( <fs_current_line> ) TIMES.
        DATA(lv_row) = lv_current_row - 1.
        DATA(lv_current_off) = sy-index - 1.
        CHECK substring( val = <fs_current_line> off = lv_current_off len = 1 ) EQ '*'.
        DO 3 TIMES.  

          DATA(lv_off) = lv_current_off - 1.
          READ TABLE lt_result INDEX lv_row ASSIGNING <fs_other_line>.
          IF sy-subrc EQ 0.
            DO 3 TIMES.

              IF lv_row NE lv_current_row OR lv_off NE lv_current_off.
                if lv_off between 0 and ( strlen( <fs_other_line> ) - 1 ).
                    DATA(lv_current_field) = substring( val = <fs_other_line> off = lv_off len = 1 ).
                    IF lv_current_field NE '*'.
                      DATA(lv_count_mines) = CONV i( substring( val = <fs_other_line> off = lv_off len = 1 ) ).
                      lv_count_mines = lv_count_mines + 1.
                      <fs_other_line> = replace( val = <fs_other_line> off = lv_off len = 1 with = |{ lv_count_mines }| ).
                    ENDIF.
                endif.
              ENDIF.
              lv_off = lv_off + 1.
            ENDDO.
          ENDIF.
          lv_row = lv_row + 1.
        ENDDO.
      ENDDO.
    ENDLOOP.

    result = lt_result.
  ENDMETHOD.

ENDCLASS.

Erklärung

Die Methode annotate ist eine Methode der Klasse zcl_minesweeper. Sie nimmt als Eingabeparameter eine Stringtabelle („string_table“) und gibt als Ergebnis ebenfalls eine Stringtabelle zurück.

Innerhalb der Methode wird die Eingabetabelle in einer Schleife durchlaufen. Für jede Zeile wird geprüft, ob sie ein „*“ enthält. Wenn dies der Fall ist, werden für jedes Zeichen in der Zeile weitere Schleifen ausgeführt, um die Anzahl der Minen in den angrenzenden Zeichen und Zeilen zu berechnen. Dazu werden weitere Schleifen und Abfragen verwendet, um die angrenzenden Zeichen und Zeilen zu ermitteln und die Anzahl der Minen zu erhöhen, wenn keine Mine vorhanden ist.

Am Ende der Methode wird das berechnete Ergebnis in einer internen Tabelle gespeichert und als Rückgabewert zurückgegeben.

Über den Autor

Andreas Geiger

Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.

Mehr zu ERP UP

ERP UP unterstützen

Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.

Schreibe einen Kommentar