Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1636to1640
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Beim Brettspiel Reversi Züge mit VBA ausschließen

Beim Brettspiel Reversi Züge mit VBA ausschließen
07.08.2018 19:11:55
KlausF
Moin.
Ich habe mal vor fast 20 Jahren angefangen, ein einfaches Strategie-Brettspiel für mich zu programmieren: Reversi.
Damals habe ich das dann wegen eines Zugproblems, das ich nicht lösen konnte, weggelegt. Wer es nicht kennt in Kurzform:
Ein 8 x 8 Felder großes Spielfeld und 64 Steine, die auf der einen Seite schwarz und auf der anderen Seite weiß sind.
Jeder bekommt 32 Steine. Je 2 weiße und 2 schwarze Steine liegen in der Grundstellung in der Brettmitte aneinander.
Es wird nun abwechselnd gesetzt und dabei Steine des Gegners horizontal, vertikal oder diagonal in zusammenhängender
Reihe eingeschlossen und zu Steinen seiner eigenen Farbe „gedreht“. Falls mit einem Stein mehrere Reihen gedreht werden
könnten, muss man sich für eine Reihe entscheiden.
Ich habe jetzt den Zugmechanismus soweit, dass ich per Doppelklick auf meine Farbe und erneutem Doppelklick
auf ein leeres Feld die eingeschlossenen gegnerischen Steine zu meiner Farbe drehen kann:
https://www.herber.de/bbs/user/123192.xls
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
If Intersect(Target, Range("Spielbrett")) Is Nothing Then Exit Sub
Cancel = True
Dim rngWert As Range
Set rngWert = Worksheets("Helpers").Range("WerIstDran")
Dim ZugWert As Integer
Dim strFarbe As String
ZugWert = rngWert.Value '100 oder -1
strFarbe = IIf(ZugWert = 100, "blau", "orange")
Dim xRow As Integer, xCol As Integer, yRow As Integer, yCol As Integer
Static rng As Range
If rng Is Nothing Then
Set rng = Target
Exit Sub
End If
xRow = rng.Row
xCol = rng.Column
yRow = ActiveCell.Row
yCol = ActiveCell.Column
If Cells(xRow, xCol) = "" Then MsgBox "Zuerst die Farbe " & strFarbe & " doppelklicken und dann  _
das leere Feld !": GoTo ABBRUCH
If Cells(xRow, xCol)  ZugWert Then MsgBox strFarbe & " ist am Zug !": GoTo ABBRUCH
'Wenn weiter gespielt werden soll als nur Zug 9, dann folgende Zeile auskommentieren:
If Target.Offset(0, 30)  1 Then MsgBox "Ungültiges Feld !": GoTo ABBRUCH
While xRow  yRow Or xCol  yCol
If xRow  yRow Then
xRow = xRow - 1
End If
If xCol  yCol Then
xCol = xCol - 1
End If
Cells(xRow, xCol).Value = ZugWert
Wend
'If Worksheets("Setzfelder").Range("Aussetzen")  1 Then
If rngWert = 100 Then
rngWert = -1
Else
rngWert = 100
End If
'End If
ABBRUCH:
Range("Spielbrett").Cells(0, 0).Select
Set rng = Nothing
Set rngWert = Nothing
End Sub
Aber: Leider wird auch dann gedreht, wenn das leere Feld nicht nur in horizontaler, vertikaler oder diagonaler Richtung liegt
sondern auch „um die Ecke“ (also z.B. wie das Pferd im Schach). Ich komme da auf keine Lösung. Genaueres in der
(stark abgespeckten) Datei. Und ... mein Excel ist uralt (Excel 2000 bzw. Excel X).
Ist das überhaupt realisierbar?
Gruß
Klaus

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Beim Brettspiel Reversi Züge mit VBA ausschließen
08.08.2018 16:57:24
Matthias
Moin!
Füge mal das hier vor deiner while Schleife ein. Damit sollte dein Fehler behoben sein und auch die Möglichkeit 2 nebeneinander liegende Felder anzuklicken behoben sein. Der Code prüft dabei nur die Abstände. Bei Diagonalen müssen x und y jeweils die selbe Differenz bilden (von Anfang zum Zielfeld). Beim anderen darf die Differenz nicht bei beiden 1 bzw. 1 und 0 sein (sonst liegen die Felder nebeneinander).
VG
If ((xRow - yRow)  0 And (xCol - yCol  0)) And ((xRow - yRow)  (xCol - yCol)) Then
MsgBox "Ungültiger Zug. Die beiden Punkte liegen nicht auf einer Diagonalen!"
GoTo ABBRUCH
End If
If (Abs(xRow - yRow) = 1 And Abs(xCol - yCol) = 0) Or (Abs(xRow - yRow) = 0 And Abs(xCol - yCol) _
= 1) Or (Abs(xRow - yRow) = 1 And Abs(xCol - yCol) = 1) Then
MsgBox "Ungültiger Zug. Es muss mindestens ein gegnerisches Feld dazwischen liegen!"
GoTo ABBRUCH
End If

Anzeige
Wow
08.08.2018 18:03:01
KlausF
Hallo Matthias.
absolut genial und so einfach, dass sogar ich das verstanden habe!
Auch super, dass Du gleich die zweite Krücke mit behoben hast.
Da war ich parallel auch schon am Brüten ...
Ganz herzlichen Dank Dir dafür!
Gruß
Klaus
Doch noch ein Haken
08.08.2018 18:33:13
KlausF
Hallo Matthias,
da ist doch noch etwas inkorrekt. Bei der Ausgangsstellung wie Dateianhang scheitert
es am ersten Zug diagonal. Merkwürdigerweise nur nach rechts oben. Links oben funktioniert.
Also D5 nach F3 funktioniert nicht, E5 nach C3 aber schon. Was ist da falsch?
https://www.herber.de/bbs/user/123215.xls
Gruß
Klaus
Anzeige
evtl. gefunden
08.08.2018 19:01:17
KlausF
Hallo Matthias,
könnte sein, dass ich den Fehler gefunden habe
If ((xRow - yRow) 0 And (xCol - yCol 0)) And (Abs(xRow - yRow) Abs(xCol - yCol)) Then
muss es wohl lauten.
Ich teste noch mal weiter ...
Gruß
Klaus
AW: evtl. gefunden
08.08.2018 20:02:39
Matthias
Moin!
Genau da hatte ich das Abs vergessen. Zudem müsstest du noch auf Gleichheit der Doppelclicks testen. Also das hier
(xRow = yRow And xCol = yCol)
Damit kannst du vermeiden, dass man zweimal das selbe Feld anklickt und dann der Gegner dran ist.
VG
passiert schon
08.08.2018 21:27:47
KlausF
Hallo Matthias,
Danke für Deine Antwort und Bestätigung. Gleichheit der Doppelklicks wird schon abgefangen durch
If Target.Offset(0, 30).Value 1 Then MsgBox "Ungültiges Feld": GoTo ABBRUCH
Für eine Zugbewertung muss ich sowieso immer alle Zugmöglichkeiten im Blick haben ...
Nochmals Danke für Deinen Einsatz!
Gruß
Klaus
Anzeige
AW: evtl. gefunden
08.08.2018 20:07:21
Matthias
Und nochmal ich!
Gibt da noch einen entscheidenen Fehler. In der while Schleife änderst du gleich die Farbe. Ich würde dort nur die Zellen prüfen und in einem Array zwischenspeichern. Wenn dann alles gepasst hat, im Anschluß die Farbe ändern. Der Fehler ist, dass dein Code einfach ändert aber nicht prüft, ob wirklich nur blaue Felder dazwischen liegen. In der while also prüfen, dass die nächste Zelle (die du änderst) die andere Farbe hat. Wenn ja Adresse im Array zwischenspeichern, wenn nein Abbrechen. Ansonsten kannst du auch leere Felder einfärben bzw. eigenen Steine überspringen.
VG
Anzeige
eben erst gesehen
08.08.2018 21:36:41
KlausF
Hi,
habe deinen Hinweis erst jetzt gesehen. Ist aber glaube ich nicht notwendig, weil vorher alle möglichen
Fehlerzüge abgefangen werden. Einmal durch Deinen Code und einmal durch meine drei vorherigen Abfragen.
Oder kannst Du mir eine Steinaufstellung geben, die so einen Fehler in sich trägt?
Bisher läuft in meinen Tests alles schlank durch.
Gruß
Klaus
AW: eben erst gesehen
09.08.2018 18:48:40
Matthias
MOin!
Hatte wie im Code von dir bemerkt, die rel. Zeile auskommentiert, um weiter spielen zu können. Damit war es möglich. Allerdings wurde da auch nicht die Zugauswahl aktualisiert. Vllt. lag es auch daran.
VG
Anzeige
Zugauswahl wird nicht aktualisiert
09.08.2018 19:25:22
KlausF
Moin Matthias,
ja genau. Normalerweise stecken 3 Blätter Formeln hinter dem Feld Zugauswahl, die nicht nur immer alle
möglichen Zugfelder ermitteln, sondern auch eine interne Bewertung der einzelnen Züge vornehmen.
Sozusagen eine Form von künstlicher Intelligenz. Das (ferne) Endziel ist ja, dass man eines Tages gegen den
Computer spielen könnte. In der Fragedatei waren keine Formeln vorhanden.
Wenn es Dich interessiert:
Ich versuche (vorerst) mit zwei Hauptkriterien auszukommen. Am höchsten bewertet werden die Felder, auf die
beide Spieler setzen könnten (= Spielmöglichkeiten des Gegners minimieren) und ein Feld, auf das nur ich
im nächsten Zug setzen kann wird vorerst ignoriert (den Zug kann ich mir aufsparen).
Und dann gibt es noch eine grundsätzliche Bewertung von guten und schlechten Feldern
(gut = z.B. Eckpunkte, schlecht = z.B. die Felder schräg vor den Eckpunkten).
Und dann gibt es auch noch das Aussetzen-Problem, wenn einer mal keine Setzfelder mehr hat ...
So long
Klaus
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige