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

  • WTE schrieb:

    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.
  • Bytebreaker schrieb:

    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.
  • Bytebreaker schrieb:

    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:
  • Bytebreaker schrieb:

    @ 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):
    1. Kommentar beim Ass-auf-Ass-Spiel (7101)
    2. Cut7/2er-Bug (7044)
    3. Bube-auf-Bube-Bug (7192)
    4. AND in Schleifen oder zeitkritischeren Bereichen durch THEN IF ersetzt.
    5. Schleifenabbruch (7032)
    6. Cut7-Condition-Test auf Anzahl der in der Hand befindlichen Karten beschränkt (1954)
    7. Unnötige GOTO-Wege (1731,1720)
    8. Unnötige Variable entfernt (übrig gebliebenes, nicht mehr gebrauchtes zno, 1826)
    9. Spielerwechsel elegant (265)

    Unterschiede-Datei

    1. 83,84c83
    2. < 265 ifpl=1thenpl=2:gO200:rem <- spielerwechsel
    3. < 266 ifpl=2thenpl=1:gO200
    4. ---
    5. > 265 pl=3-pl:gO200:rem <- spielerwechsel
    6. 144,145c143
    7. < 1715 if npl$="07" and cpl$=cut$ and cs$=cut$ then goS 1950 : rem <- cut7
    8. < 1716 if npl$="07" and cpl$=cut$ and ns$="07" then goS 1950 : rem <- cut7
    9. ---
    10. > 1715 if npl$="07" and cpl$=cut$ and (cs$=cut$ or ns$="07") then goS 1950 : rem <- cut7
    11. 147c145
    12. < 1720 if cpl$=c0$ and npl$="07" then cid=1:goS 1950:goto 1717
    13. ---
    14. > 1720 if cpl$=c0$ and npl$="07" then cid=1:gO 1950
    15. 150c148
    16. < 1731 cid=0:nid=0:gO 1717 : rem <- falsche farbe
    17. ---
    18. > 1731 cid=0:nid=0:return: rem <- falsche farbe
    19. 167,168c165,166
    20. < 1826 ifc1$=""thenzno=zno+1:c0$=left$(ch$,1):gO 1828
    21. < 1827 zno=1:c0$=mid$(c1$,rnd(1)*len(c1$)+1,1):rem random other color
    22. ---
    23. > 1826 ifc1$=""thenc0$=left$(ch$,1):gO 1828
    24. > 1827 c0$=mid$(c1$,rnd(1)*len(c1$)+1,1):rem random other color
    25. 189c187
    26. < 1954 fori=1to52:cx=cx+val(mid$(ca$(i,pl),2,2)):next
    27. ---
    28. > 1954 fori=1ton(pl):cx=cx+val(mid$(ca$(i,pl),2,2)):next
    29. 322c320
    30. < 6580 ifxm=0andym=0then6610
    31. ---
    32. > 6580 ifxm=0thenifym=0then6610
    33. 328c326
    34. < 6670 ift0>107andt0<115thench$=ch$+chr$(48)+chr$(48+(t0-105)):return
    35. ---
    36. > 6670 ift0>107thenift0<115thench$=ch$+chr$(48)+chr$(48+(t0-105)):return
    37. 350c348
    38. < 7032 ifmid$(ca$(i,2),2,2)="07"andleft$(ca$(i,2),1)=cut$andcs$=cut$thencno=i
    39. ---
    40. > 7032 ifmid$(ca$(i,2),2,2)="07"thenifleft$(ca$(i,2),1)=cut$andcs$=cut$thencno=i:i=n(2)
    41. 353c351
    42. < 7044 ifcx<=32thencx=0:goS1950:gO7400:rem <- cut7 erfolgreich
    43. ---
    44. > 7044 cno=0:ifcx<=32thencx=0:goS1950:gO7400:rem <- cut7 erfolgreich
    45. 359c357
    46. < 7060 fori=1ton(2):ifmI(ca$(i,2),2,2)="20"andleF(ca$(i,2),1)=cs$thencno=i:i=n(2)
    47. ---
    48. > 7060 fori=1ton(2):ifmI(ca$(i,2),2,2)="20"thenifleF(ca$(i,2),1)=cs$thencno=i:i=n(2)
    49. 364c362
    50. < 7101 if xx<>1 then 7110 : rem <- ass reaktion 2?
    51. ---
    52. > 7101 if xx<>1 then 7110 : rem <- ass reaktion ass?
    53. 376,380c374,376
    54. < 7192 ifmid$(ca$(i,2),2,2)="08"andleft$(ca$(i,2),1)=cs$thencno=i:i=n(2)
    55. < 7193 ifmid$(ca$(i,2),2,2)="11"andleft$(ca$(i,2),1)=cs$thencno=i:i=n(2)
    56. < 7194 next
    57. < 7195 if cno=0 then 7200
    58. < 7196 ch$=ca$(cno,2):cid=1:goS1900:gO7400
    59. ---
    60. > 7192 n1$=right$(ca$(i,2),2):ifn1$="08"orn1$="11"thenifleft$(ca$(i,2),1)=cs$orn1$=ns$thencno=i:i=n(2)
    61. > 7194 next:n1$=""
    62. > 7196 ifcno<>0thench$=ca$(cno,2):cid=1:goS1900:gO7400
    63. 419c415
    64. < 9005 ifxm=0andym=0then9007
    65. ---
    66. > 9005 ifxm=0thenifym=0then9007
    Alles anzeigen

    Was dann meiner Meinung nach noch fehlt sind:
    1. Optimierung: MID$(...,2,2) auf RIGHT$(...,2)
    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?
  • Neu

    @ Jeek


    Jeek schrieb:

    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. :)
  • Neu

    Bytebreaker schrieb:

    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.


    Bytebreaker schrieb:

    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
  • Neu

    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!
    Dateien
    • matatu v17.prg

      (17,7 kB, 4 mal heruntergeladen, zuletzt: )
    • matatu64_v17.txt

      (20,91 kB, 3 mal heruntergeladen, zuletzt: )
    • matatu264 v17.prg

      (16,8 kB, 3 mal heruntergeladen, zuletzt: )
    • matatu264 v17.txt

      (19,76 kB, 2 mal heruntergeladen, zuletzt: )
  • Neu

    @ 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.
  • Neu

    RKSoft schrieb:

    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
    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.

    RKSoft schrieb:

    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.

    Bytebreaker schrieb:

    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. :)
  • Neu

    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!
  • Neu

    RKSoft schrieb:

    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). 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 (Unified Diff Patch).

    Unterschiede-Datei

    1. 65a66
    2. > 186 cl=cc:rem low end stack draw limit
    3. 191c192
    4. < 2001 cc=cc-1:if cc=0 then cc=14
    5. ---
    6. > 2001 cc=cc-1:if cc=0 then cc=52
    7. 198a200
    8. > 2052 ifce=ccthenpOs,11:pOz,.:sysxy:?dc$"can't draw, stack empty! ":gO93
    9. 202c204
    10. < 2056 ca$(ce,3)="000":ce=ce-1:if ce=14 then se=1:return: rem next cleaned up
    11. ---
    12. > 2056 ca$(ce,3)="000":ce=ce-1-52*(ce=1):ifce=clthengosub2100:ifce=ccthen2058
    13. 206a209,217
    14. > 2100 rem ...re-shuffle stack...
    15. > 2102 c1=ce-cc-52*(cc>ce): rem card count to shuffle
    16. > 2105 if ce=cc then return: rem no cards
    17. > 2106 pOs,11:pOz,.:sysxy:?dc$"reshuffling stack... "
    18. > 2110 forj=1toc1:c2=cc+j:c2=c2+52*(c2>52):c3=cc+int(rnd(1)*c1)+1:c3=c3+52*(c3>52)
    19. > 2120 n$=ca$(c2,3):ca$(c2,3)=ca$(c3,3):ca$(c3,3)=n$:next
    20. > 2130 cl=cc
    21. > 2140 return
    22. >
    Alles anzeigen
  • Benutzer online 1

    1 Besucher