Hallo Besucher, der Thread wurde 37k mal aufgerufen und enthält 416 Antworten

letzter Beitrag von RKSoft am

Hakuna Matata - it's Matatu Time on C128 and Plus/4

  • Die Interpreterschleife selber ist etwas langsamer, weil sie viel mehr Token checken muss und zudem 2-Byte-Token prüft. Der eigentliche Zeitverlust entsteht jedoch durch das ständige Bankswitching (ROM aus RAM ein / RAM aus ROM ein) und die dazu erfrderlichen "Umwege". Mit einem guten Compiler kann man das wegoptimieren und dann läuft der C128 wie Schmidts Katze.

    So ins Detail wollte ich gar nicht gehen. Die 2-Byte-Tokens zu behandeln dauert etwas länger, aber die Anzahl der Token spielt in Wirklichkeit keine Rolle, weil das über Tabellen aufgelöst wird ... ;)
    Wirklich ins Gebein gehen in der Tat die Speicherzugriffe bei Berücksichtigung des Bank-Switchings. Da ist jeder Bytezugriff auf den BASIC-Text, -Variablen, -Arrays, String-Bereich über eine Subroutine gekapselt. Das ist aber im Großen und Ganzen auch schon beim Plus/4 der Fall, der zumindest zwischen ROM und RAM hin-und-her-schalten muss, was auch eine entsprechende Kapselung erfordert.

  • Ich selber werde nichts mehr zu matatu machen. Nur eine Sache werde ich noch suchen und zwar den Bug warum die ki zwei und sieben sporadisch verwechselt. Aber ich kann die nächsten 4 Wochen erstmal kein matatu mehr sehen und möchte zur Ablenkung andere Sachen machen. Weiter einfaches asm Intro coding lernen, Bitmap Rotation am cpc in basic und ein kleines tic tac toe mit ki in v2 basic.

    Wie ist das mit dem Verwechseln bei 2 und 7 gemeint? Wie verhält sich der Bug genau?


    Übrigens, die KI verhält sich - wenn ich es korrekt verstanden habe - im Falle der Farbwahl gänzlich anders. Da wird nämlich nur in der Hand eine Karte gesucht (je nach Abbruchbedingung die erste oder letzte), die die richtige Farbe hat. Dann wird nur genau diese der Reihe nach geprüft, ob Cut7, Ass, 2er, 8er/Bube vorliegt. Gegenüber der sonstigen Strategie, wo immer in der gesamten Hand nach der jeweiligen Spezialkarte gesucht wird, scheint mir die KI hier bessere Möglichkeiten zu verschenken.... Warum im Farbwahl-Modus nicht auch die Standardstrategie gewählt wird, erschließt sich mir nicht.
    Beispiel: Es ist Farbwahl Herz, KI findet eine Herz-9 in der Hand, hat aber auch eine Herz-7 in der Hand, kommt zum Cut7-Check, der aber auf Herz-9 nicht anspricht.
    Oder hab ich das irgendwie falsche verstanden?

  • Die Farbwahl der KI wählt eine Farbe aus, die mindestens einmal auch bedient werden kann.


    Dabei wird nicht priorisiert oder strategisch vorgegangen.


    Der Bug mit 2 und 7 taucht sporadisch und für mich bisher nicht reproduzierbar auf. Es muss außerdem ein ki bug sein, im 2 Spieler Modus kommt es nicht vor. Hierbei gibt die ki eine 7 aus und der "2 gespielt" Status wird gesetzt. Das passiert nicht oft, aber es kommt vor.

  • Die Farbwahl der KI wählt eine Farbe aus, die mindestens einmal auch bedient werden kann.


    Dabei wird nicht priorisiert oder strategisch vorgegangen.


    Der Bug mit 2 und 7 taucht sporadisch und für mich bisher nicht reproduzierbar auf. Es muss außerdem ein ki bug sein, im 2 Spieler Modus kommt es nicht vor. Hierbei gibt die ki eine 7 aus und der "2 gespielt" Status wird gesetzt. Das passiert nicht oft, aber es kommt vor.

    Die Farbwahl der KI meine ich nicht. Es geht darum, wenn der Spieler Farbwahl gemacht hat, dann geht die KI in eine völlig andere Behandlung, nämlich wie schon beschrieben, wird dann eben nicht systematisch nach den passenden Funktionskarten in der Hand gesucht, sondern nur eine farblich passende und genau diese eine wird mit allen Funktionen verglichen. Dabei übersieht die KI bei Farbwahl hochwahrscheinlich stets Funktionskarten in der Hand, die ausgespielt werden könnten. Man könnte das jetzt so interpretieren, dass dies dafür da sein könnte, damit der Mensch überhaupt noch eine Chance hat, spielt die KI hin und wieder absichtlich schlechter ... ;)


    Ad 2/7-Bug: Aja, das liegt wohl daran, dass die Variable cno mit der Position der gefundenen 7er-Karte nicht auf 0 zurückgesetzt wird, falls die Cut7-Bedingung wegen der Punkteanzahl nicht erreicht wird. Dann geht es weiter in die 2er-Abfrage, die auch wenn keine 2er-Karte in der Hand ist, wegen dem gesetzten cno (<>0) meint, eine 2er-Karte gefunden zu haben, die aber eben nicht da ist. Dann setzt der den 2er-Status und spielt dabei die 7 aus.
    D.h. in Zeile 7044 vor der IF-Abfrage: cno=0:

  • @ Jeek


    Du hast die KI jetzt aber schön entschuldigt, dass sie den Human Player schont, danke. ;-)


    Zum 7-2-Bug: Brillant erkannt. Überhaupt merkt man dass Du die gesamte Mechanik von Anfang an klar durchdrungen hast und es ehrt mich, dass mein Gewurschdel Dir die Mühe wert war. :-)

    Gern geschehen. :D
    Ich muss zugeben, solchen Sachen machen süchtig ... an einem Programm herumfeilen und herumbasteln. Ich selber hätte mir diese Mühe nie gemacht, so ein Programm alleine komplett zu entwicklen, aber hier in der Gruppe ergänzt sich alles so wunderbar ... :thumbsup:


    Apropos Bugs (und Optimierungen):

    • Kommentar beim Ass-auf-Ass-Spiel (7101)
    • Cut7/2er-Bug (7044)
    • Bube-auf-Bube-Bug (7192)
    • AND in Schleifen oder zeitkritischeren Bereichen durch THEN IF ersetzt.
    • Schleifenabbruch (7032)
    • Cut7-Condition-Test auf Anzahl der in der Hand befindlichen Karten beschränkt (1954)
    • Unnötige GOTO-Wege (1731,1720)
    • Unnötige Variable entfernt (übrig gebliebenes, nicht mehr gebrauchtes zno, 1826)
    • Spielerwechsel elegant (265)


    Was dann meiner Meinung nach noch fehlt sind:

    • Optimierung: MID$(...,2,2) auf RIGHT$(...,2)
    • Neumischen, wenn Stapel aufgebraucht (hab ich schon zuvor gepostet).

    Was mir noch aufgefallen ist, wo ich noch nicht weiß, ob das ein Bug ist:


    Computer spielt 2er, ich lege in gleicher Farbe einen 8 (hätte dann in der gleichen Farbe nur noch eine Karte in der Hand und meinte so zu machen zu können), aber meine 8 wurde ignoriert und ich bekam trotzdem die 2 Karten abgehoben, als hätte ich keine passende Karte gehabt. Komisch, oder gehört das wirklich so?

  • @ Jeek



    Zitat von Jeek

    Was mir noch aufgefallen ist, wo ich noch nicht weiß, ob das ein Bug ist:


    Computer spielt 2er, ich lege in gleicher Farbe einen 8 (hätte dann in der gleichen Farbe nur noch eine Karte in der Hand und meinte so zu machen zu können), aber meine 8 wurde ignoriert und ich bekam trotzdem die 2 Karten abgehoben, als hätte ich keine passende Karte gehabt. Komisch, oder gehört das wirklich so?


    Bugjam wird das genau wissen. Ich meine ich hab ihn so verstanden, dass die einzige wirksame Antwort auf eine 2 eine weitere 2 ist. Daher habe ich dafür gesorgt, dass wenn eine andere Karte als 2 gespielt wird, diese noch auf der Hand bleibt und man automatisch 2 zieht. Es gibt nur keine Textmeldung dazu. Eigentlich eine Schwäche gegenüber der Android App denn die erklärt gar nicht was sie macht, nie. Und die Regeln sind dort mehr als dürftig erklärt.


    Zum Thema Sucht:
    Freut mich dass Dich das Thema so beschäftigt. Ich selber bin, was Matatu angeht, "satt" und mag nicht mehr. Die noch kommenden Veränderungen im Spiel sind relativ aufwändig, die Spürbarkeit in der durchschnittlichen User Experience ist aber relativ gering. Es ist nur noch perfektionieren um des Perfektionierens willens, was aber durchaus legitim und gut ist. :-)

  • Bugjam wird das genau wissen. Ich meine ich hab ihn so verstanden, dass die einzige wirksame Antwort auf eine 2 eine weitere 2 ist. Daher habe ich dafür gesorgt, dass wenn eine andere Karte als 2 gespielt wird, diese noch auf der Hand bleibt und man automatisch 2 zieht. Es gibt nur keine Textmeldung dazu. Eigentlich eine Schwäche gegenüber der Android App denn die erklärt gar nicht was sie macht, nie. Und die Regeln sind dort mehr als dürftig erklärt.

    Aber normalerweise kann man doch, wenn der Vorspieler eine 2 gespielt hat, auch normal eine Karte ablegen (die ja aus der Hand genommen wird) und kriegt dann die 2 Karten aufgebrummt - bilde ich mir halt ein. Oder nicht? In besagten Fall wurde meine 8 nicht abgelegt, also ignoriert.



    Freut mich dass Dich das Thema so beschäftigt. Ich selber bin, was Matatu angeht, "satt" und mag nicht mehr. Die noch kommenden Veränderungen im Spiel sind relativ aufwändig, die Spürbarkeit in der durchschnittlichen User Experience ist aber relativ gering. Es ist nur noch perfektionieren um des Perfektionierens willens, was aber durchaus legitim und gut ist.

    Also die Bugs gehören auf jeden Fall behoben (2.+3. meines Posts). Auch das Reshuffel des Stapels ist unbedingt nötig, denn meines Erachtens, wäre das Spiel damit einfach verkrüppelt. So selten ist es nicht, dass man alle Karten aufbrauchen kann (wegen dem würde ich nicht gerne den Bus bezahlen müssen :huh: )
    Wenn zumindest eine Bug-Behebung tatsächlich passiert, dann kann man die anderen Sachen auch mitnehmen. Da braucht man eigentlich nicht darüber den Kopf zerbrechen, ob die Sachen wirklich notwendig sind oder nicht. Wenn sich schon jemand die Mühe gemacht hat und das getestet hat, dann ist das ja kein Mehraufwand mehr. Natürlich, die anderen Bugs sind nach außen hin nicht unbedingt zwingend notwendig. Trotzdem, wenn man z.B. einen Sportwagen der Öffentlichkeit präsentiert, dann muss ich auch damit rechnen, dass mal jemand unter die Motorhaube guckt ... da zählt auch der Eindruck. Sonst hätte man sich die ganze Sache mit Matatu auf unseren geliebten 8-Bittern auch gleich sparen können ... :D

  • Changelog Version 17:

    • Fixes aus Beitrag Nummer 406 eingefügt - einige Optimierungen hatte ich bereits schon in der 264er Version gemacht.
    • Cursorcode bei der Auswahl der Farbe optimiert (nur C64)
    • alle MID$ (bis auf eine!) in LEFT$ oder RIGHT$ geändert


    Im Anhang die 64er und 264er Versionen einmal in Textformat und einmal als PRG!


    Deine KI Optimierungen, lieber @JeeK, sind echt übel. Der Computer spielt ja auf einmal richtig gut. Saubere Arbeit!

  • @ jeek, rksoft


    SAUBER! :)


    Zum Thema 2 auf 2:
    Doch, es ist so. Wenn eine 2 liegt muss man eine 2 legen oder 2 Karten ziehen. Ich war etwas faul und habe dazu keine Textmeldung gemacht wenn jemand einen illegalen Ablageversuch in diesem Moment macht. Ich lasse den Versuch bloß ins Leere laufen und lasse dann 2 ziehen. Bugjam hätte glaube ich längst gemeckert wenn das nicht regelkonform wäre. Evtl. liest er mit und äußert sich noch dazu.

  • Bravo bravissimo. Da bin ich wirklich entzückt. :thumbsup:
    Danke! Auch natürlich an bugjam und Bytebreaker, die sich geduldig mein Gesudere anhören und ertragen haben. :D
    Das Reshuffle ist aber noch nicht drin, oder? Aber das sollten wir (oder zumindest ich) noch ausführlicher Testen.


    Deine KI Optimierungen, lieber @JeeK, sind echt übel. Der Computer spielt ja auf einmal richtig gut. Saubere Arbeit!

    Danke, zu viel des Lobes. Was mich ein bisschen "stört", bitte ich möchte da jetzt niemandes Leistung schmälern, dass bei Farbwahl, die KI nicht in die Möglichkeiten ausschöpft, wie sie es bei normalen Zügen (wie schon in einem kürzlichen Post angemerkt) tut.
    Da galoppieren meine Gedanken gerade was die KI angeht, mit den Dingen, die man machen könnte, wie Wahrscheinlichkeiten der abgelegten und verbliebenen Karten einbeziehen, Taktiken (aggressiv, defensiv) ev. abhängig von den Reaktionen des Gegners, zusammenhängende Zugvarianten, wo die Spezial nicht bloß ausgespielt werden, wenn man sie hat, sondern abgestimmt mit den Karten, die sonst noch in der Hand sind ... Hirngespinste eben. :rolleyes:
    Analog zur Computer-Schach-WM machen wir dann das Matatu-KI-Competition der jeweils entwickelten KIs, die gegeneinander antreten. 8o
    Aber ich glaub, so fad ist in Wirklichkeit keinem.


    Zum Thema 2 auf 2:
    Doch, es ist so. Wenn eine 2 liegt muss man eine 2 legen oder 2 Karten ziehen. Ich war etwas faul und habe dazu keine Textmeldung gemacht wenn jemand einen illegalen Ablageversuch in diesem Moment macht. Ich lasse den Versuch bloß ins Leere laufen und lasse dann 2 ziehen. Bugjam hätte glaube ich längst gemeckert wenn das nicht regelkonform wäre. Evtl. liest er mit und äußert sich noch dazu.

    Ich hab's dann im Code auch entdeckt, in Zeile 1500 ... passt, hab keinen Einwand mehr. Vielleicht, mal bei Gelegenheit, eine Textmeldung wäre freilich auch nicht übel. :)

  • Sorry, bin grad etwas krank, deswegen wenig on.
    Thema 2: wurde schon richtig beschrieben - ist wie beim Mau Mau mit der 7. Allerdings ist das "automatische" Ziehen eigentlich überflüssig - würde das genauso handhaben wie sonst. Dann umgeht man auch die Gefahr, dass man 2 ziehen muss, obwohl man eine 2 hat - aber aus Versehen eine andere Karte angewählt hat.
    In den nächsten Tagen mehr!

  • Dann optimier mal weiter und poste dies hier, ich hau deine Patches dann in die 64er und 264er Versionen rein.

    Das Reshuffle hab ich nun ausführlich in einem Testprogramm getestet (siehe reshuffle.bas.txt). Es ist nun so implementiert, dass es keinen Spielabbruch mehr geben kann. Wenn niemand der Spieler eine Karte ausspielt und immer nur zieht, dann kann man den Stapel erschöpfen. Wenn keine abgelegten Karten vorhanden sind, wird die Meldung "can't draw, stack empty!" kurz eingeblendet. Aber das Spiel geht weiter. Die Spieler können dann eben nur ausspielen. Bei "Draw" wechselt dann nur der Spieler, der am Zug ist. D.h. die Variable SE wird nicht mehr weiter benötigt (in der Spielschleife könnte man deren Abfrage auch noch rausnehmen). Das Neumischen wird nur aktiv, wenn mind. 1 Karte, abgesehen von der offen liegenden, zuletzt gespielten Karte, vorhanden ist. Den Sonderfall bei nur genau einer Karte hab ich nicht extra ausgeklammert, das Mischen passiert dann von einer Karte auf die gleiche Karte, was faktisch nichts ändert. Das tut nicht weh bzw. man spart sich nicht wirklich etwas, wenn man das durch Überspringen extra behandeln würde. Während des Mischens wird "reshuffling stack..." angezeigt. Ich hoffe, es ist ok, wenn man das so schreibt.


    Eingebaut in der 17er-Version: matatu-17o.prg (patch-17.reshuffle.patch.txt).