Tentactics – Puzzle Game

Seit einiger Zeit fesselt mich das simple Puzzlespiel Numberama2, das für iOS im Appstore verfügbar ist. Neben dem Spielen habe ich mir auch Gedanken darüber gemacht, wie man das wohl am einfachsten programmieren könnte. Ich hatte dann eine Idee, die ich leider doch verwerfen musste. Am Ende ist das Spiel deutlich komplexer und aufwändiger geworden, als ich dachte. So ist das halt häufig…

Gameplay

Gespielt wird auf einem 9 Spielfelder breiten und nach unten offenem Spielfeld. Die Spielfelder werden gleichmäßig mit Zahlen von 1 bis 9 aufgefüllt. Nun gilt es, Paare zu finden. Ein gültiges Paar sind zwei Zahlen, die

  • direkt neben-, oder untereinander stehen
  • Ohne andere Zahlen neben- oder untereinander stehen
  • in einer Reihe rechts aufhören und in der nächsten Reihe links wieder beginnen

Paare müssen folgende Eigenschaften haben:

  • Die Summe muss 10 ergeben (1 + 9, 2 + 8 usw)
  • Die Zahlen müssen gleich sein (1 + 1, 2 + 2 usw)

Die Zahlen gültiger Paare können angeklickt und dadurch vom Spielfeld entfernt werden.

Ziel des Spieles ist es, alle Zahlen zu löschen.

Ausgangsbasis sind Zufallszahlen (random mode) oder die Startreihe (classic mode)

123456789
111213141
516171819

2016-03-28_17-04-33

Sind alle Paare gefunden, dann muss der “Next” Button gedrückt werden. Hierdurch werden allen verbliebenen Zahlen ohne Lücken an die vorhandenen Zahlen angehängt. Dadurch ergeben sich wieder neue Kombinationsmöglichkeiten.

Man startet mit einer Punktzahl von 1000. Jedes eliminierte Zahlenpaar verringert die Punktzahl um 5. Gelöschte Reihen erhöhen die Punktzahl um 10.

Die Punktzahl ist jedoch meiner Meinung nach nebensächlich. Es ist schon schwer genug, die Zahlen zu eliminieren.

Der Name

Eigentlich wollte ich – da es sich um eine Programmieraufgabe mit ABAP handelt – das Spiel NUMBERABAP nennen. Zwischendurch fiel mir jedoch der Name TENTACTICS ein, den ich deutlich spannender finde. TEN in Anlehnung an das Spielprinzip, dass die Summe der Paare 10 ergeben muss und TACTICS, da man durchaus taktisch agieren muss, um alle Zahlen zu eliminieren. Und Alliterationen sind immer gut.

Programmbeschreibung

Die erste Idee, um das Spielprinzip abbilden zu können, war die Verwendung einer internen Tabelle mit den Feldern

  • number
  • column
  • row

und zwei Indizes:

  • column – row
  • row – column

So wäre es einfach, Paare zu finden, denn diese müssen entweder im einen oder im anderen Index direkt “nebeneinander” liegen.

Leider brauchte ich natürlich zusätzlich eine Tabelle für das Spielfeld. Die verschiedenen Zugvariationen machten es schwierig, beide Tabellen auf dem gleichen Stand zu halten. Deswegen habe ich in der zweiten Version nur mit dem Spielfeld als “Zahlenspeicher” gearbeitet. Für die Lösungssuche bin ich dann allerdings wieder auf die erste Programmidee zurück gekommen.

Die Lösungssuche funktioniert nicht zuverlässig, denn die Idee mit den “nebeneinander” liegenden Zahlen war zwar gut, findet aber nicht alle möglichen Paare. Um alle Paare zuverlässig identifizieren zu können, müsste man oben links im Spielfeld beginnen und jede Zahl der Reihe nach nach möglichen Kombinationen (nach oben, unten, rechts und links) absuchen.

Das Spielfeld ist ein simples ALV-Grid mit einer kleinen Besonderheit: Die Klasse CL_GUI_ALV_GRID habe ich abgeleitet und um die Methode SET_NO_RESIZE erweitert. Diese ruft die geschützte Methode SET_RESIZE_COLS( 0 ) auf, mit der die Größenänderung der Spalten verhindert wird.

Ich habe bei der Programmierung mit “Buttons” und “Links” experimentiert und bin zu dem Schluss gekommen, dass die Buttons am besten aussehen. Die Links sind alle unterstrichen und das machte die Zahlen unübersichtlich.

Spieltipps2016-03-28_17-05-03

Eliminiere zuerst die eindeutigen Paare, also Zahlen, die direkt nebeneinander stehen und bei denen es nur eine Lösungsmöglichkeit gibt.

Dreier-Kombinationen lasse außen vor und versuche bessere Paare außen herum zu finden, so dass es eine passende vierte Zahl in Frage kommt.

Auch bei eindeutigen Paaren darauf achten, ob es eventuell Kombinationen gibt, die besser vorher gelöst werden sollten. In folgendem Beispiel sind ZWEI Paare versteckt. Offensichtlich sind die zwei Vieren ganz links. Weniger offensichtlich, jedoch besser (da man zwei Paare löst), ist es, die Vier oben rechts mit der Vier aus der nächsten Reihe zu lösen und gleiches in der folgenden Zeile.

1 2 3 4 5 6 7 8 4
4 5   5 6 5 6 4
4 7 1 8   1     7
  8 4 7 1 3 9

Der Button “Check” prüft, wie viele Paare noch vorhanden sind und gibt Hinweise darauf, wo sich noch Paare verstecken.

Eventuell ist es besser, nicht alle möglichen Paare zu löschen, sondern schon vorher den NEXT-Button zu betätigen.

Known Bugs

Es wird nicht erkannt, ob das Spiel zu Ende ist.

Ich dachte, dass es nur möglich wäre, höchstens eine Zeile zur Zeit zu eliminieren. Das stimmt nicht, es können auch zwei Zeilen gelöscht werden. In folgender Konstellation bilden die beiden Vieren ein Paar und können gelöscht werden. Dadurch werden auch die beiden Zeilen gelöscht:

1 2 3 4 5 6 7 8 9
              4  
3 4 5 6 7 8     2
              4
1 7             5

Wie bereits oben beschrieben, ist die Lösungssuche nicht 100% zuverlässig. Einige Paare werden nicht korrekt erkannt.

Unterschiede zum Original

Du wirst nicht durch einen blinkenden NEXT-Button darüber informiert, dass es keine Züge mehr gibt. Dies wäre noch leicht einzubauen.

Du bekommst Hinweise, wo sich noch Paare verstecken. Das ist leider in der Originalversion nicht so und hat mich schon manches Mal zur Verzweiflung getrieben.

Der größte Unterschied ist jedoch, dass dieses Spiel in ABAP geschrieben wurde. 😉

How To Start

Lege ein neues Programm in der Transaktion SE38 an und kopiere den Code von TENTACTICS Editor und aktiviere das Programm. Führe das Programm aus und wähle den Spielmodus “Classic” oder “Random”. Drücke <ENTER> um das Spiel zu starten (NICHT Ausführen!).

2016-03-28_17-06-06

Quelltext

Hier gibt es den Quelltext zum Download: tentactics.abap

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)