Wir nutzen Cookies, um das allgemeine Benutzerelebnis zu verbessern. Mit der Nutzung unseres Wikis stimmst du der Nutzung von Cookies zu.

4gewinnt

4 gewinnt ist ein Spiel, bei dem es darum geht, als Erster vier Steine der eigenen Farbe in eine Reihe zu bringen. Reihen können dabei waagrecht, senkrecht oder diagonal sein. Es gibt zwei SpielerInnen die abwechselnd ihre Steine in eine Spalte werfen, jeder Stein fällt dabei soweit runter dass er ganz unten oder über einem anderen Stein zum Liegen kommt. Mehr Informationen zum Spiel gibt es hier.

Kann man ein solches Spiel in Scratch überhaupt machen?

Ein 4 gewinnt in Scratch zu machen ist eigentlich kein Problem … nur die Kontrolle, ob jemand gewonnen hat ist schwierig.

Hier ein kleines Beispiel:




Schau' dir dieses Projekt auf der Scratch-Webseite an...


Um zu verstehen, wie ein solches Programm funktioniert ist es immer am besten, es sich direkt im Editor anzuschauen(Link).

Es gibt mehrere Möglichkeiten zu überprüfen, ob ein Spieler gewonnen hat. Hier nun zwei Beispiele.

Vorarbeiten

Ich habe für dieses Projekt oben 5 Objekte in je einer Spalte verwendet. Sobald das Signal kommt, dass ein Pin eingeworfen werden soll, muss zuerst kontrolliert werden, ob noch Platz für einen Pin ist. Danach wird geprüft an welche Stelle in der Spalte er hin muss. Dafür habe ich mir für jede Spalte eine Liste erstellt, in der gespeichert wird, an welchen Stellen "noch Platz" ist. Man kann dem Pin (wie in diesem Programm) kleinere Effekte zuweisen. hier zum Beispiel, dass der Pin nach unten gleitet, und nicht sofort "am rechten Fleck" ist.

Möglichkeit 1

Nach jedem Wurf wird überprüft, ob 4 Pins (der gleichen Farbe) hintereinander liegen.

Hier ein Bild dazu: Vier-gewinnt.gif

Natürlich gibt es mehr Möglichkeiten, als die hier dargestellte. Dieses Skript würde ausserdem noch ziemlich lang werden, deshalb ist es sinnvoller, Möglichkeit 2 zu wählen, auch wenn diese etwas komplizierter ist.

Möglichkeit 2

Vorbereitung

Für die 2.Möglichkeit wird eine Liste angelegt die die Felder beinhaltet. Die Liste enthält genau so viele Einträge wie das Spielfeld hoch ist und jeder Eintrag entspricht einer Zeichenkette die die Felder beschreibt.

Nach zwei Zügen könnte die Liste auf einem 6 Zeilen mal 7 Feldern großen Brett wie folgt aussehen:

 0000000
 0000000
 0000000
 0000000
 0000000
 0002000
 0001000

"1" steht hier für einen Stein von Spieler 1 und "2" für einen Stein von Spieler 2.


Daraufhin wird ein Objekt erzeugt, welches als unser Stempel fungiert. Dem Objekt geben wir nun einen Kreis als Kostüm. (Es wäre praktischer wenn es echt ein Kreis ist und nicht zum Beispiel eine Ellipse). Dieses Kostüm sollte einfach weiß gefüllt sein. Dann kopierst du das Kostüm zwei mal und gibst den neuen Kostümen jeweils eine Farbe. (Die Farbe ist egal. Ich habe einfach mal Rot + Blau genommen)

Spielfeld erzeugen

Nun musst du das Spielfeld malen. Damit das klappt, setzt du den Stempel an die linke, obere Ecke des Spielfeldes. Anschließend malst du mit 2 verschachtelten wiederhole x-mal Schleifen das BREITE_DES_SPIELFELDES * HÖHE_DES_SPIELFELDES Spielfeld.

Auf Gewinn überprüfen

Mit Hilfe eines benutzerdefinierten Blocks kann das nachgehen einer waagrechten, senkrechten oder diagonalen Reihe einfach programmiert werden. Die Funktion "check ray" überprüft dabei je eine Richtung von einem Startpunkt aus:

Definiere check ray (x) (y) (xdir) (ydir)
setze [return v] auf [-1]
setze [x v] auf (x)
setze [y v] auf (y)
wiederhole bis <nicht <(Zeichen (x) von (Element (y) von [safe_board v] :: list)) = (Zeichen (x) von (Element (y) von [safe_board v] :: list))>> 
  ändere [x v] um (xdir)
  ändere [y v] um (ydir)
  ändere [return v] um (1)
end
setze [x v] auf (x)
setze [y v] auf (y)
wiederhole bis <nicht <(Zeichen (x) von (Element (y) von [safe_board v] :: list)) = (Zeichen (x) von (Element (y) von [safe_board v] :: list))>> 
  ändere [x v] um ((xdir) * (-1))
  ändere [y v] um ((ydir) * (-1))
  ändere [return v] um (1)
end
falls <nicht <(return) < [4]>> dann 
  setze [game over? v] auf [1]
end

x und y definieren dabei den Startpunkt und xdir und ydir geben die Richtung an:

Richtung xdir ydir
diagonal1 1 1
horizontal 1 0
diagonal2 1
vertikal 0

Man beachte dass es hier zwei Diagonalrichtungen gibt, da sowohl von links oben nach rechts unten als auch von rechts oben nach links unten eine Viererreihe erzielt werden kann. Im Gegensatz dazu reicht es wegen der Symmetria aus horizontal und vertikal nur jeweils eine Richtung zu überprüfen.

Obiges Skript is in folgendem Projekt eingebaut:




Schau' dir dieses Projekt auf der Scratch-Webseite an...


Dazu implementiert dieses Projekt auch einen Computergegner, dieser Algorithmus würde aber den vorliegenden Artikel sprengen. Weiteres dazu findet man unter dem Stichwort "negascout", zum Beispiel auf Stackoverflow.



Code zum Einbinden ins Forum:
[wiki=de:4gewinnt]4gewinnt[/wiki]