 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 25.08.2009, 15:20 Titel: Mühlespiel-Probleme |
|
|
Hallo,
ich versuche in Qbasic 4.5 ein Mühlespiel nach den offiziellen Regeln des Mühleweltdachverbandes www.muehlespiel.eu zu programmieren.
Dazu habe ich mir mit Line das Spielfeld gezeichnet. Die Steine werden mit dem Befehl PUT als Sprite gesetzt. Die Anzahl der gesetzten Steine werden schon erkannt. (Abfrage) ob auf einem Spielfeld ein Stein sitzt, ist ebenfalls schon vorhanden. 18 Steine werden gesetzt, dann ist Ende mit dem Setzen. Mühlen werden noch nicht erkannt. Leider ist ein winziger Bug in meinem Quellcode drin. Bei normaler Spielweise tritt dieser nicht auf. Wer findet diesen Bug und weiß wie man ihn beheben kann?
Wäre jemand bereit, für mich Algorithmen zur Verfügung zu stellen? Im Programm müsste schon einer drin sein.
Nun meine Fragen:
1. Wie entferne ich die Steine ohne dabei den Hintergrund mit zu löschen.
Das Spielfeld bzw. die Linien die mit dem Befehl Line angezeigt werden sollen natürlich nach dem löschen bleiben.
2. Wie werden geschlossene Mühlen beim Setzen/Ziehen vom Programm erkannt. Stehe im Moment ein wenig auf dem Schlauch.
3. Hat von euch jemand schon mal eine KI für Mühle gesehen/programmiert?
Im Internet habe ich bisher nicht viel gefunden. Die würde ich am Anfang erstmal weglassen.
Im Quellcode habe ich die Datei mausmodl.bas verwendet.
Quellcode:
Code: |
Hauptprogramm:
DECLARE SUB maus (OnOff%)
DECLARE SUB getmaus ()
DECLARE SUB poken ()
DECLARE SUB MausSet (X%, Y%)
DECLARE SUB SPIELFELD ()
COMMON SHARED mausk%, mausx%, mausy%
DIM SHARED Sprites(1 TO 260, 1 TO 49) AS INTEGER
DEF SEG = VARSEG(Sprites(1, 1))
BLOAD "W.BLD", VARPTR(Sprites(1, 1))
BLOAD "S.BLD", VARPTR(Sprites(1, 2))
BLOAD "EXIT.BLD", VARPTR(Sprites(1, 1))
DIM SHARED FELD(1 TO 24)
DIM SHARED STEINFARBE(1 TO 24)
poken
MausSet 320, 360
FARBE = 1
Steine = 18
X = 0
SCREEN 12: DEFINT Z
WIDTH 80, 60
SPIELFELD
LOCATE 34, 58: PRINT "Weiß: "; Steinw; " "
LOCATE 36, 58: PRINT "Schwarz: "; Steins; " "
maus 1
getmaus
beginn:
DO
A$ = INKEY$
SELECT CASE A$
CASE CHR$(27): SYSTEM
END SELECT
getmaus
REM LOCATE 58, 1: PRINT "X:"; mausx%; " "; "Y:"; mausy%; " "; "K:"; mausk%; " "
IF mausx% > 9 AND mausx% < 31 THEN X1 = 10: X2 = 30: X = 4
IF mausx% > 59 AND mausx% < 81 THEN X1 = 60: X2 = 80: X = 54
IF mausx% > 109 AND mausx% < 131 THEN X1 = 110: X2 = 130: X = 104
IF mausx% > 209 AND mausx% < 231 THEN X1 = 210: X2 = 230: X = 204
IF mausx% > 309 AND mausx% < 331 THEN X1 = 310: X2 = 330: X = 304
IF mausx% > 359 AND mausx% < 381 THEN X1 = 360: X2 = 380: X = 354
IF mausx% > 409 AND mausx% < 431 THEN X1 = 410: X2 = 430: X = 404
IF mausy% > 9 AND mausy% < 31 THEN Y1 = 10: Y2 = 30: Y = 4
IF mausy% > 59 AND mausy% < 81 THEN Y1 = 60: Y2 = 80: Y = 54
IF mausy% > 109 AND mausy% < 131 THEN Y1 = 110: Y2 = 130: Y = 104
IF mausy% > 209 AND mausy% < 231 THEN Y1 = 210: Y2 = 230: Y = 204
IF mausy% > 309 AND mausy% < 331 THEN Y1 = 310: Y2 = 330: Y = 304
IF mausy% > 359 AND mausy% < 381 THEN Y1 = 360: Y2 = 380: Y = 354
IF mausy% > 409 AND mausy% < 431 THEN Y1 = 410: Y2 = 430: Y = 404
IF X = 4 AND Y = 404 THEN A = 1
IF X = 204 AND Y = 404 THEN A = 2
IF X = 404 AND Y = 404 THEN A = 3
IF X = 54 AND Y = 354 THEN A = 4
IF X = 204 AND Y = 354 THEN A = 5
IF X = 354 AND Y = 354 THEN A = 6
IF X = 104 AND Y = 304 THEN A = 7
IF X = 204 AND Y = 304 THEN A = 8
IF X = 304 AND Y = 304 THEN A = 9
IF X = 4 AND Y = 204 THEN A = 10
IF X = 54 AND Y = 204 THEN A = 11
IF X = 104 AND Y = 204 THEN A = 12
IF X = 304 AND Y = 204 THEN A = 13
IF X = 354 AND Y = 204 THEN A = 14
IF X = 404 AND Y = 204 THEN A = 15
IF X = 104 AND Y = 104 THEN A = 16
IF X = 204 AND Y = 104 THEN A = 17
IF X = 304 AND Y = 104 THEN A = 18
IF X = 54 AND Y = 54 THEN A = 19
IF X = 204 AND Y = 54 THEN A = 20
IF X = 354 AND Y = 54 THEN A = 21
IF X = 4 AND Y = 4 THEN A = 22
IF X = 204 AND Y = 4 THEN A = 23
IF X = 404 AND Y = 4 THEN A = 24
SELECT CASE mausk%
CASE 1
SELECT CASE mausx%
CASE X1 TO X2
SELECT CASE mausy%
CASE Y1 TO Y2
IF FELD(A) = 0 THEN
FELD(A) = 1
STEINFARBE(A) = FARBE
REM 0= unbesetzt, 1= Rot Stein, 2= Blauer Stein
maus 0: GOTO Setzen
END IF
END SELECT
END SELECT
SELECT CASE mausx%
CASE 592 TO 623
SELECT CASE mausy%
CASE 432 TO 463
SYSTEM
END SELECT
END SELECT
END SELECT
LOOP
Setzen:
PUT (X, Y), Sprites(1, FARBE), PSET
maus 1
Stein = 18 - Steine
IF Stein MOD 2 <> 0 THEN
Steins = (INT(Stein / 2)) + 1
ELSE
Steins = (INT((Stein - 1) / 2)) + 1
END IF
IF Stein MOD 2 <> 0 THEN
Steinw = Steins
ELSE
Steinw = Steins + 1
END IF
LOCATE 34, 58: PRINT "Weiß: "; Steinw; " "
LOCATE 36, 58: PRINT "Schwarz: "; Steins; " "
FARBE = FARBE + 1
IF FARBE > 2 THEN FARBE = 1
Steine = Steine - 1
IF Steine > 0 THEN GOTO beginn
SYSTEM
|
Code: |
Unterprogramm:
DEFSNG A-Z
SUB SPIELFELD
X = 20
Y = 20
A = 50
B = 350
C = 100
D = 300
LINE (X, Y)-(X, X + 400): REM Außen Links
LINE (X + 400, Y)-(Y + 400, X + 400): REM Außen Rechts
LINE (X, Y)-(X + 400, Y): REM Außen Oben
LINE (X, Y + 400)-(X + 400, Y + 400): REM Außen Unten
LINE (X + A, Y + A)-(X + A, Y + B): REM Mitte LINKS
LINE (X + B, Y + A)-(X + B, Y + B): REM Mitte Rechts
LINE (X + A, Y + A)-(X + B, Y + A): REM Mitte Oben
LINE (X + A, Y + B)-(X + B, Y + B): REM Mitte Unten
LINE (X + C, Y + C)-(X + C, Y + D): REM Innen LINKS
LINE (X + D, Y + C)-(X + D, Y + D): REM Innen Rechts
LINE (X + C, Y + C)-(X + D, Y + C): REM Innen Oben
LINE (X + C, Y + D)-(X + D, Y + D): REM Innen Unten
LINE (220, 20)-(220, 120)
LINE (220, 320)-(220, 420)
LINE (20, 220)-(120, 220)
LINE (320, 220)-(420, 220)
PUT (592, 432), Sprites(1, 1), PSET: REM EXIT
END SUB
|
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 25.08.2009, 19:18 Titel: |
|
|
Tja, wenn ich mein eigenes Mühlespiel nicht wieder eingeschlafen wäre, könnte ich es dir natürlich zur Verfügung stellen ...
Zitat: | 1. Wie entferne ich die Steine ohne dabei den Hintergrund mit zu löschen. |
Wenn du nicht den Stein mit XOR zeichnen willst (und das sieht auch sicher nicht sehr hübsch aus), könntest du z. B. für jedes Feld den Hintergrund speichern (GET) und beim Entfernen des Steins wieder hinPUTen. Dann schleppst du halt im ganzen Spiel die 24 Grafikspeicher mit herum.
Mir ist das manchmal zu aufwändig, und ich lösche einfach das ganze Feld und zeichne es inklusive restlicher Steine neu.
Zitat: | 2. Wie werden geschlossene Mühlen beim Setzen/Ziehen vom Programm erkannt. Stehe im Moment ein wenig auf dem Schlauch. |
Habe ich mittels Reihen gemacht. Eine Reihe enthält die drei Felder, aus der sie gebildet wird, und ich gehe alle zwölf Reihen durch, ob in einem alle Felder mit demselben Stein belegt sind.
Nachteil: Wenn du überprüfen willst, ob ein Stein zu einer Mühle gehört (z. B. Stein-Entfernen wegen gegnerischer Mühle), dann musst du auch hier alle Reihen durchgehen, ob in einer den gesuchten Stein enthält und beide anderen Felder dieselbe Farbe haben.
Zitat: | 3. Hat von euch jemand schon mal eine KI für Mühle gesehen/programmiert? |
Ähm, ja, siehe oben. Ich mache das in etwa so:
Der Computer geht alle möglichen Züge durch, führt danach (rekursiv) alle möglichen Gegnerzüge durch usw. bis eine gewünschte Suchtiefe erreicht ist. Dann bewertet er das Spielfeld, und jeder Rekursionsschritt versucht das beste herauszuholen.
Code: | function computerzug(spieler as integer, tiefe as integer) as integer
if tiefe = 0 then return bewertung
dim as integer i, wert, iMax, wertMax
for i = 1 to AnzahlAllerZuege
fuehreZugDurch(i)
wert = - computerzug(gegenspieler, tiefe - 1)
if wert > wertMax then
wertMax = wert
iMax = i
end if
macheZugRueckgaengig(i)
next
if tiefe = MaximaleSuchtiefe then ' Durchführung auf oberster Ebene
fuehreZugDurch(iMax)
end if
computerzug = iMax
end function |
Ist jetzt auf die schnelle hingeschrieben, sollte aber prinzipiell richtig sein. Funktioniert auch normalerweise ganz gut, muss aber (je nach Suchtiefe und Bewertungssystem) keine besonders intelligente KI sein.
Ich habe da auch das erste Mal an der Alpha-Beta-Suche probiert, bin aber nicht lang genug dran geblieben, um sie fehlerfrei hinzubekommen.
[ot]Warum ist es eigentlich so negativ, wenn man sich in der Zwickmühle befindet? Ist doch gut, dann kann der Gegner sie nicht schließen.[/ot] _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 25.08.2009, 20:14 Titel: |
|
|
Ich danke vielmals für die schnelle Antwort!
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05
Zuletzt bearbeitet von ALWIM am 24.01.2010, 05:11, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.08.2009, 22:12 Titel: |
|
|
Von mir sonst noch ein Codebeispiel aus der Vergangenheit:
http://beilagen.dreael.ch/QB/MUEHLE.BAS
Umfasst eigentlich bereits eine "Human vs. Human"-Version, d.h. noch ohne Computergegner. Letzteres dürfte noch eine kleine Herausforderung für Dich darstellen.
Sonst ebenfalls denkbar: Das Ganze nach FreeBasic portieren, von TCP/IP-Socketkommunikation (Windows: WINSOCK.DLL) Gebrauch machen, so dass man übers Internet zu zweit gegeneinander spielen kann. Alternativ in QB auch mit diesem Artikel möglich. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 26.08.2009, 00:30 Titel: |
|
|
@dreal: Programm funktioniert, aber es sind ein paar kleine Fehler drin.
1. Fehler
Aus der Mühle darf man bekanntlich keinen nehmen. Beim Setzen ist das aber der Fall, wenn der eine nur noch Mühlen hat. Wenn der eine nur noch 3 Steine hat, und der andere schließt eine Mühle, steht da Spieler 1 hat gewonnen. Geht nicht.
2. Fehler
Wenn ich beim setzen 2 Mühlen gleichzeitig schließe, kann ich trotzdem nur einen Stein wegnehmen. Auch ein Fehler.
Zugunfähigkeit wird Gott sei Dank erkannt!
Für die anderen:
Ich versuche das ganze mit Maussteuerung zu programmieren. Grafisch so gut wie möglich. Und das ganze natürlich nach den offiziellen Regeln des Mühleweltdachverbandes. Aus der Mühle darf man keinen Stein nehmen. Auch dann nicht wenn der andere nur noch 3 Steine hat. Wenn man beim Setzen 2 Mühlen gleichzeitig schließt darf man 2 Steine wegnehmen. Sorgen macht mir auch die Fünfzig-Züge-Regel sowie die 3-Fache-Stellungswiederholung. Zugunfähigkeit eines Spielers sollte auch beachtet werden.
Ich habe bisher noch kein Mühleprogramm gesehen was all diese Regeln beachtet!
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2009, 01:23 Titel: |
|
|
Zitat: | Wenn man beim Setzen 2 Mühlen gleichzeitig schließt darf man 2 Steine wegnehmen. |
Hoppla, das ist mir neu (naja, wird ja auch nicht allzu häufig vorkommen)
Hast du dazu einen Regellink? Die Regeln, die ich bei mühlespiel.eu finde, sind ja nicht gerade umfangreich ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2009, 17:45 Titel: |
|
|
Ah, das sieht schon besser aus. Die Turnierregeln kannte ich nämlich noch nicht, und es schadet nie, sowas mal gelesen zu haben.
Die 50-Zug-Regelung ist nicht schwer umzusetzen. Du lässt einfach einen Zähler für die Züge mitlaufen, und sobald ein Stein geschlagen wird, setzt du ihn wieder auf 0. Wenn er 50 erreicht, endet das Spiel Remis.
Die gleiche Stellung innerhalb von drei Zügen ist schon schwieriger. Das einzige, was ich mir vorstellen kann, ist eine Speicherung der jeweils letzten sechs Situationen und ein Vergleich der aktuellen Situation mit allen sechs vorangehenden.
Wie macht man das eigentlich in der Praxis bei einem Turnier? Wie weise ich nach, dass in den letzten 50 Zügen nicht geschlagen wurde, wenn kein Notieren der Partie erlaubt ist?  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 26.08.2009, 19:43 Titel: |
|
|
Hallo,
ich würde nachdem eine Mühle geschlossen wurde im Kopf mitzählen.
Bei 50 Zügen reklamiert man dann.
Beim Schach mache ich es genauso. Da zähle ich im Kopf mit wenn ich der Meinung bin das keine Figur mehr geschlagen bwz. kein Bauer mehr bewegt wird.
Es hat mal einer ein Schachprogramm in Qbasic geschrieben. Da ist die 3-fache-Stellungswiederholung drin. Habe aber keine Ahnung wie der das gemacht hat. Zu finden auf www.qbasic.de im Downloadbereich.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2009, 20:19 Titel: |
|
|
Ist es bereits ein Nachweis, wenn ich behaupte, ich habe mitgezählt?
Bezieht sich die Stellungswiederholung (bei Mühle) nur genau auf diese Stellung oder auch auf gedrehte oder gar gespiegelte? Dann würde es nämlich wirklich aufwändig. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 27.08.2009, 12:33 Titel: |
|
|
Hallo,
Ja, denn der Gegner wird ja sicher auch mitzählen. Möchte ja gewinnen.
Sobald eine Stellung zum dritten mal auf das Brett kommt, ist es Remis wenn reklamiert wird. (Muss nicht hintereinander oder innerhalb von 3 Zügen sein.) Jeder der Steine ist zum dritten Mal auf dem selben Feld. Gespiegelte - gedrehte nein, die Steine sind ja nicht mehr auf dem selben Feld.
Jetzt funktioniert bei mir schon mal die Mühleerkennung, aber es sind 32 Zeilen mit einer IF-Abfrage geworden. Wie ich die Steine jetzt entferne weiß ich auch schon. Das mit der 50 Zügeregel ist auch kein Problem. Ein einfacher Zähler und das wars. Hatte ich sowiso schon im Kopf. Habe an Schach gedacht. Da ist es ein wenig schwieriger. 3-Fache Stellungswiederholung, Zugunfähigkeit, sowie die 2 geschlossenen Mühlen auf einmal, werde ich mir noch überlegen müssen wie ich das mache.
Ein Problem was ich bekam war/ist beim Entfernen eines Steines. Ich klickte mit der Maus auf das Feld, Stein wurde entfernt, aber neuer gleich wieder gesetzt. Im Moment entferne ich die Steine mit der rechten Maustaste, bis ich eine Lösung für das Problem gefunden habe.
Wenn programmieren nicht so schwer wäre, hätte ich Microsoft schon längst eines meiner Betriebssysteme verkauft.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2009, 14:45 Titel: |
|
|
Zugunfähigkeit sollte nicht schwer sein. Der Computergegner muss ja sowieso seine gültigen Züge durchrechnen, und wenn er keinen gültigen findet, hat er verloren. Ansonsten einfach für jeden Stein schauen, ob einer der zwei bis vier Nachbarfelder frei ist; sobald sich eines findet, gibt es auch eine Zugmöglichkeit. Wenn nicht, dann hat der Spieler verloren.
Zwei geschlossene Mühlen auf einmal sollte auch gut machbar sein.
Die dreifache Stellungswiederholung hatte ich falsch verstanden. Wenn du das wirklich umsetzen willst, müsstest du am besten für jede mögliche Stellung zählen, ob und wie oft sie dran war. Das sind aber selbst im optimierten Fall ziemlich viele Möglichkeiten (bin jetzt zu faul, das auszurechnen, sowas in der Art von (9 aus 24) mal (9 aus 15)? Irgend ein Statistiker oder Matheleistungskursler hier? Wenn die Rechnung stimmt, sind es über 6,5 Mrd. verschiedene Stellungsmöglichkeiten mit 18 Steinen auf dem Tisch, nicht eingerechnet die mit weniger Steinen ...
Wenn ein assoziatives Array zur Verfügung stände, würde ich es wohl trotzdem so machen. Andere (hier wohl sinnvollere) Möglichkeit: Ein Array, in dem du alle gespielten Situationen speicherst, evtl. ein zweites, in dem du die speicherst, die ein zweites mal gefallen sind, und ein ständiger Vergleich der aktuellen Situation mit allen vorangegangenen. Auch nicht unbedingt sehr nett.
Zitat: | Ein Problem was ich bekam war/ist beim Entfernen eines Steines. Ich klickte mit der Maus auf das Feld, Stein wurde entfernt, aber neuer gleich wieder gesetzt. Im Moment entferne ich die Steine mit der rechten Maustaste, bis ich eine Lösung für das Problem gefunden habe. |
Vermutung: Du musst eine Warteschleife einbauen, die auf das Loslassen der Maus wartet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 27.08.2009, 15:25 Titel: |
|
|
Hallo,
Zitat: | Zitat:
Ein Problem was ich bekam war/ist beim Entfernen eines Steines. Ich klickte mit der Maus auf das Feld, Stein wurde entfernt, aber neuer gleich wieder gesetzt. Im Moment entferne ich die Steine mit der rechten Maustaste, bis ich eine Lösung für das Problem gefunden habe.
Vermutung: Du musst eine Warteschleife einbauen, die auf das Loslassen der Maus wartet. |
Daran habe ich auch schon gedacht. Habe das mal in einem anderen Programm gemacht. Ich weiß leider nicht mehr wo ich den Quellcode habe. Ich klickte mit der Maus auf einen Button, erst beim loslassen gings weiter.
@dreael:
Wie funktioniert denn genau deine Mühleprüfung im Programm?
Bei mir wird nachdem eine Mühle erkannt wird und ein Stein gesetzt wurde, wieder eine Mühle erkannt. Eigentlich die gleiche. Ich habe das mit 32 IF-Abfragen versucht.
Steine durch eine geschlossene Mühle werden bei mir jetzt entfernt. Alles wird gelöscht und Spielfeld sowie noch vorhandene Steine neu gezeichnet.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2009, 16:16 Titel: |
|
|
Sinnvoll wäre es, nicht nach irgendeiner Mühle zu suchen, sondern nach einer, die den gesetzten Stein beinhaltet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 27.08.2009, 22:04 Titel: |
|
|
Erst einmal Danke fürs Interesse an diesem Codebeispiel von "Nünimol" (=Dialektausdruck in .ch fürs Mühlespiel). Auch schon wieder 5½ Jahre her, als es entstanden war... ;-)
ALWIM hat Folgendes geschrieben: | 1. Fehler
Aus der Mühle darf man bekanntlich keinen nehmen. Beim Setzen ist das aber der Fall, wenn der eine nur noch Mühlen hat. Wenn der eine nur noch 3 Steine hat, und der andere schließt eine Mühle, steht da Spieler 1 hat gewonnen. Geht nicht. |
Bin noch nicht ganz schlau geworden. Kannst Du uns wie im folgenden Beispiel
Code: | O-----O-----O 1
| | |
| O---X---O | 2
| | | | |
| | X-+-+ | | 3
| | | | | |
+-+-X +-O-+ 4
| | | | | |
| | X-+-+ | | 5
| | | | |
| X---+---+ | 6
| | |
O-----X-----+ 7
A B C D E F G |
mit einer ASCII-Skizze in Code-Tags eine konkrete Situation zusammenstellen und rasch erklären (z.B. "Stein B6 steht falsch" o.ä.), was nicht stimmt?
ALWIM hat Folgendes geschrieben: | 2. Fehler
Wenn ich beim setzen 2 Mühlen gleichzeitig schließe, kann ich trotzdem nur einen Stein wegnehmen. Auch ein Fehler. |
Danke für diesen Feedback. Aktuell sucht die SUB-Routine PruefeMuehle() zwar sowohl horizontal als auch vertikal, aber "merkt" sich nur eines davon, d.h. Fall zwei gleichzeitig entstehende Mühlen in der Setzphase werden noch nicht behandelt. Nehme ich sonst als BugfixPendenz fürs berühmte verregnete Wochenende einmal gerne entgegen. :-)
ALWIM hat Folgendes geschrieben: | Ich versuche das ganze mit Maussteuerung zu programmieren. Grafisch so gut wie möglich. |
Darstellung bei mir seinerzeit rein funktionell mit dem DOS-Zeichensatz (Rahmenzeichen) gelöst und Bedienung mittels Pfeiltasten.
ALWIM hat Folgendes geschrieben: | Wie funktioniert denn genau deine Mühleprüfung im Programm? |
Zuerst einmal vorab wieder etwas zur Programm-"Architektur": Eine zentrale Rolle beinhalten die beiden Felder feld%() und mgraph%(). feld%() bildet im Wesentlichen das Spielfeld. Index entspricht Position:
Code: | 6---------7--------0
| | |
| 14----15-----8 |
| | | | |
| | 22-23-16 | |
| | | | | |
5--13-21 17--9--1
| | | | | |
| | 20-19-18 | |
| | | | |
| 12----11----10 |
| | |
4---------3--------2 |
Wert entspricht Zustand: 0=leer, 1=Stein von Spieler 1 (blau), 2=Stein von Spieler 2 (rot). mgraph%() beinhaltet im Stil des Abenteuerspiel-Artikels die Verbindungsinformationen sämtlicher 24 Felder (wird zu Beginn initialisiert). Erster Index=Feldnummer wie in Skizze, zweiter Index = Richtung (0=rechts, 1=unten, 2=links, 3=oben). Wert=Feldnummer bzw. -1 für "Rand", d.h. wo es mit einer Linie nicht weitergeht. Beispiel Feld 3:
mgraph%(3,0)=2
mgraph%(3,1)=-1
mgraph%(3,2)=4
mgraph%(3,3)=11
Hinweis: Skizze oben studieren, dann sollte der Aufbau hoffentlich sofort klar sein! In dem Sinn wird also mit mgraph%() das Mühlespielfeld als Graph abgebildet.
Ausser der Cursortastensteuerung "weiss" das Spiel somit auch gleichzeitig, welches die "Ziehfelder" eines Steins sind, wenn man noch nicht beliebig springen kann. Und PruefeMuehle() verwendet mgraph%() ebenfalls: von der gegebenen Position (Übergabeparameter p%) z.B. ganz nach links bzw. oben traversieren (mit WHILE gelöst) und dann nach rechts bzw. unten: Wenn dabei alle traversierten Felder die Steinfarbe des Spielers besitzen, dann liegt eine komplette Mühle vor: Dieses mgraph%() eliminiert also an sehr vielen Stellen lange Codewiederhol-Tabellen-IF-Aufzählungen.
Natürlich zieht sich mgraph%() durch so ziemlich den ganzen Code; auch Dinge wie, ob sich der Stein überhaupt bewegen lässt und damit schlussendlich, ob der Spieler überhaupt noch zugfähig ist, lässt sich so ebenfalls recht effizient ausprogrammieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2009, 22:29 Titel: |
|
|
Zitat: | 1. Fehler
Aus der Mühle darf man bekanntlich keinen nehmen. Beim Setzen ist das aber der Fall, wenn der eine nur noch Mühlen hat. Wenn der eine nur noch 3 Steine hat, und der andere schließt eine Mühle, steht da Spieler 1 hat gewonnen. Geht nicht. |
Ich denke, er meint so etwas:
Code: | O-----O-----O 1
| | |
| +---+---+ | 2
| | | | |
| | X-+-+ | | 3
| | | | | |
+-+-X +-+-+ 4
| | | | | |
| | +-+-+ | | 5
| | | | |
| +---+---+ | 6
| | |
+-----+-----+ 7
A B C D E F G |
Setzphase: X setzt einen Stein auf C5 und schließt damit die Mühle in C. Daraufhin nimmt er O einen Stein aus Reihe 1 weg, weil es keine anderen gibt - das darf er aber nicht. Weil O nun angeblich den drittletzte Stein verloren hat, hat X gewonnen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 31.08.2009, 18:17 Titel: |
|
|
Hallo,
Zitat: | Zitat von Nemored:
Setzphase: X setzt einen Stein auf C5 und schließt damit die Mühle in C. Daraufhin nimmt er O einen Stein aus Reihe 1 weg, weil es keine anderen gibt - das darf er aber nicht. Weil O nun angeblich den drittletzte Stein verloren hat, hat X gewonnen. |
Beim Ziehen ist das der Fall.
Hat der eine beim Setzen nur noch Mühlen darf man bei dem Programm trotzdem einen Stein nehmen.
Habe es jetzt geschafft, das das Setzen der Steine nach den offiziellen Regeln funktioniert.
1. Aus der Mühle darf man keinen nehmen. Auch wenn der andere nur Mühlen hat.
2. Schließt man beim Setzen 2 Mühlen, so ist der andere berechtigt 2 Steine zu nehmen.
Jetzt fehlt mir noch das ziehen der Steine, wofür ich schon eine Idee habe und die 3-fache-Stellungswiederholung.
Leider wurde mein Quellcode ein wenig zu unübersichtlich (zu schlecht programmiert), aber es funktioniert. Liegt auch ein wenig an der Mausroutine. Die musste unbedingt drin sein.
Ich hätte nie gedacht das Mühle so schwer zu programmieren ist.
Ob Damespiel leichter zu programmieren ist?
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 31.08.2009, 18:46 Titel: |
|
|
Leichter vermutlich nicht. Aber wenn du das machst, dann bitte nicht die deutsche, sondern die polnische Dame. Ist viel schöner.
Für dein Stellungswiederholungs-Problem könnte ich mir vielleicht so etwas vorstellen:
- String-Array anlegen, in dem du die bisherigen Stellungen speicherst (etwa stellung(73) = "wwowswsoooosowoososoowso", wobei w, s bzw o einen weißen, schwarzen oder keinen Stein auf dem soundsovielten Feld bedeutet). Ob das die günstigste Art der Speicherung ist, weiß ich nicht, aber ein Integer reicht dazu leider nicht aus.
- Nach dem Zug einen ebensolchen String für die aktuelle Stellung bestimmen (braucht man ja sowieso zum anschließenden Speichern)
- Array durchsuchen, ob dieser String bereits 2x drin vorkommt.
Damit sich der Aufwand auch lohnt, könnte man zusätzlich z. B. eine Warnung bei der ersten Wiederholung ausgeben oder am Ende die Möglichkeit bieten, die Partie noch einmal anzusehen oder zu speichern - wobei die Speicherung allerdings platzsparender ist, wenn du nicht die Stellungen, sondern nur die Züge speicherst. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 31.08.2009, 22:17 Titel: |
|
|
@ALWIN: Zum ersten Problem: Demfall müsste ich als zweiten Bugfix noch vorsehen, dass die Schlagmöglichkeit verfällt, wenn der Gegner ausschliesslich Mühlen besitzt?
Sonst noch als Lektüre:
http://de.wikipedia.org/wiki/M%C3%BChle_%28Spiel%29 _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 31.08.2009, 22:48 Titel: |
|
|
Zitat: | Demfall müsste ich als zweiten Bugfix noch vorsehen, dass die Schlagmöglichkeit verfällt, wenn der Gegner ausschliesslich Mühlen besitzt? |
Ja, genau. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|