Einführung
FloodIt (auch “Flood Fill”) ist ein simples, aber süchtig machendes Logikspiel: Du startest oben links in einem farbigen Raster. Mit jedem Zug wählst du eine Farbe, und der zusammenhängende Startbereich übernimmt diese Farbe und “wächst”. Ziel: Das gesamte Raster in möglichst wenigen Zügen in eine einzige Farbe verwandeln.
In diesem Beitrag bauen wir FloodIt als Excel-Spiel – komplett mit Klick-Steuerung, Zähler, Neustart und Gewinnanzeige. Alles, was du brauchst: Excel für Windows oder Mac und ein bisschen Copy & Paste. Die Anleitung ist explizit anfängerfreundlich.
Was das Spiel kann
-
16×16 Spielfeld mit zufälligen Farben
-
6 wählbare Farben
-
Klicksteuerung: Farbfelder in Zeile 21 wählen
-
Zähler für die benötigten Züge
-
“Klick hier für Neustart” oben links
-
Gewinn-Check mit grünem “GEWONNEN!”-Feld zum Neustart
So funktioniert FloodIt (Spielprinzip)
-
Das Spielfeld ist ein 16×16-Gitter aus farbigen Zellen (Zeilen 3–18).
-
Du startest mit der Zelle oben links (A3).
-
Klicke unten in Zeile 21 auf eine Farbe. Alle Zellen im Startgebiet, die zusammenhängen und dieselbe Farbe wie A3 hatten, werden in die neue Farbe umgefärbt. Dieser Bereich kann sich dadurch ausdehnen (“Flood”).
-
Wiederhole, bis alle Zellen die gleiche Farbe haben. Dann gewinnst du. Ziel: so wenig Züge wie möglich.
Schritt-für-Schritt: Installation in Excel (für Einsteiger)
Voraussetzungen: Excel geöffnet, eine neue leere Arbeitsmappe.
-
Makros erlauben
-
Beim Speichern wähle Dateityp: Excel-Arbeitsmappe mit Makros (*.xlsm).
-
Wenn Excel beim Öffnen Sicherheitswarnungen zeigt, Makros aktivieren.
-
VBA-Editor öffnen
-
Drücke Alt+F11, um den VBA-Editor zu öffnen.
-
Modul einfügen und Code einfügen
-
Im VBA-Editor: Einfügen > Modul.
-
Öffne das neue Modul (z. B. “Modul1”) und füge diesen Code vollständig ein:
Option Explicit
Public Const VERTICAL_GRID As Integer = 16
Public Const HORIZONTAL_GRID As Integer = 16
Public Const PLAYFIELDS As Integer = 6
Public counter As Integer
Function rand(PLAYFIELDS)
Dim Obergrenze As Integer
Dim Untergrenze As Integer
Obergrenze = PLAYFIELDS
+ 3 Untergr
nze = 3 rand = Int((Obergrenze - Untergrenze + 1) * Rnd +
End Function
Function grow(old_value, new_value, v_position, h_position)
' Grenzen prüfen BEVOR wir etwas ändern
If v_position < 3 Or v_position > VERTICAL_GRID + 2 Then Exit Function
If h_position < 1 Or h_position > HORIZONTAL_GRID Then Exit Function
' Nur ändern wenn aktuelles Feld die alte Farbe hat
If Cells(v_position, h_position).Value <> old_value Then Exit Function
' Farbe ändern
Cells(v_position, h_position).Value = new_value
Cells(v_position, h_position).Interior.ColorIndex = new_value
' Rekursiv zu benachbarten Feldern
If h_position + 1 <= HORIZONTAL_GRID Then
If Cells(v_position, h_position + 1).Value = old_value Then
Call grow(old_value, new_value, v_position, h_position + 1)
End If
End If
If v_position + 1 <= VERTICAL_GRID + 2 Then
If Cells(v_position + 1, h_position).Value = old_value Then
Call grow(old_value, new_value, v_position + 1, h_position)
End If
End If
If h_position - 1 >= 1 Then
If Cells(v_position, h_position - 1).Value = old_value Then
Call grow(old_value, new_value, v_position, h_position - 1)
End If
End If
If v_position - 1 >= 3 Then
If Cells(v_position - 1, h_position).Value = old_value Then
Call grow(old_value, new_value, v_position - 1, h_position)
End If
End If
End Function
Sub pixel_it_start()
ApplicaFalse
Application.EnableEvenFalse
Application.ScreenUpdatiFalse
Cells.MergeCelFalse
Dim pf As Integer, v As Integer, h As Integer
Dim this_value As Integer
Cells.Clear
counter = 0
Cells(1, 1) = "Pixel It - Klick hier für Neustart"
Cells(1, 1).Font.Bold = True
Cells(1, 1).Interior.Color = RGB(200, 200, 200)
Cells(1, HORIZONTAL_GRID).Value = "Züge: 0"
Cells(1, HORIZONTAL_GRID).Font.Bold = True
Cells(2, 1).Value = ""
Cells(2, 1).Font.Color = RGB(255, 255, 255)
Randomize
For v = 1 To VERTICAL_GRID
For h = 1 To HORIZONTAL_GRID
this_value = rand(PLAYFIELDS)
Cells(2 + v, h) = this_value
Cells(2 + v, h).ColumnWidth = 3
Cells(2 + v, h).RowHeight = 15
Cells(2 + v, h).Interior.ColorIndex = this_value
Next h
Next v
Cells(20, 1) = "Klicke auf eine Farbe:"
Cells(20, 1).Font.Bold = True
For pf = 3 To PLAYFIELDS + 3
Cells(21, pf - 2).Interior.ColorIndex = pf
Cells(21, pf - 2).Value = pf
Cells(21, pf - 2).ColumnWidth = 4
Cells(21, pf - 2).RowHeight = 20
Cells(21, pf - 2).HorizontalAlignment = xlCenter
Cells(21, pf - 2).Font.Bold = True
Next pf
Cells(23, 1) = "Status: Spiel läuft..."
Cells(23, 1).Font.Bold = True
Cells(23, 1).Interior.Color = RGB(240, 240, 240)
Application.ScreenUpdating = True
Application.ScreenUpdating = True
Application.EnableEvents = True
Cells(3, 1).Select
MsgBox "Willkommen zu (Un-)PixelIt!" & Chr(13) & Chr(10) & _
"Klicke auf die Farbfelder in Zeile 21, um das Spiel zu spielen!" & Chr(13) & Chr(10) & _
"Ziel: Alle Felder in derselben Farbe!", vbInformation, "PixelIt"
End Sub
Sub pixel_it_change()
Dim old_value As Integer
Dim new_value As Integer
old_value = Cells(3, 1).Value
new_value = Cells(2, 1).Value
' Debug-Ausgabe
Debug.Print "Old Value: " & old_value & ", New Value: " & new_value
If old_value <> new_value And new_value >= 3 And new_value <= PLAYFIELDS + 3 Then
counter = counter + 1
Cells(1, HORIZONTAL_GRID).Value = "Züge: " & counter
Application.ScreenUpdating = False
Call grow(old_value, new_value, 3, 1)
Application.ScreenUpdating = True
' Gewinn-Check
Call check_win
End If
Cells(2, 1).Value = ""
Cells(3, 1).Select
End Sub
Sub check_win()
Dim firstColor As Integer
Dim allSame As Boolean
Dim v As Integer, h As Integer
Dim winRange As Range
Set winRange = Range(Cells(VERTICAL_GRID + 7, 1), Cells(VERTICAL_GRID + 7, 4))
firstColor = Cells(3, 1).Value
allSame = True
' Alle Spielfelder prüfen
For v = 1 To VERTICAL_GRID
For h = 1 To HORIZONTAL_GRID
If Cells(2 + v, h).Value <> firstColor Then
allSame = False
Exit For
End If
Next h
If Not allSame Then Exit For
Next v
If allSame Then
With winRange
.Merge
.Value = "GEWONNEN! Klick hier für Neustart"
.Interior.Color = RGB(144, 238, 144)
.Font.Bold = True
.WrapText = True
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.RowHeight = 28
End With
MsgBox "Glückwunsch! Du hast gewonnen!" & Chr(13) & Chr(10) & _
"Züge benötigt: " & counter & Chr(13) & Chr(10) & _
"Klicke auf das hellgrüne 'Gewonnen'-Feld für ein neues Spiel!", vbInformation, "Gewonnen!"
End If
End Sub
-
Arbeitsblatt-Ereignis einfügen
-
Im VBA-Editor doppelklicke links im Projekt auf “Tabelle1 (Sheet1)” oder das Blatt, auf dem du spielen willst.
-
Füge in dieses Blatt-Objekt folgenden Code ein:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then Call pixel_it_start Exit Sub End If' Gewonnen-Feld (gemergter Bereich) für Neustart
Dim ws As Worksheet
Dim winRange As Range
Dim txt As String
Set ws = Me
Set winRange = ws.Range(ws.Cells(VERTICAL_GRID + 7, 1), ws.Cells(VERTICAL_GRID + 7, 4))
If Not Intersect(Target, winRange) Is Nothing Then
' Text sicher auslesen
On Error Resume Next
If winRange.MergeCells Then
txt = CStr(winRange.Cells(1, 1).Value)
Else
txt = CStr(winRange.Cells(1, 1).Value)
End If
On Error GoTo 0
If Len(txt) > 0 And InStr(1, txt, "GEWONNEN", vbTextCompare) > 0 Then
Application.EnableEvents = False
pixel_it_start
Application.EnableEvents = True
End If
Exit Sub
End If
' Farbauswahl durch Klick auf Farbfelder (ZEILE 21!)
If Target.Row = 21 And Target.Column >= 1 And Target.Column <= PLAYFIELDS + 1 Then
Dim old_value As Integer
Dim new_value As Integer
old_value = Me.Cells(3, 1).Value
new_value = Target.Value
If old_value <> new_value Then
counter = counter + 1
Me.Cells(1, HORIZONTAL_GRID).Value = "Züge: " & counter
Application.ScreenUpdating = False
grow old_value, new_value, 3, 1
Application.ScreenUpdating = True
check_win
End If
End If
End Sub
-
Datei speichern und Spiel starten
-
Speichere die Datei als .xlsm.
-
Kehre zu Excel zurück, klicke in Zelle A1 (“Pixel It – Klick hier für Neustart”).
-
Ein neues Spielfeld wird erzeugt. Spiele, indem du in Zeile 21 auf eine Farbe klickst.
-
Wenn du gewinnst, erscheint ein hellgrünes “GEWONNEN!”-Feld. Klicke darauf für einen Neustart.
Tipps bei Problemen (Troubleshooting)
-
Nichts passiert beim Klick: Prüfe, ob Makros aktiviert sind und der Blattcode wirklich im Blattobjekt (z. B. Tabelle1) liegt, nicht im Modul.
-
Farben wirken “seltsam”: Es werden ColorIndex-Werte verwendet (Excel-Palette). Das ist korrekt. Auf Mac können Farbtöne leicht abweichen.
-
Performance: Bei sehr langsamen Rechnern kann Application.ScreenUpdating = False/True entscheidend sein. Das ist im Code bereits berücksichtigt.
-
Fehlermeldung zu Variablen: Stelle sicher, dass Option Explicit ganz oben im Modul steht und alle Prozeduren im selben Modul wie vorgegeben sind.
-
Zufall zwingend neu mischen: Die Zeile Randomize im Start sorgt für neue Muster. Falls bei dir immer dasselbe Muster kommt, prüfe, ob Randomize versehentlich entfernt wurde.
Wie du das Spiel anpasst
-
Spielfeldgröße: VERTICAL_GRID und HORIZONTAL_GRID ändern (z. B. 10 x 10). Beachte: Die Zeilenangaben (3–18) und winRange (VERTICAL_GRID + 7) passen sich über die Konstanten an.
-
Anzahl Farben: PLAYFIELDS anpassen (z. B. 5 oder 8). Die Palette unten wird automatisch mitgezogen.
-
Zughürde/Highscore: Du kannst eine Zielzahl vorgeben und bei Gewinn vergleichen. Beispiel: Cells(23, 5) = „Best: “ & bestScore
-
Farbpalette beschriften: In Zeile 20 kannst du statt “Klicke auf eine Farbe” die Anzahl erlaubter Züge oder Tipps anzeigen.
-
Größere Kacheln: ColumnWidth und RowHeight in pixel_it_start anpassen.
Wie der Algorithmus funktioniert (kurz)
-
grow ist eine rekursive Flood-Fill-Funktion.
-
Start ist A3 mit alter Farbe old_value. Bei Klick wird new_value gesetzt.
-
grow färbt A3 um und ruft sich für Nachbarn (oben, unten, links, rechts) erneut auf – aber nur, wenn deren Wert der alten Farbe entspricht.
-
check_win prüft nach jedem Zug, ob alle Zellen die gleiche Farbe haben.
Ideen für Erweiterungen
-
Zuglimit mit Anzeige “Verloren” nach Überschreitung.
-
Undo-Funktion: Letzte Farbe im Stack speichern und per Tastatur rückgängig machen.
-
Schwierigkeitsgrade: Mehr Farben, größeres Raster, blockierte Felder.
-
Seed-Anzeige: Einen Seed speichern, um das gleiche Board erneut zu erzeugen.
-
Soundeffekte via Beep bei Gewinn.
FAQ
-
Läuft das auf Mac? Ja, VBA läuft auch auf Mac. Die ColorIndex-Farben können geringfügig anders aussehen.
-
Brauche ich Adminrechte? Nein, nur Makros müssen erlaubt sein.
-
Funktioniert es ohne Klicks, nur mit Eingabe? Ja, die Prozedur pixel_it_change unterstützt auch die Eingabe in Zelle A2 (wird im aktuellen Setup aber nicht benötigt).
Fazit
Mit wenigen Zeilen VBA wird Excel zur Spielkonsole. FloodIt ist ideal, um rekursive Algorithmen, Events und UI in Excel zu verstehen – und macht nebenbei richtig Spaß. Wenn du magst, helfe ich dir gern beim Anpassen: andere Farben, Scoreboard, oder Integration in deinen Blog mit schön formatierten Codeblöcken.
Rechtlicher Hinweis und Transparenz
-
FloodIt ist ein eigenständiges Spielkonzept, dessen Marken- und Urheberrechte bei den jeweiligen Rechteinhabern liegen. Dieses Projekt ist eine nicht-kommerzielle, inoffizielle Umsetzung des Spielprinzips in Microsoft Excel/VBA zu Lern- und Demonstrationszwecken. Es besteht keinerlei Verbindung, Unterstützung oder Sponsoring durch die Rechteinhaber von FloodIt.
-
Alle im Beitrag bereitgestellten Codeschnipsel und Anleitungen sind ohne Gewähr. Nutzung auf eigene Verantwortung. Microsoft, Excel und VBA sind Marken von Microsoft Corporation.
-
Transparenzhinweis: Teile dieses Artikels sowie Codepassagen wurden unter Einsatz von KI-Tools erstellt bzw. redaktionell mit KI-Unterstützung überarbeitet. Inhalte wurden nach bestem Wissen geprüft, können aber Fehler enthalten. Wenn du Unstimmigkeiten findest, melde dich gern, damit wir den Beitrag aktualisieren können.
