Lerne und übe ABAP – Zustand von Tic-Tac-Toe

Lerne und übe ABAP. In der ABAP-Übung „State of Tic-Tac-Toe“ implementierst Du ein ABAP-Programm, die den Zustand eines Tic-Tac-Toe-Spiels bestimmt. Es gibt 40 geniale ABAP Übungen auf exercism. Du kannst diese Übung entweder in Deinem SAP-System ausprobieren oder Dich kostenlos auf der Plattform anmelden und die Übung absolvieren. Du kannst Dir sogar Lösungen von anderen Nutzen ansehen und dadurch Deine Lösung vergleichen.

Aufgabenstellung

In dieser Übung wirst du ein Programm implementieren, das den Zustand eines Tic-Tac-Toe-Spiels bestimmt. (Sie kennen das Spiel vielleicht auch als „Noughts and Crosses“ oder „Xs and Os“.)

Das Spiel wird auf einem 3×3-Gitter gespielt. Die Spieler legen abwechselnd Xs und Os auf das Gitter. Das Spiel endet, wenn ein Spieler gewonnen hat, indem er drei Markierungen in einer Reihe, Spalte oder entlang einer Diagonale des Gitters platziert hat, oder wenn das gesamte Gitter ausgefüllt ist.

In dieser Übung gehen wir davon aus, dass X beginnt.

Deine Aufgabe ist es, zu bestimmen, in welchem Zustand sich ein bestimmtes Spiel befindet.

Es gibt 3 mögliche Spielzustände:

  • Das Spiel ist im Gange.
  • Das Spiel endete mit einem Unentschieden.
  • Das Spiel endete mit einem Sieg.

Wenn das gegebene Brett ungültig ist, wird ein entsprechender Fehler ausgegeben.

Wenn ein Brett die folgenden Bedingungen erfüllt, ist es ungültig:

  • Das angegebene Brett kann nicht erreicht werden, wenn die Züge in der richtigen Reihenfolge ausgeführt werden (denken Sie daran, dass X beginnt).
  • Das Spiel wurde gespielt, nachdem es bereits beendet war.

Beispiel Programmierung

CLASS zcl_state_of_tic_tac_toe DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.

    TYPES player_type TYPE c LENGTH 1.
    "! E.g., ( ( `XOO` ) ( ` X ` ) ( `  X` ) )
    TYPES board_type TYPE TABLE OF string INITIAL SIZE 3.

    CONSTANTS: BEGIN OF player_enum,
                 one TYPE player_type VALUE 'X',
                 two TYPE player_type VALUE 'O',
               END OF player_enum.

    CONSTANTS: BEGIN OF state_enum,
                 ongoing_game TYPE string VALUE `Ongoing game`,
                 draw         TYPE string VALUE `Draw`,
                 win          TYPE string VALUE `Win`,
               END OF state_enum.

    "! @parameter state | Possible values are enumerated in state_enum
    "! @raising cx_parameter_invalid | Board is invalid
    METHODS get_state
      IMPORTING board        TYPE board_type
      RETURNING VALUE(state) TYPE string
      RAISING   cx_parameter_invalid.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_state_of_tic_tac_toe IMPLEMENTATION.

  METHOD get_state.
    " add solution here
    DATA :  lv_one  TYPE i,
            lv_two  TYPE i,
            lv_line1   TYPE string,
            lv_line2   TYPE string,
            lv_line3   TYPE string.

    LOOP AT board ASSIGNING FIELD-SYMBOL(<fs_line>).
      FIND ALL OCCURRENCES OF player_enum-one IN <fs_line> MATCH COUNT DATA(lv_one_line).
      FIND ALL OCCURRENCES OF player_enum-two IN <fs_line> MATCH COUNT DATA(lv_two_line).
      lv_one += lv_one_line.
      lv_two += lv_two_line.  
      IF lv_one_line EQ 3 OR lv_two_line EQ 3.
        IF state = state_enum-win.
          RAISE EXCEPTION TYPE cx_parameter_invalid.
        ELSE.
          state = state_enum-win.
        ENDIF.
      ENDIF.
    ENDLOOP.
    lv_line1 = board[ 1 ].
    lv_line2 = board[ 2 ].
    lv_line3 = board[ 3 ].
    
    IF ( ( lv_line1(1)   = lv_line2(1)   AND lv_line1(1)   = lv_line3(1)   AND lv_line1(1)   IS NOT INITIAL )
      OR ( lv_line1+1(1) = lv_line2+1(1) AND lv_line1+1(1) = lv_line3+1(1) AND lv_line1+1(1) IS NOT INITIAL )
      OR ( lv_line1+2(1) = lv_line2+2(1) AND lv_line1+2(1) = lv_line3+2(1) AND lv_line1+2(1) IS NOT INITIAL )
      OR ( lv_line1(1)   = lv_line2+1(1) AND lv_line2+1(1) = lv_line3+2(1) AND lv_line2+1(1) IS NOT INITIAL AND lv_line2+1(1) IS NOT INITIAL )
      OR ( lv_line1+2(1) = lv_line2+1(1) AND lv_line2+1(1) = lv_line3(1)   AND lv_line2+1(1) IS NOT INITIAL AND lv_line2+1(1) IS NOT INITIAL ) )
      AND ( lv_one > 2 OR lv_two > 2 ).
          state = state_enum-win.
    ENDIF.
    IF state IS INITIAL.
      IF lv_one < lv_two OR ( lv_one - lv_two ) > 1.
        RAISE EXCEPTION TYPE cx_parameter_invalid.
      ENDIF.
    
      IF lv_one = 5 AND lv_two = 4.
        state = state_enum-draw.
      ELSE.
        state = state_enum-ongoing_game.
      ENDIF.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

Erklärung

Die Methode get_state ist eine Methode der Klasse zcl_state_of_tic_tac_toe, die den Zustand eines Tic-Tac-Toe-Spiels ermittelt. Die Methode nimmt eine Tabelle, die das Spielfeld darstellt, als Eingabe und gibt den Zustand des Spiels als Rückgabewert zurück.

Die Methode überprüft jede Zeile des Spielfeldes auf die Spieler X und O. Wenn es in einer Zeile entweder 3 X oder 3 O gibt, wird angenommen, dass einer der Spieler gewonnen hat. Außerdem wird überprüft, ob eine der Diagonalen oder eine der Spalten von einem Spieler besetzt ist, und es wird erneut überprüft, ob einer der Spieler gewonnen hat.

Wenn kein Spieler gewonnen hat, wird geprüft, ob das Spielfeld vollständig gefüllt ist und keine weiteren Züge mehr möglich sind. Ist dies der Fall, wird die Partie als unentschieden gewertet. Wenn das Spielfeld noch nicht vollständig gefüllt ist, wird der Zustand als laufendes Spiel zurückgegeben.

Wenn das Spielfeld ungültig ist, wird die Ausnahme cx_parameter_invalid ausgelöst.

Ü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