Java Klasse
Hauptmenü
Die Java Klasse des Hauptmenüs braucht wie im ersten Projekt eine Funktion, die beim drücken des Buttons ausgelöst wird.
Der Button soll die zweite Activity, das Spiel, ausführen. Solche Aktionen werden in Android mit Intents durchgeführt.Ein Intent ist die Beschreibung einer Aktion, die Ausgeführt werden soll, was nicht nur das öffnen einer Activity ist, sondern auch z.B. das Öffnen einer Webseite oder das wählen einer Nummer. Zuerst muss ein neuer Intent erstellt werden. Die Argumente des Konstruktors sind der Kontext, in diesem Fall die bereits geöffnete, aktuelle, Activity, und die zu öffnende Activity.
Der Intent kann mit startActivity() ausgeführt werden. Danach sollte die aktuelle Activity mit finish() beendet werden.
Spiel
Beim Spiel muss nicht für jeden Button eine einzelne Methode erstellt werden, sondern nur eine, die durch jeden Button aufgerufen wird.
Wenn ein Button gedrückt wird, wird die angegebene Methode mit einem Parameter vom Typ View aufgerufen. Ein View stellt ein Element der Benutzeroberfläche dar, in unserem Fall ist das "View view" (Name des Objektes: "view", Typ: "View"). Aus diesem View kann nun ein Objekt vom Typ Button erstellt werden, dass den gedrückten Button repräsentiert.
Das "(Button)" gibt hierbei an, dass es sich bei dem View view um ein Button, also eine Unterklasse von View ist.
Alles folgende soll nur ausgeführt werden wenn der geklickte Button leer ist:
Wenn ein Button geklickt wird, soll der Text und die Textfarbe dem aktuellen Spieler entsprechen.
Das Meiste in diesem Abschnitt sollte bereits bekannt sein, neu ist jedoch die folgende Zeile:
Ressourcen
Wenn innerhalb einer App Daten wie Texte, Bezeichnungen, Textgrößen, Farben usw. oft verwendet werden, ist es sinnvoll sie als Ressource zu speichern. Damit werden diese Werte nur ein Mal gespeichert, und wenn der Wert im Layout oder Code benötigt wird, kann er von dort geladen werden. Dies hat den Vorteil, dass man oft vorkommende Werte einfach ändern kann, oder auf verschiedenen Geräten unterschiedliche Werte verwenden kann (z.B. wenn die App in viele Sprachen übersetzt wird). Diese "Values ressource files" findet man unter res/values. Falls dort die Datei "colors.xml" noch nicht existiert, kann sie mittels Rechtsklick auf "values" erstellt werden. Je nach Android version enthält diese Datei schon Farben, die das Design wie die Farbe der Benachrichtigungsleiste bestimmen. Folgende Werte kommen neu hinzu:
Tipp: Ein Klick auf die Vorschau der Farbe links vom Code ruft ein Auswahlfeld für Farben auf!
Somit wird von
ein Integer mit dem Wert 0xF44336 zurückgegeben.
Nachdem ein Spieler seinen Zug abgeschlossen hat, muss geprüft werden, ob er das Spiel gewonnen oder zum Gleichstand gebracht hat. Dafür wird die Methoden spielGewonnen() geschrieben.
Gewinnfunktion
Die Gewinnfunktion prüft, ob einer der Spieler das Spiel gewonnen hat. Dafür müssen 4 Möglichkeiten geprüft werden: Horizontal, Vertikal, Diagonal, Umgekehrt Diagonal
Bei Horizontal und Vertikal genügt es, die Zeile/Spalte zu prüfen, in der gerade ein Feld eingenommen wurde, da nur dort das Spiel gewonnen werden kann.
Mittels einer for-Schleife werden alle vorhandenen Felder geprüft, int y
ist hierbei die y Koordinate des aktuellen Feldes. Diese bleibt konstant, somit werden alle Felder in Zeile y geprüft. Diefor-Schleife wird mittels break;
abgebrochen sobald eines der Felder nicht dem aktuellen Spieler gehört. Wenn alle Felder überprüft wurden ohne dass die Schleife abbricht gehört jedes Feld dem aktuellen Spieler, also gibt die Funktion true
zurück.
Die Schleife zur Prüfung der Vertikalen verfährt nach gleichem Prinzip:
Für die erste Diagonale müssen in jedem Durchlauf sowohl die x als auch y Koordinate erhöht werden. Außerdem muss dieser Test nur durchgeführt werden wenn x = y ist, also ein Feld auf der Diagonalen eingenommen wurde.
Für die zweite Diagonale muss nur die y Koordinate invertiert werden.
Ans Ende der Gewinnfunktion muss noch ein return false;
da das Spiel nicht gewonnen ist wenn keiner der Tests erfolgreich war.
In game_click()
muss natürlich nach jedem Spielzug überprüft werden, ob das Spiel mit dem Zug gewonnen wurde, oder ob gerade der 9. (und letzte) Zug gespielt wurde, ohne dass das Spiel gewonnen wurde.
Außerdem müssen noch der Zähler für die Spielzüge erhöht werden, die Anzeige des aktuellen Spielers aktualisiert und die Farbe angepasst werden:
Tipp: mit
System.currentTimeMillis();
kann die aktuelle Zeit in Sekunden abgerufen werden
Last updated
Was this helpful?