NIM-Spiel

Gast #224730
Lesenswert?

@Wegstaben Verbuchsler

Soll ich da vielleicht noch ne Antwort darauf geben.

Sorry, konnte mir aber bis vorhin nicht vorstellen was ein NIM-Spiel
ist, der Link funktionierte bei den ersten Versuchen irgendwie nicht.
Erst als ich ihn abtippte funktionierte er.

Aber halten wir diesen Thread wenigstens sauber, dass auch Leute
schreiben können, welche auf die Fragestellungen von Manuel auch
irgendeine sinnvolle Antwort geben können.

Nicht das noch ein paar Einfallspinsel auf die Idee kommen solche
sinnlosen Fragen zu stellen, wie du :-)
Gast #224731
Lesenswert?

@Manuel:

Wie du anfangen solltest, kommt ganz drauf an, was der uC denn am
Schluss machen soll. Sollte er als Gegenspieler agieren, oder einfach
nur anzeigen, was die beiden Spieler machen?
Ersteres ist ja nicht wirklich sinnvoll, wenn man der Wikipedia glaubt,
da der uC in jedem Fall die richtige Spielvariante wählen wird, und
somit auf jeden Fall gewinnt, wenn der Spieler anfängt.
Gast #224734
Lesenswert?

Dann fang doch damit an, wie das Userinteface aussehen soll. Z.B. würde
man ja eine Anzeige brauchen, die die verbleibenden Streichhölzer oder
Münzen oder was auch immer anzeigt ==> also ein paar 7-Segment-Displays
mit entpsrechenden Treibern dafür, je nach µC
Dann noch Taster zum Einstellen der Anzahl, zum Reset, zur Auswahl
Mensch/Maschine undundund. All dies wird die Wahl des Controllers
vermutlich beeinflussen oder bei wenn du dir schon einen ausgesucht
hast, die wahl der Zusatzhardware.
Dann fang doch erstmal damit an, die Anzeige und Tastenabfrage
(entprellen nicht vergessen) zu schreiben, dann die Mensch-zu-Mensch
Spielweise, wenn das läuft, die KI (bei diesem Spiel nicht so schwer,
im Prinzip nur eine Modulo-Operation zur Auswahl der zu nehmenden
Münzen).
Ach ja, toll wäre auch noch n Lautsprecher, aus dem dann "Du hast
gewonnen" oder "Der Computer hat gewonnen" und ähnliches ertönt.
Aber das hat noch Zeit ;-)
Gast #224735
Lesenswert?

Hallo,
das ganze habe ich schon. Ich benütze einen Atmel 8515 oder Mega 16 die
haben wir hier rumliegen wie Sand am Meer. Anzeigen will ich die
Streichhölzer mit LED's die hab ich auch schon. Die Taster um
auszufwählen wieviel weg sollen hab ich auch schon mit einer Matrix
Tastatur gelöst. Also fehlt jetzt noch die realisierung der Software
:-D
Gast #224741
Lesenswert?

Das Problem das ich habe ist, dass ich noch überhaupt nicht weis wie ich
das ganze mit der Software anfangen soll. Die Seite von Tester hilft mir
nicht da ich das Spiel anders gestallte. Weil ich es auf 4 Zeilen mach
und nicht alles in eine.
Gast #224742
Lesenswert?

@Manuel

An Deiner Stelle würde ich mir vor dem Programmieren sehr genau
überlegen wie du vorgehst und was du willst. Bei solchen Speilen kannst
Du Dich nämlich sehr schnell überschätzen. Wir hatten das Problem bei
dem Kartenspiel MAU MAU in Prolog.

Hier ein paar Links zum Thema NIM Spiel in der KI.
http://www.o-bizz.de/qbtuts/ai-tuts/ki-inqb/ki-inqb.htm
http://www.freiequelle.de/ki/html/node11.html
http://ki.cs.tu-berlin.de/lehre/gkiws03/skript/spiele.pdf

Gruß
Christian
Gast #224743
Lesenswert?

Hallo Manuel!

Jetzt wird es Zeit dass du dein Projekt genauer zu spezifizieren
beginnst. Du hast also 16 LEDS und ein 4 Zeiliges LCD. Welche Version
des Spiels willst du nun realisieren? Schreib die Regeln genau
zusammen. Was willst du wo Anzeigen? Eingabeaufforderungen und
Einstellungen am LCD, Streichhölzer als LEDs usw.
Wenn du diesen Ablauf genau beschreiben kannst können wir uns ans
Programmieren machen ...

Greets Gerhard

PS.: Irgendwie gefällt mir die Idee mit dem NIMM Spiel. Ich habe gerade
ein altes FORTH 80C167 Board ausgegraben, werd mal ein LCD und eine
Tastatur anschließen und mich an meine eigene Version des Spiels
ranmachen.
Die Links von Christian sind auch nicht schlecht, jedoch für eine
schnelle erste Version des Spiels werde ich keine künstliche
Intelligenz einbauen...
Gast #224746
Lesenswert?

So hab mir mal mein erstes Konzept gemacht wie ich mir das so gedacht
hab.

Nach dem Prinzip der Eklärung auf Wikipedia (Ungerade/Gerade)

Beispiel:
Folgende Situation in der zweiten Reihe hat Spieler 1 zwei Hölzer
weggenommen.

   O
   O
 OOOOO
0OOOOOO

Im Binären würde es so aussehn:

0001   für 1 Holz
0001   für 1 Holz
0101   für 5 Hölzer
0111   für 7 Hölzer

Wenn ich nun für jede Spalte eine Variable erstelle, in die der
Binärwert eingetragen wird.

Anhand vom Beispiel:

-In der 4. Spalte sind alles einser. Das wär dann die Zahl 4. Das
 heißt eine gerade Zahl also entspringt es einer 0. Wenn man die vier
 einser Binär in Hex wandelt wäre es die 15.

-In der 3. Spalte sind es drei Nullen und eine 1, zusammengerechnet
 also eine 1 das heißt eine ungerade Zahl. Binär 1 und Hex auch 1.

usw.

Sooooo

Somit könnte ich einmal die vier Variablen anlegen für die Spalten und
einem 15 Variablen für die 15 möglichkeiten die es gibt.

Wenn ich die dann vergleiche und jeweils dann die ungerade oder gerade
Zahl rausbekomme wäre es ja gut.

Nur wie soll ich dann weiter machen?????

Das er die ungerade dann wegbekommt damit der gegner wieder eine gerade
bekommt.

Ich hoff ihr versteht ungefähr was ich meine.
Gast #224747
Lesenswert?

Jetzt bin ich verwirrt ;-)

Also das mit G und U ist doch die Gewinnstrategie oder habe ich das
falsch verstanden? Oder soll

Ich würde an Deiner Stelle direkt mit Binärwerten arbeiten. Das Bit ist
gesetzt wenn das Streichholz vorhanden ist. Es ist nur die Frage was
macht mehr Sinn die Werte Zeilenweise oder Spaltenweise anzuordnen.

Wie machst du das mit den Reihen hats du für jede Reihe eine Taste mit
der du vorgibst in Welcher Reihe du ein/zwei/drei weg nimmst, oder hast
du 10 Tasten die du entsprechend angeordnet hast? Ich werde aus deinem
Schaltplan irgendwie nicht schlau.

Gerade und ungerade bekommst du in Binär ganz einfach raus ;-) wenn das
2^0 => 1 Bit (LSB) gesetzt ist dann ist die Zahl ungerade z.B 3 oder 5
usw.

Gruß
Christian

---
http://chris.cybertux.org
Gast #224748
Lesenswert?

Das mit dem G und U hast du richtig verstanden, dass ist die
Gewinnstrategie.

Ich habe für jede Reihe auser der ersten, 3 Tasten zum auswählen für
3,2,1 hölzer.



Spaltenweise macht es sind. Da ich ja schauen muss ob die Spalte
ungerade oder gerade ist. Aber Achtung nicht der Binärwert muss gerade
sein. Man muss die einsen in der Spalten zählen, habe ich nun 3 einsen
in einer spalte ist sie ungerade aber habe ich 2 einsen ist es gerade.
Gast #224749
Lesenswert?

Hallo Manuel!

Im Anhang findest du ein EXCEL File.
Darin findest du den Aufbau des Spiels (Eingabe im blauen Binärfeld um
alle G und U Kombinationen zu finden) sowie im Zweiten Blatt alle 50
möglichen G Kombinationen.
Daraus eine C Funktion zu schreiben ist nicht mehr so schwer...

Gruß Gerhard
Angehängte Dateien:
Gast #224750
Lesenswert?

Und wie bekomme ich dann aus einer U Situation die richtige G Situation.
Ich kann ja nicht irgendein Holz wegnehmen ich muss ja genau dieses
wegnehmen das aus der U Situation wieder eine G Situation wird.
Gast #224752
Lesenswert?

Ohhhh. im Excel File ist mir ein kleiner Fehler unterlaufen: Es sind
nicht 50 G Möglichkeiten sondern nur 44, die letzte Reihe kannst du
löschen, ist doppelt mit Reihe 2 -> hat sich doch keiner genauer
angeschaut ;-)
Ach ja, kleiner Tipp: Du kannst entweder den nächsten G Spielzug immer
nach gleichem Schema fix berechnen lassen (fade Lösung weil dein
Programm dann auf einen Spielzug immer gleich reagiert)oder eben um es
für den menschlichen Gegenspieler schwieriger zu machen die G Situation
durch unterschiedliche Spielzüge erreichen.
Angehängte Dateien:
Gast #224754
Lesenswert?

Hallo,
vielen Danke für den Code doch leider kenn ich mich in C noch nicht aus
ich habe meine letzte Projekte alle mit Bascom gemacht.

Aber ich schau mir den Code mal in Ruhe an und versuch ihn zu
verstehen.
Gast #224756
Lesenswert?

Also ich würde es so machen, daß du Deine Variable mit
1  (00001)
2  (00010)
4  (00100)
8  (01000)
16 (10000)
verundest und dann überprüfst ob 1 2 4 8 16 rauskommt falls ja erhöst
du eine zählvariable die du am Schluß auf gerade/ungerade überprüfst.
Oder Du schiebst deine Bits durch die Gegend ich denke da hat jeder
seine Vorlieben. ;-)

cu
chege
Gast #224757
Lesenswert?

Hallo,
melde mich mal wieder :-)

Hab nun mal angefangen mein Prog zu schrieben. Und hab dann gleich
wieder ein Problem.
Ich habe es schon hinbekommen das der µC aus einer U eine G Situation
macht. Das Problem das ich gerade habe ist wie mach ich aus einer G
Situation eine U möglichst zufällig. Ich bekomm das ums verecken net
hin.

Ich hab das mal mit einer Randomzahl von 1-4 also für die Reihe dann
anzulegen versucht. Aber wie sag ich ihm dann wieviel er jeweils
wegnehmen soll möglichst auch wieder zufällig. Und das er beachtet  das
er nicht mehr wegnimmt wie da sind
Gast #224759
Lesenswert?

Also ich hab bis jetzt nur die Unterprogramme. Die Taster habe ich noch
nicht Prog Die Auswertung habe ich so gemacht programmiert. ich es auf
der Homepage gesehen hab mit der NIM Summation.

http://www.fh-karlsruhe.de/servlet/PB/show/1015913/goem-mathe04-krzensk.pdf

Also erst davor auf die Seite gehn und sich das anschauen mit der
Summation und so.



Im Anhang ist der Code.
Angehängte Dateien:
Gast #224762
Lesenswert?

Hallo Manuel!

leider bin ich in den letzten 2 Wochen nicht zum Programmieren
gekommen. Ich habe aber eine interessante Entdeckung gemacht. Die
Berechnung der G/U Situation scheint bei der Einschränkung, dass du nur
max 3 Hölzchen wegnehmen lässt, nicht immer zu funktionieren...!
Überprüfe mal den Fall das du im ersten Zug in der dritten Reihe 2 oder
3 Hölzchen wegnimmst (schau dir dazu mal das neue EXCEL File im Anhang
an).

Greetz
Angehängte Dateien:
Gast #224763
Lesenswert?

Nun ja, das problem liegt hier begraben:

nehmen wir mal folgende z.B. Endsituation an:
R1=0 R2=0 R3=1 R4=4
laut Berechnung  (XOR) muss ich auf folgende Situation ziehen:
R1=0 R2=0 R3=1 R4=1
Ich würde aber auch gewinnen wenn:
R1=0 R2=0 R3=0 R4=4
... da ja der Computer nur noch auf R4 1 oder 2 oder 3 Hölzchen ziehen
kann.
So wie es aussieht brauchen wir eine bessere Auswertungsfunktion!!
Gast #224765
Lesenswert?

Ja schon, aber die verwendete Auswertungsfunktion funktioniert dafür
nicht! Etwas mehr Überlegung dazu ist gefragt!!!

Bsp.:
Start:    1 3 5 7
8051:     1 3 3 7  -> CPU nimmt in Reihe 3 2 Hölzchen
Spieler:  um auf G zu kommen muß er in Reihe 4 6 Hölzchen nehmen,
-> 1 3 3 1; geht nicht weil er ja nur max. 3 nehmen darf. Die XOR
Auswertung funktioniert somit nicht !!
Gast #224766
Lesenswert?

Ich habe dem Verfasser deiner Auswertung mit XOR Logik folgendes eMail
geschrieben:

Sehr geehrte Herr Prof. Dr. Krzensk!

Über ein Internet Forum (www.mikrocontroller.net) zur Programmierung
von Mikrocontrollern bin ich zu ihrer Anleitung zur
programmiertechnischen Anleitung des "Nim" Spiels gekommen.

Ich habe ihr System in Excel (siehe Anhang) und 8051-C Code soweit
umgesetzt.

Leider funktioniert diese Auswertung nur wenn man beliebig viele
Hölzchen aus jeder Reihe entfernen darf.

Meine Anfrage bezieht sich auf eine Auswertungsfunktion wenn folgende
Abgrenzungen gelten:

Startsituation:
Reihe 1: 1 Hölzchen
Reihe 2:  3 Hölzchen
Reihe 3: 5 Hölzchen
Reihe 4: 7 Hölzchen

Die Software macht den ersten Zug.
Die Spieler dürfen abwechselnd pro Zug aus 1ner beliebigen Reihe
(Anzahl Hölzchen in gewählter Reihe > 0) mindestens 1 und maximal 3
Hölzchen entfernen.

Sieger ist wer das letzte Hölzchen entfernt.

Für diese Voraussetzung (maximal 3 Hölzchen entfernen) funktioniert die
angegebene XOR Summations Methode leider nicht immer.

Z.B.
Start: 1 3 5 7
8051 zieht: -2 Hölzchen aus Reihe 3 -> 1 3 3 7
Die nächste mögliche Gewinn Ausgangssituation laut XOR Berrechnung wäre
nun: 1 3 3 1 (d.h. ich müßte aus Reihe 4 sechs Hölzchen entfernen, nicht
möglich da max.=3).

Da ich im Internet keine weiterführenden Informationen zu diesem Thema
finden konnte würde es mich sehr freuen wenn Sie mir mit ein paar Tips
zur Lösungsfindung geben könnten!

Mit freundlichen Grüßen
Gast #224767
Lesenswert?

Und hier die Antwort:

Sehr geehrter Herr xxxx,

nach der Originalfassung des NIM Spiels müssen die Spieler von einem
Haufen mindestens ein Hölzchen entfernen. Die Anzahl der zu
entfernenden Hölzchen ist jedoch nicht nach oben beschränkt. In diesem
Fall kann gezeigt werden, dass folgendes gilt:

"Für jede Position mit einer positiven Nim-Summe existiert mindestens
ein Zug, bei dem eine Position mit der Nim-Summe 0 erreicht wird"

Die funktioniert jedoch nur, wenn die Anzahl der zu entfernenden
Hölzchen nicht nach oben beschränkt ist!

Wenn Sie jetzt eine zusätzliche Regel einführen, wonach die Anzahl der
zu entfernenden Hölzchen nach oben beschränkt ist (hier durch 3), gilt
obige Aussage nicht mehr. Hierfür haben Sie ja auch ein Beispiel
gefunden.

Ob es zu diesem Problem eine ähnliche Lösung gibt und wie diese
aussehen könnte, weiß ich nicht. Leider kann ich Ihnen ohne länger
nachzudenken hierzu auch keine Tips geben. Eines ist sicher: Da es sich
hierbei um ein Spiel mit vollständiger Information handelt, gibt es für
beide Spiele optimale Strategieen. Wie diese jedoch Aussehen, weiß ich
nicht. Es wird vermutlich komplizierter. Falls Sie wissen möchten, wie
man solche Strategieen finden kann, empfehle ich Ihnen das Buch
"Spieltheorie" von Rauhut, Schmitz und Zachow erschienen im Teubner
Verlag.

Mit freundlichen Grüßen,
Gast #224768
Lesenswert?

Nun ja, um endlich eine erste Version des Spiels fertig stellen zu
können werden die Regeln eben aufgeweicht! d.h. zuerst die Reihe
eingeben, dann die zu entfernenden Hölzchen ohne max=3 Beschränkung.
Gast #224769
Lesenswert?

Hallo,
Danke das du dir soviel Mühe machst und du auch so interesiert bist an
diesem Spiel.
Ohne dich hätt ich das garnicht rausbekommen mit dem XOR. Das mit der
Beschränkung ist eine gute Idee. Ich werde mal versuchen das Umzusetzen
Gast #224771
Lesenswert?

Hi,
bin gerade fertig geworden mit meiner Platine jetzt werf ich das Prog
mal drauf und werd mal schaun ob sich was tut. Leider habe ich es noch
nicht versucht das Problem mit der Summation zu lösen. Ich denk mal das
das noch ein bischen zu hoch für mich ist und ich da länger für brauch
Gast #1207686
Lesenswert?

Eine rudimentäre Implementation in Python (getestet mit 2.6.1) ist im
Anhang. Eine Überprüfung der Benutzereingaben fehlt, ebenso Mausunter-
stützung, 3-D-Grafik, Sound und Netzwerkfähigkeit ;-)
Angehängte Dateien:
  • nim (1,47 KB)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren