VBA 4 Gewinnt

4 Antworten

Doppelschleife über das Spielfeld-Range bis Zeilenzahl-4, bzw. Spaltenzahl-4

Dann

Wenn AktuelleZelle eingefärbt prüfe weiter:

  • Sind Nachbarzellen (Offset(1..3,0)) wie AktuelleZelle gefärbt? → Farbe AktuelleZelle.Farbe hat gewonnen
  • Sind Diagnonalnachbarn (Offset(1..3,1..3)) wie AktuelleZelle gefärbt? → Farbe AktuelleZelle.Farbe hat gewonnen
  • Sind vertikale Nachbarn (Offset(0,1..3)) wie AktuelleZelle gefärbt? → Farbe AktuelleZelle.Farbe hat gewonnen

Allein durch die erste Bedingung wird die Anzahl an tiefer zu prüfenden Möglichkeiten extrem eingeschränkt. Noch besser wäre, wenn du anfängst, von unten rechts (mit Abstand 4 zum Rand) zu prüfen, da die Steine logischerweise zuerst die unteren Plätze belegen. Eine erfüllte Gewinnbedinung wird dann schneller gefunden. Bei Nichtgewinn ist beides gleich schnell.

Noch besser wäre es natürlich, wenn du direkt nach einem Zug die 3 Nachbarn in alle Richtungen überprüfen würdest.

Woher ich das weiß:Berufserfahrung – Programmierer
geri3d  07.03.2018, 20:32

vor 4 jahren ... was ist aus gute frege geworden

0

Das ist dann eben das "echte" programmieren.

Du hast eine Matrix aus 6 Reihen zu je 7 Feldern, also insgesamt 42 Felder. Jedes Feld hat 8 umgebende Felder (außer an den Rändern).

Ich würde links oben beginnen zu prüfen (also Feld 1,1).

Ist das Feld "leer" also unbelegt, springst Du direkt zu nächsten Feld, da keine Prüfung notwendig ist.

Bist Du bei Feld 1,7 angekommen, springst Du zu 2,1 also an den Anfang der zweiten Reihe von oben usw.

Du musst ausgehend von deinem "aktuellen" Feld der Reihe nach den Status der angrenzenden Felder prüfen. Mit welchem Du beginnst ist eigentlich egal.

Findest Du in eine bestimmte Richtung ein gleichfarbiges Feld prüfst Du in diese Richtung weiter. Findest Du ein drittes Feld mit gleicher Farbe, schaust Du nach, ob es auch ein viertes Feld gibt. In diesem Fall "Bingo"! Fertig!

Kommt als Zweites, Drittes oder Viertes Feld ein Feld mit anderer Farbe, nimmst Du das nächste umgebende Feld und prüfst neu auf Übereinstimmung.

Bist Du einmal komplett um Dein aktuelles Feld herum, prüfst Du das nächste Feld in der Hauptmatrix. Leere Felder kannst Du natürlich übergehen.

Das Ganze programmiert man mit Variablen für Zeile und Spalte und einem Index für das umgebende Feld in einer Schleifenstruktur.

Falls du das Vier Gewinnt selber programmieren möchtest (aus Spaß, zum Lernen, whatever), dann betrachte die Antwort als gegenstandslos.

Falls du einfach ein Vier Gewinnt in Excel haben möchtest, kannst du das hier http://excelformeln.de/tips.html?welcher=95 probieren. Sogar ohne VBA.

Ich kenne VBA nicht so genau aber so in der Art: foreach cell{ If(Cell.text =="x") GetNeighbourCells(Cell); } GetNeighbourCells(Cell c){ foreach(NeighbourcellOf(c) nc{ If(NC.Text=="x"){ Relation r = GetRelation(c,nc)//rausfinden wie die Zellen zueinander liegen. E.g. diagonal, horizontal If(CheckOtherDirection(r,c,nc))//Schauen ob auf der anderen Seite ein x ist, wenn ja eine Zelle weiter auf der anderen Richtung schauen, wenn wieder ja nochmal in andere Richtung schauen. //in "originalrichtung", also wenn c=C5 und NC=C6, checke C7

} } }