Hallo Besucher, der Thread wurde 10k mal aufgerufen und enthält 35 Antworten

letzter Beitrag von schwubbe am

Balancing eines Spieles auslesen

  • Nicht wirklich merkwürdig. Dürfte daran liegen, das ich 'n bisschen was von Webprogrammierung verstehe, wirkliche Programmiersprachen aber, damit habe ich mich noch nie befasst.
    Auf welche Hürden ich treffe, und wie ich diese dann angehe, konnte ich vorher nur abschätzen. Das Vorkommen einer Random-Funktion war für mich durchaus eine Möglichkeit; und würde ich Schach nachbauen, so läge mir die Funktion und Ihr Aufbau auch deutlich mehr am Herzen, hätten mich womöglich gar abgehalten aufgrund mangelnder Akkuratesse des Nachbaus.
    Aber wie gesagt: Ich möchte für mich (nicht für dotierte Sammlungen) dieses Spiel mit meinen Mitteln möglichst gut nachgebaut bekommen und nicht die Programmierung des Betriebssystems erlernen auf dem das Spiel läuft; wäre das mein Ziel, so hätte mir das definitiv schon was sagen sollen bevor ich am jetzigen Punkt wäre. In meiner Situation aber denke ich, das es durchaus ok ist, das ich mich jetzt erst damit befasse wie ich RND nachgestellt bekomme.

  • Ehrm... Du hast ne Funktion, die Dir pseudo-zufällige Werte im Intervall [0,1[ liefert. Also: Wert kann null sein, aber nie eins. Sowas sollte sich auch in Deiner Programmierumgebung finden lassen.


    Solange das Argument von RND positiv ist, null oder -TI ändert sich daran nix; ist es eine konstante negative Zahl, kommt allerdings immer dasselbe Ergebnis bei raus (und auch die nächsten Aufrufe liefern immer dieselbe Folge von Werten). Da TI der Systemzeit-Zähler ist (in 60stel-Sekunden) liefert RND(-TI) ebenfalls eine pseudo-zufällige Folge von Werten, sehr ähnlich RND(0).


    Ob es jetzt 'zufäliger' ist, nur einmal am Programmstart einen negativen Wert ioder Null zu verwenden und danach die gegebene Folge abzuklappern, oder ob das oft verwendete RND(-TI) 'zufälligere' Zufalszahlen liefert- das wist Du in den meisten Fällen nicht unterscheiden können.


    Wirklich wichtig würde die genaue Arbeitsweise der Funktion eh erst dann, wenn sie als Crypto-Werkzeug mißbraucht wird. Oder wenn die 'Pseodo'-Komponente sichtbar wird, weil z.B. 'zufällige' Grafiken auffällige Muster bekommen.

  • So denke ich ebenfalls mc71. Darum bin ich auch nicht schreiend auf die Knie gefallen, als ich die Werte von ZeroZero gesehen habe, sondern hatte mir halt vorgenommen sie mit PHP zu ersetzen.
    "Hauptsache, es kommt eine Zahl mit 9 Nachkommastellen und einer 0 vor dem Komma dabei heraus."

  • Ob es jetzt 'zufäliger' ist, nur einmal am Programmstart einen negativen Wert ioder Null zu verwenden und danach die gegebene Folge abzuklappern, oder ob das oft verwendete RND(-TI) 'zufälligere' Zufalszahlen liefert- das wist Du in den meisten Fällen nicht unterscheiden können.

    Also wenn das stimmt dann taugt der PRNG überhaupt nichts. Negative Werte werden als seed verwendet, korrekt wäre also, einmal RND(-TI) aufzurufen (oder auch gar nicht, falls das C64 BASIC hier automatisch "seedet", hab mich nie genauer damit beschäftigt) und dann nur noch RND(0). Wenn man immer RND(-TI) aufruft wird nur dieselbe Funktion auf eine monoton steigende Folge angewandt -- ein PRNG, der keine besseren Zufallszahlen als das liefern kann, ist unbrauchbar.


    Zum Thema: Eine Funktion, die die Ausgabe eines brauchbaren PRNG in das Intervall [0,-1[ skaliert, "emuliert" die Zufallszahlen des C64 BASIC sinnvoll, also einfach so machen. Vorher natürlich seeden.

  • Die Schriftart hat mich ein wenig gewurmt, immerhin will ich da ja schon am Original bleiben.
    Ich habe mich letzlich dafür entschieden im Spiel Worte und Zahlen durch Bildchen selbiger zu ersetzen.

    Wieso so kompliziert? Nimm doch z.B. http://style64.org/c64-truetype , die "Mono"-Varianten als .woff sollten tun. Edit: Ah, das Spiel benutzt gar nicht den Original-Zeichensatz. Hm. Vielleicht findet sich ja ein Konverter von C64-Char-Bitmap nach .woff im Netz, kann ja nicht so schwer sein(tm).

  • Du hast allerdings dahingehend Recht, dass Du ein hinreichend ÄHNLICHES Spiel hinbekommen wirst, auch wenn Du sämtliche anderen Randparameter Deines RNG ignorierst, solange er nur Zahlen zw. 0 und < 1 generiert und Dir z. B. Periode und Tiefe egal sind. Er wird dann ähnlich aussehende Zufallszahlen liefern und damit ein ähnlich funktionierendes Spiel ermöglichen, und mehr wolltest Du ja scheinbar auch gar nicht.

  • Also wenn das stimmt dann taugt der PRNG überhaupt nichts.

    Die RND()-Funktion von CBM BASIC taugt nicht nur nichts, die ist völlig kaputt.


    Außer daß sie Zahlen zwischen 0 und echt kleiner 1 liefert, geseedet werden kann und augenscheinlich eine Gleichverteilung liefert, fällt sie durch so ziemlich jeden anderen PRNG-Test.


    Die meisten Seeds enden nach etwa 100000 Aufrufen in einem Zyklus mit nur noch etwa 58000 verschiedenen Zahlen. Es gibt aber auch Seed-Werte, für welche die Funktion nach dem "Aufwärmen" in einen kurzen Zyklus einläuft, der nur noch 723 verschiedene Zahlen liefert!


    Grundsätzlich ist der verwendete Generator vom linear-kongruenten Typ. Der Programmierer der die damals zwischenhatte, wollte aber wohl noch was "Würze" hineinbringen - nach der Multiplikation und Addition tauscht die Routine die vordere mit der hinteren Hälfte der Mantisse.


    Jeder, der sich mit dem Thema auch nur ein ganz kleines bischen beschäftigt hat, weiß, daß die hinteren Stellen eines derartigen Generators auch nicht annähernd zufällig sind, diese dann auch noch nach vorne zu bringen bricht den Generator.

  • Wieso so kompliziert? Nimm doch z.B. http://style64.org/c64-truetype , die "Mono"-Varianten als .woff sollten tun. Edit: Ah, das Spiel benutzt gar nicht den Original-Zeichensatz. Hm. Vielleicht findet sich ja ein Konverter von C64-Char-Bitmap nach .woff im Netz, kann ja nicht so schwer sein(tm).

    Ja, ähnlich dachte ich auch bevor ich mit dem Suchen nach der Schriftart begann, nur nicht ganz so optimistisch.
    Für einen Konverter müsste ich aber auch erstmal die Schriftart aus dem Spiel heraus holen. Ich bin ja schon froh, das M.J. mir den Basic-Code gegben hat.
    Von daher war es denke ich schon das einfachste anstelle von Schriftzeihen einfach Grafiken auszugeben. Und immerhin, der Unterschied ist - bislang - nur an 1-2 Stellen zu sehen wenn man danach sucht.

  • Für einen Konverter müsste ich aber auch erstmal die Schriftart aus dem Spiel heraus holen.

    Najaaa, einfach das Originalspiel im Emulator starten, in den Monitor gehen, $DD00 und $D018 ansehen, dann den Zeichensatz aus dem entsprechenden Speicherbereich aus dem Monitor heraus abspeichern. Ist nicht wirklich schwer, aber dann noch Konvertieren etc. ist vielleicht eher eine Aufgabe für später. ;)

  • Najaaa, einfach das Originalspiel im Emulator starten, in den Monitor gehen, $DD00 und $D018 ansehen, dann den Zeichensatz aus dem entsprechenden Speicherbereich aus dem Monitor heraus abspeichern. Ist nicht wirklich schwer, aber dann noch Konvertieren etc. ist vielleicht eher eine Aufgabe für später. ;)

    Das mag sehr übersichtlich klingen. Das mag auch für Leute, die sich tiefer mit dem C64 beschäftigt haben recht übersichtlich sein, aber ... XD



    Für Interessierte habe ich hier mal den aktuellen Stand hochgeladen.
    Der hat hier und da noch Fehlerchen, die KI ist noch nicht einprogrammiert und vor allem will ich den Part mit den Userdaten noch überarbeiten, aber per se läuft es schon und ist auch schon spielbar.

  • Najaaa, einfach das Originalspiel im Emulator starten, in den Monitor gehen, $DD00 und $D018 ansehen, dann den Zeichensatz aus dem entsprechenden Speicherbereich aus dem Monitor heraus abspeichern.

    Ich weiß nicht, ob das was hilft, aber ich hab mal im Emulator den vollständigen Zeichensatz (256 Zeichen von 8x8 Pixel Größe) auf dem Bildschirm anzeigen lassen und davon einen Screenshot erstellt. Von den angezeigten Zeichen dürften nur die ersten zwei Zeilen relevant sein. Bei den unteren Zeilen handelt es sich nicht um Zeichen im eigentliche Sinne, sondern um eine Graphik, die anstelle von Zeichen auf dem Bildschirm eingeblendet wird.

  • Das st lieb MJ, aber die relevanten Zeichen habe ich bereits als Grafik. Habe sie einfach aus Screenshots vom Spiel ausgeschnitten und mir dann daraus meine verschieden farbigen Sprites gebastelt die ich als Hintergrund in 16x16 Pixel großen Divs verwende um dann so die einzelnen Buchstaben zu simulieren. Und ja, originalgetreu wären sie mit 8x8 Pixeln, aber im Zeitalter der Full-HD-Bildschirme habe ich dann die Screenshots des Emulators nicht auf 1/2 runterskaliert.


    Nettes feature aber für mich ist das Wissen, das die Grafik vom Startbildschirm eigentlich keine Grafik ist. Da hatte ich nicht mit gerechnet.



    Sieht gut aus! Bin beeindruckt! :)

    Danke sehr. War erstaunlich wenig Arbeit bislang, trotz dessen ich bewusst Fehler des Spieles ebenfalls mit eingebaut habe.
    Auch die KI zu implementieren dürfte sehr einfach werden.


    Lediglich die Seite, wo die User Namen, Städtenamen und Geschlecht angeben müssen, die nervt mich momentan gewaltig in der Umsetzung.
    Ebenso bin iich noch nicht sicher, wie ich einen bestimmten Anzeigefehler kopiere.
    Wenn durch Ankäufe von Gebäuden so viel Geld ausgibt, das die Dollar-Menge eine Stelle weniger hat, so wird im Spiel die letzte Zahl der alten Summe hinter die neue Summe angehängt (bzw. vmtl. eher nicht durch ein Leerzeichen ersetzt).
    Da bin ich mir noch nicht sicher, wie ich das einbaue, aber da wird mir auch noch was einfallen, wenn ich das Userformular erst einmal hinbekommen habe ^^

  • So liebe Leutz


    Nachdem ich in den letzten zwei Wochen stark durch Arbeit und meinem Problem bei den Userangaben gebremst wurde ist es jetzt vollbracht.
    Das Spiel 'Bürgermeister' läuft jetzt mit allen Funktionen, Einstellungen und Anzeigen so, wie es von M.Dirks für den C64 rausgebracht wurde.


    Aber nein, es gibt schon Unterschiede:
    - Ich habe mich letztlich dazu entschieden den im vorherigen post erwähnten Anzeigefehler nicht zu implementieren
    - Die Speicherstände werden nicht auf einer extra Diskette gespeichert, sondern in einer MySQL-Datenbank. Entsprechend sind dort Änderungen notwendig gewesen.
    - Es wird bei mir kein Sound ausgegeben. Der war beim Spiel nicht wichtig und prägnant genug als das ich den Aufwand dafür für gerechtfertigt gehalten hätte.
    - Bei der Eingabe des Geschlechts des Spielers sind zwei winzige Abweichungen. Im Spiel kann diese Eingabe nicht leergelassen werden, und sobald 'm' oder 'w' eingegeben wurde springt das Spiel automatisch weiter. Das ist bei mir beides anders.


    Zudem habe ich direkt neben dem Spielfeld die Steuerung erläutert, sowie -je nach Erfordernis - ein Gamepad und eine Tastatur angezeigt, damit es auch per Touchscreen spielbar ist (Ich wollte halt gerne beim Rauchen am Handy testen können ^^).
    Ansonsten aber bin ich sehr glücklich damit, wie originalgetreu mir die Umsetzung gelungen ist.


    Ich möchte mich an dieser Stelle bei euch für die Ideen, Kritik und Hilfe bedanken.
    Ganz besonders und herzlich gilt mein Dank M.J., denn ich weiß nicht, wie lange ich ohne Ihn gebraucht hätte, um an den Quellcode vom Spiel, und somit an die zwingend benötigten Balancingdaten zu kommen. Sein Vorbereiten hat mir sehr geholfen schnell die Logiken des Spieles (aber auch Basic selbst ein wenig) zu verstehen und nachvollziehen zu können. Lieben Dank dafür :)
    Ebenfalls geht ein ganz lieber Dank an eine kleine FB-Gruppe die sich mit Webprogrammierung beschäftigt und mir bei zwei kleinen Problemen schnell und gut geholfen haben. [ Link für interessierte ]



    Wenn ihr es gerne mal testen wollt, so könnt ihr es dort online finden: http://bm.schwubbe.de
    Hinweis zum Speichern: Das Speichern wird - wie im Original - nur versteckt angeboten, wenn man im Screen der Monatsbilanz "runter" und "Feuer" (im Spiel gleichzeitig, bei mir nacheinander) drückt.
    Solltet ihr Fragen haben, Auffälligkeiten beobachten oder doch noch auf Fehler stoßen, so seid versichert: Ich bin über jedwede derartige Rückmeldung dankbar.


    Wie ich schon in einem meiner ersten Posts erwähnte mache ich mir Gedanken, ob ich das Spiel in weiteren Schritten von Fehlern befreie, und hier und dort erweitere, anpasse, etc. pp., quasi als Version 2.0.
    Da ich mit diesen Gedanken halt noch nicht durch bin, bin ich auch hier sehr an Ideen und Rückmeldungen interessiert.


    Liebe Grüße
    schwubbe