Tratsch: experiementierfreudige Schafkopfer gesucht!

Trias, 16. August 2019, um 12:07

Servus!

Ich möchte euch mein Projekt vorstellen an dem in die letzten Monate gearbeitet habe. Kurz: Es geht darum einen Computer-Schafkopf-Spieler zu entwickeln der genauso "denkt" wie ein Mensch. Davon bin ich natürlich noch etwas entfernt aber wenn ihr mir helft wird das sicher noch :)

Hier geht es zum Code: https://github.com/Trias/schafkopf

Dort findet ihr auch eine Anleitung zur Installation. Es ist ein bisschen Computer-Know-how erforderlich, aber ich hoffe ihr kommt damit klar. Bei Fragen oder Problemen stehe ich natürlich zur Verfügung!

Leider habe ich noch kein grafisches User Interface gebaut, das heißt ihr müsstet mit Text klarkommen. Ist aber nicht so schwer. EO steht für Eichel-Ober, HX für Herz-Zehn usw.

Ich freue mich über Feedback jeder Art, insbesondere natürlich über "Fehler" die der Computer macht, denn da gibt es noch einige.. :)

Hier habe ich auch ein bisschen die Logik hinter der Engine dokumentiert, für alle die es genau wissen wollen: https://docs.google.com/spreadsheets/d/1-4FKnWWVuPCVfgpsPqUBf35lJUs2eUyG3ssyB-aS-Wc/edit?usp=sharing

Bin gespannt auf euer Feedback! :)

HerzSanny, 16. August 2019, um 12:43

Cooles Projekt! Bin gespannt wie gut das noch wird ☺️

Kennst du dich mit Reinforcement Learning auch aus? Ich kenne da jemanden der grade was bzgl schafkopf macht und bin da auch selber dran interessiert. 🙈

Trias, 16. August 2019, um 13:12

Ne direkt auskennen tue ich mich nicht aber spannend wärs. Für version 2.0 vorgemerkt 😄

Es gibt (versteckt) eine "Evaluation" mit der man auch vermutlich was mit reinforcement learning machen könnte. Das passiert halt aktuell noch manuell 😄

blo17, 16. August 2019, um 23:38

Trias, ich wünsche dir viel Erfolg und Glück 🍀... evtl. mach ich da auch mit! Mal schaun...

solotromix, 17. August 2019, um 08:00

da jeder mensch anders denkt und manche gar nicht brauchst du gott als berater, schreib den mal vieleicht hilfts

hansolo_forever, 18. August 2019, um 01:08

Was der andere Solo damit sagen will: Du wirst die Unwägbarkeiten, die Spontaneität und die phantasievolle Spielweise 'against all odds' eines menschlichen Spielers nur sehr schwer nachbilden können. Aber wenn dir das auch nur halbwegs zufriedenstellend gelingt - Sauspiel hätte endlich eine 'Oma' auf Mittelklasse-Niveau und Du einen Batzen Geld in der Hand... ;)

Trias, 18. August 2019, um 12:00

ja eine gute Oma ist es jetzt schon finde ich 😄

Aber definitiv noch nicht auf dem Niveau eines guten menschlichen Spielers. Das liegt wie du schon sagtest daran, dass man die menschliche Intuition schwer in Regeln fassen kann. Ich versuchs aber trotzdem ;).

Italianofan, 18. August 2019, um 13:54

So etwas gibt es doch schon längst. Da bist bisschen zu spät dran, Trias...

chickenwilli, 18. August 2019, um 17:46
zuletzt bearbeitet am 18. August 2019, um 17:46

Es wäre super wenn es eine Software geben würde, die mich beim Spielen ersetzen kann. Dann hätte ich am Abend frei und könnt mal wieder ins Kino gehen.

Trias, 18. August 2019, um 21:18
zuletzt bearbeitet am 18. August 2019, um 21:19

"So etwas gibt es doch schon längst. Da bist bisschen zu spät dran, Trias..."
Mir völlig egal und außerdem mach ichs besser :P

Trias, 18. August 2019, um 21:19

"Es wäre super wenn es eine Software geben würde, die mich beim Spielen ersetzen kann. Dann hätte ich am Abend frei und könnt mal wieder ins Kino gehen."
Siehste. Schon ein Anwendungsfall gefunden.

kamiko, 19. August 2019, um 02:28

hab nur mal kurz in den Code reingesehen, Trias.
ein Schafkopfprogramm würde ich anders aufziehen; mir ist es zu sehr auf High Level gestrickt.
Du hast 32 Karten - da bietet es sich geradezu an, alles auf Bits abzubilden.
Bit 31 = EO
Bit 30 = GO
...
Bit 3 = SK
Bit 2 = S9
Bit 1 = S8
Bit 0 = S7

Um eine Hand abzubilden, reicht somit eine einzige Integer, in der 8 Bits gesetzt sind.
Man braucht keine Arrays und muss auch keine Kopieren.

Um eine Karte zu entfernen wird kein "indexof" benötigt, der Zeit kostet.
Es genügt eine simple binäre Operation

Ergebnis = Hand exclusivOder Karte
(bsp
src 10000100 00001100 01101000 00100000
xor 00000000 00001000 00000000 00000000
erg:10000000 00001100 01101000 00100000
)

die Operation selbst (wenn beide Werte im Register sind) ist ein einziger Assembler-Befehl; schneller geht's nicht mehr.
-----------
wenn man eine Hand kopieren muss, dann kostet das Kopieren eines Arrays viel Zeit, das Kopieren einer Integer ist dagegen ein Klacks.

sobald Du intensiv mit Rekursionen arbeitest, brauchst mit Arrays nicht mehr anfangen; das geht Dir in die Knie.
-----------
um zu wissen, welche Karten ein Spieler reinlegen darf, genügt es am Anfang bei Rufspiel/Solo 4 Integer, bei Wenz 5 Integer festzulegen, bspw. beim Rufspiel
Trumpfmaske: Integer mit 14 gesetzten Bits
Schell-Maske: Integer mit 6 gesetzten Bits
Gras-Maske: Integer mit 6 gesetzten Bits
Eichel-Maske: Integer mit 6 gesetzten Bits

Wenn bspw. Eichel ausgespielt wurde, kannst Du jede Hand mit einer simplen "AND"-OP filtern und hast sofort alle Karten gefiltert, die derjenige spielen darf:

allowed = HAND binaryAND EichelMaske

und auch über so ganz simple OPs kann man ganz easy abbilden, mit welchen Karten man sticht, was bereits gefallen ist, ob etwas "leere Spatzen" sind usw.
-----------
mit solchen Schleifen wie

for (let color of colorsWithTrump) {
if (cardsByColor[color].length == 1 && color != ColorWithTrump.TRUMP) {
blankCards.push(cardsByColor[color][0]);
}
}

arbeitet sich ein Programm (relativ gemessen) zu Tode - es quält sich richtig^^; kann man alles mit nahezu simpelsten binären OPs, die nur eine oder ganz wenige Taktzyklen benötigen, abbilden.
-----------
um ein richtig performantes Programm zu schreiben, muss man schon auf LowLevel runtergehen; der Unterschied ist extrem und macht Sekunden : Millisekunden und sogar noch mehr aus.

soweit pipis Tipp zur Verbesserung der Performance ... musst aber selber wissen.

Italianofan, 19. August 2019, um 03:51

`"So etwas gibt es doch schon längst. Da bist bisschen zu spät dran, Trias..."
Mir völlig egal und außerdem mach ichs besser :P`

Das wage ich zu bezweifeln. Besagter künstlicher Spieler spielt Dich und die meisten anderen in Grund und Boden, da bin ich mir sicher!

kamiko, 19. August 2019, um 08:00

"Das wage ich zu bezweifeln. Besagter künstlicher Spieler spielt Dich und die meisten anderen in Grund und Boden, da bin ich mir sicher!"

das ist völlig irrelevant.

Programmieren ist das Handwerk, eine "Maschine" zu bauen, so wie bspw. eine Fräsmaschine zu konstruieren; das ist im Grunde nichts anderes. Deswegen wird aber wohl niemand von einem Ingenieur erwarten, dass er mit seinen eigenen Fingern Holz fräsen kann.

Italianofan, 19. August 2019, um 08:54

Äh Kami... Das bezog sich darauf, dass ers BESSER machen will. Und das bezweifle ich eben, weil "die Maschine", die es schon bereits gibt, eine Spielstärke hat, die hier bestimmt über 80 % der Spieler an die Wand nagelt. Tendenz steigend.

kamiko, 19. August 2019, um 09:12

er hat ja erst mal nur nen kleinen Ansatz entwickelt und vorgestellt. keine Ahnung, was er drauf hat und (!) wie groß seine Leidenschaft und Zähigkeit ist.
Die Konstellation jedenfalls ist nicht schlecht für ihn: Die ganze Welt programmiert an allem möglichen, aber die wenigsten interessiert es, ein Schafkopf-Programm zu entwickeln, das über eine Spielerei hinausgeht.

Er stellt seinen Quellcode ins Netz - so haben schon etliche sehr gute Programme angefangen.
Ich find's Klasse und vl. hilft es, wenn wir ihn da etwas motivieren.

Italianofan, 19. August 2019, um 09:24

Also entweder drück ich mich so dermaßen missverständlich aus oder Du willst mich absichtlich nicht verstehen?

"Die ganze Welt programmiert an allem möglichen, aber die wenigsten interessiert es, ein Schafkopf-Programm zu entwickeln, das über eine Spielerei hinausgeht."

Es GIBT bereits ein "Programm", das WEIT über eine Spielerei hinaus geht! Ich gehe sogar soweit zu behaupten, dass Du die erste Zeit gar nicht bemerken würdest, dass Du nicht gegen echte Gegner spielst.

kamiko, 19. August 2019, um 09:47

Italianofan, ich versteh nicht, warum Du da so verbissen bist.
Gibt es nicht auch ein Auto? Gab es nicht auch schon vor 20 Jahren ein Auto, auch schon vor 40 Jahren?

und das Auto vor 40 Jahren fuhr schon schneller, als jeder echte Mensch laufen konnte, oder nicht?

warum hat man denn dann neue Autos entwickelt?
es geht um BESSER!

und selbst, wenn wir denken, alles zu wissen...
die ganze Welt rechnet heute noch weitgehend mit Formeln basierend auf Newton.
um aber in Grenzbereichen rechnen zu können, musste erst Einstein kommen - mit einem völlig neuen Ansatz und einer völlig neuen Idee.
sei mal bitte nicht so hartnäckig mit "gibt's schon"

@Trias: nicht entmutigen lassen.

Italianofan, 19. August 2019, um 10:24
zuletzt bearbeitet am 19. August 2019, um 10:26

Kamiko.
Juckt Es Dich auch manchmal im Schritt? Ich geh schwer davon aus, weil man über den großen Nikola Tesla sagt, ihn habe es oft im Schritt gejuckt! Und zwischen Dir und Tesla (ja, DICH nenn ich natürlich zuerst!) kann ich deutliche Parallelen erkennen. Wobei natürlich nur DU ein Universalgelehrter bist, der uns allen die Welt erklären kann! Vielleicht hat es den Universalgelehrten Göthe auch ab und zu im Schritt gejuckt. Ach was schreib ich denn da. Ganz sicher hat es ihn gejuckt!

wonderwall, 19. August 2019, um 10:28

und vor allem anderen, streng dich an, Trias! verbeiss dich leidenschaftlich und zäh in die thesen der kritiker und hab auf keinen fall spaß beim entwickeln eigener ideen: du musst es allen zeigen!

kamiko, 19. August 2019, um 10:52

gern auch auf der Ebene, italo.

Du solltest nie ein Haus bauen - gibt's schon.
nie ein Kind bekommen - gibt's schon.
kein Studium machen und Ingenieur werden - gibt's schon.

wenn des mal verstanden hast, wie deppert so ein "gibt's schon" ist, dann fällt es Dir wie Schuppen aus den Augen, dass man für so was kein Universalgelehrter sein muss; a bisserl normaler Verstand reicht aus, um so was in die Tonne zu treten.

Italianofan, 19. August 2019, um 12:09
zuletzt bearbeitet am 19. August 2019, um 12:10

Und das Schöne daran ist, dass DU uns natürlich definierst, was ein "normaler Verstand" ist, und was ALLE ANDEREN in die Tonne zu treten haben.
#dankbardichzumindestvirtuellkennenlernenzudurften

kamiko, 19. August 2019, um 12:24
zuletzt bearbeitet am 19. August 2019, um 12:26

lol!
Du wolltest es doch nicht anders.
omg, da ist ein enthusiastischer Mensch, vmtl. noch sehr jung, noch am Anfang irgendeiner Karriere, freut sich, und Du?

ein Miesepeter hoch 3!

jeder fängt mal klein an und immerhin (!) hat er schon mal was zusammengebracht.

kannst Du da mithalten?
oder findet man Dich nur in ner Kneipe rumsitzen, weil alles, was man machen könnte, kommt von Dir nur ein billiges
"gibt's schon!"?

nöö, der macht das schon richtig. zu verlieren hat er nichts, aber sehr viel an Erfahrung zu gewinnen, selbst wenn er irgendwann das Projekt stoppt.

Italianofan, 19. August 2019, um 12:51

Ich hoffe man (vorallem Du, lieber Kamiko) sieht mir nach, dass ich an dieser Stelle off topic gehe, aber eine Frage interessiert mich gerade brennend:
Ist es möglich, dass ein Autist in Personalunion mit einem Narzissten existiert?

WildBill, 19. August 2019, um 12:53

Man hat mich gerufen?

zur Übersichtzum Anfang der Seite