Hallo Besucher, der Thread wurde 34k mal aufgerufen und enthält 276 Antworten

letzter Beitrag von Chagizzz am

Kleine BASIC-Compo fuer zwischendurch: Draw The Frog

  • Ich habe jetzt auch einige angeschaut. Hat eigentlich jemand versucht die Symmetrie des Frosches (bis auf die Pupillen) zu nutzen?

  • Beim schönen Frosch nutze ich die Symmetrie für den Umriss, naja halbwegs - für die zweite Hälfte gehe ich rückwärts durch den String, aber die Bedeutung der Zahlen (on ... gosub) ist dann leicht anders.


    Zum Ausfüllen verwende ich eine Schleife, deren Laufvariable so ausgewertet wird, dass zuerst die Füllinie breiter wird ehe sie wieder abnimmt (alle drei Zeilen verändert sich die Breite des Frosches um eine Einheit). Den Ansatz hab ich aus "Think like a Programmer".


    Beim Mund nutze ich ebenfalls die Symmetrie - er wird von der Mitte aus nach beiden Seiten verbreitert.


    Bei den Augen wurde ich faul - ein Array mit den Steuerzeichen, das, nacheinander ausgegeben, ein Auge öffnend zeichnet.


    Ach ja, der Bauch, da nutze ich auch den Umrisszeichner, nur ohne Symmetrie - lohnt da nicht.

  • Da der Ansatz ja doch ein wenig anders ist, ein paar Worte dazu ;-)
    Mir ging es schon darum eine sagen wir mal kompakte Loesung zu generieren, aber dabei mit BASIC selbst zu arbeiten.
    Also READ, DATA statt REM und auch Daten in Strings wollte ich nicht. Da ist was Optimierung angeht noch Luft nach oben.
    Insgesamt liess sich diese Version aber SEHR schnell programmieren - das war mir wichtig, hehe.


    Ich nutze aus, dass der Frosch bis auf den oberen Teil der Pupille symmetrisch ist (das spart kaum Platz, eher im Gegenteil, gefiel mir aber)
    Dann habe ich von Hand 'gezeichnet':
    von der Mitte ausgehend: start, ende, Farbe, Zeile, flag
    In dieser Reihenfolge wird auch gezeichnet.


    0 1 5 2 0
    0 1 5 3 0
    0 4 5 4 0
    0 5 5 5 0
    0 5 5 6 0
    0 5 5 7 0
    0 4 0 8 0
    0 4 5 9 0
    0 4 5 10 0
    0 3 5 11 0
    0 3 5 12 0
    0 3 5 13 0
    #feet green
    0 5 5 14 0
    0 5 5 15 0
    0 5 5 16 0
    #belly
    0 0 1 12 0
    0 1 1 13 0
    0 1 1 14 0
    #blue feet
    3 4 6 14 0
    3 3 6 15 0
    5 5 6 15 0
    0 1 6 15 0
    0 1 6 16 0
    #eyes
    2 3 1 0 0
    1 4 1 1 0
    1 4 1 2 0
    1 4 1 3 0
    2 3 1 4 0
    #eyes black
    2 3 0 2 0
    2 3 0 3 0
    3 3 0 1 1


    Aus den 5 Bytes mache ich wie folgt zwei:
    a=end*16+color+flag*128
    b=zeile*8+start


    a,b liegen in DATA und werden gelesen. Dann wird von offset+start bis offset+ende in der passenden Farbe links und rechts vom offset geplottet.
    Das Flag (welches ich nur in der letzten Zeile benutze) verschiebt einfach die Mitte um 2 chars, so dass auch die Pupille oben noch symmetrisch gezeichnet werden kann, nur eben symmetrisch um eine andere Mitte ;-)
    Man kann den Code eigentlich ganz gut lesen noch. Durch den Vergleich mit 11 wird ueberprueft ob das letzte Byte schon gelesen wurde. Also ein sauberes Ende.


    Das hier ist das gesamte Programm in zwei (etwas langen) Zeilen:
    0 reada,b:forc=(band7)*2to(a/8+1)and15:d=1264+int(b/8)*40+20:poked-c-1,160:poked+c,160:e=d+54272:pokee-c-1-(a>2^7)*2,(aand7):pokee+c,(aand7):next:ifb<>11goto0
    1 data 21,16,21,24,69,32,85,40,85,48,85,56,64,64,69,72,69,80,53,88,53,96,53,104,85,112,85,120,85,128,1,96,17,104,17,112,70,115,54,123,86,125,22,120,22,128,49,2,65,9,65,17,65,25,49,34,48,18,48,26,176,11

  • Dann erklaere ich meine Variante auch mal:


    Bei meinem Ansatz habe ich den Frosch so gespeichert, wie man ihn in einem Multicolor-Sprite speichern wuerde, also 2 Bit pro Pixel, somit entspricht jeder Farbwert einer Zahl von 0-3. Um Speicherplatz zu sparen, habe ich ebenfalls die Symmetrie ausgenutzt, somit benoetige ich nur die Haelfte der Bytes (25 um genau zu sein). Allerdings habe ich bei meiner Version keine Korrektor drin fuer die Pupille, daher ist meine Version eh nichtmal fertig, so gesehen.


    Mithilfe der 4 Farbwerte (0-3) lese ich die tatsaechliche Farbe aus einem kurzen String namens "FA@E", lustig dass das irgendwie wie "FACE" aussieht, hat aber damit nix zu tun, das sind eigentlich nur die Farbwerte blau, weiss, schwarz, gruen (F=6, A=1, @=0, E=5). Diese stehen bei mir in einer REM-Zeile. Ausgelesen wird dies mithilfe von PEEK.


    Nun wird der Frosch einfach mithilfe von ein paar Schleifen symmetrisch in den Bildschirmspeicher gePOKEt. Dazu muessen die Werte aber erst wieder "getrennt" werden, denn ich brauche ja 1 Byte pro Pixel, habe aber in meinen DATA-Zeilen immer 4 Pixel in jedem Byte drin. Dies wird durch das Konstrukt A/(4^I) AND 3 erledigt. Der Rest ist dann nur Ermitteln der Adresse fuer Farb- und Bildschirmspeicher und das Schreiben der entsprechenden Werte. Und ich sehe gerade, ein paar Byte haette auch ich noch sparen koennen, da habe ich teilweise ein paar Leerzeichen zu viel und den Wert 32+128 haette ich auch gleich als 160 schreiben koennen :saint:

  • Echt interessante Lösungen. Habe noch nicht alle im Detail durch und mit dem Verständnis läufts noch nicht so, aber wird bestimmt noch.

    Mein zweiter Favorit ist die Version von @Chagizzz, die Idee mit dem Hin- und Herschauen durch die Augenschlitze und dem anschliessend langsamen Oeffnen fand ich witzig

    Juchu, ich bin erwähnt...

    Auf jeden Fall fand ich seine Beitraege unterhaltsam, daher erhaelt er einen Ehrentitel

    Von daher moechte ich auch ihm einen Ehrentitel verleihen

    Du hast meine volle Zustimmung zu den Zufallsprojekten.

    Drei Beiträge eingereicht (1x kurz, 2x etwas länger). An die Kür-Version hab' ich gar nicht mehr gedacht. Mist. Auf die Uhr guck... Vielleicht kommt noch was...

    Chagizzz: Fast genau so wollte ich es auch basteln, nur hatte mich die Zeit und Lust gestern verlassen... Die Füsse hatte ich auch schon so ähnlich und ich wollte die Augen zwinkern lassen. Das war mir dann aber leider zuviel gefummel...

    Lustig, da ich die Compo zwar immer irgendwie auf dem Schirm hatte, aber auch erst am letzten Tag angefangen habe, bzw. mit der "interessanteren Version" erst Abends noch was gebastelt habe.
    Ist ja auch irgendwie sehr "einfach" geworden (mit Arrays).

    Meine wirreste Lösung wollte ich noch kurz erklären (ist das übrigens die einzige, die die Farben getrennt malt?):

    Diese wiederrum ähnelte meiner ersten Idee. Mangels Zeit habe ich es dann aber doch sehr einfach gehalten.

    Da ich zZ Krank geschrieben bin (Achillessehne gerissen) kommt man auf so Sachen wie einmal bei einer kleinen Basic compo mitmachen. Grundsätzlich hab ich in Richtung C64 absolut keinen Plan, aber es kam zumindest n Frosch bei raus. Was ihr aus ein paar zahlen alles herausholt ist echt erstaunlich! Und wie bei den meisten überhaupt ein Frosch herauskommen kann ist für mich zZ noch rätselhaft.

    Na dann "Willkommen bei den aktiven"... und gute Besserung.

    Ich habe jetzt auch einige angeschaut. Hat eigentlich jemand versucht die Symmetrie des Frosches (bis auf die Pupillen) zu nutzen?

    Bei meiner 354 Byte Version nutze ich das. Jede Zeile besteht im Prinzip aus drei Bytes für die drei dargestellten Farben.
    Nur in Zeile 1 Spiegel ich nicht, sondern gebe links und rechts die gleiche Zeichenfolge aus.


    Mangels Zeit habe ich da nicht weiter gekürzt. Im Prinzip sollte die Farbinformation noch im jeweiligen "Zeilenbyte" unterbracht werden (2 Bit für die Farbe, 6 für die Pixel). Nicht vorkommende Farben wären dann entfallen und ich hätte noch Daten eingespart. Schließlich hätten die DATA Zeilen in Zeichenketten umgewandelt werden müssen um weitere Bytes zu sparen....


    ...aber ich war dann erstmal zufrieden und habe es so gelassen - insbesondere, da mich der gescheiterte Versuch die IF2^J.... Zeilen zusammenzufassen echt Nerven gekostet hat.



    Auf jeden Fall eine gelungene Compo und lehrreiche Beiträge.
    Dank an ZeHa und allen, die Ihre Beiträge abgegeben haben.

  • Mir ist gerade noch aufgefallen, dass die "gelbe" Version von @Tale-X tatsaechlich noch einen weiteren Fehler beinhaltet: Es fehlt eine Zeile Frosch (oberhalb vom Bauch). Damit kann das Programm natuerlich nicht so gewertet werden wie bisher, denn diese zusaetzliche Zeile wuerde definitiv noch mehr Bytes benoetigen. Daher geht der Punkt an der Stelle doch an @Mac Bacon. Natuerlich gehe ich davon aus, dass Tale-X hier keinen Taeuschungsversuch unternommen haben wird :D aber die Compo ist vorbei und der Frosch fehlerhaft, Du kannst aber gerne noch eine nachtraeglich korrigierte Fassung erstellen, um zumindest zu sehen, wie viel Byte diese dann betragen wuerde. :)

  • So, hier jetzt der Frosch so wie er sein sollte. Die zusätzliche Zeile macht den Code 2 Byte länger und ist damit immer noch mit dem 128er eintippbar :thumbsup:

  • War ncht c64 gefragt? *grübel*....just kidding.


    Alles tolle Lösungen wenn ich die mal so durchgehe. Schnelle, langsame, kurze, längere, sehr krative, einfache und aufwendige... alles dabei. Ich finde es super, dass so viele mitgemacht haben.
    So kleine Compos für 'zwichendurch' finde ich gut und können gerne öfter kommen (muss ja nicht immer glaich ein ganzes Game oder App sein).


    Gruß, Gerd

  • Danke :) ist ein ziemlich schnörkelloser, geradliniger Ansatz - die unteren 2 Bit eines Zeichens codieren die Farbe, die restlichen wieviel Elemente mit der Farbe zu zeichnen sind. Das schöne am Frosch ist, dass die Häufigkeit überall ein vielfaches von 2 ist, brauch also nur Zeichenzahl/2 zu kodieren und dann immer zwei inverse Leerzeichen schreiben.


    Der Frosch ist natürlich für den C64... das mit dem 128er dient nur zur Relativierung der überlangen Zeile :D

  • - Die kuerzeste Variante, die man direkt am C64 eintippen kann und die auch wirklich gueltiges BASIC darstellt, ist von @Wurzelzwerg mit 179 Byte (verwendet einen richtigen String im Gegensatz zu YPS' Version)

    Leider nein.
    Die erste Zeile lässt sich zwar eingeben, Aber der Frosch bekommt davon ein Sabbermaul und Augenmatsch.
    Tatsächlich muss man einige Bytes im Monitor nachträglich korrigieren

  • Inspiriert durch Rapid Erasers genialen Einsatz von left$ für die Farbgebung, habe ich meine saubere Lösung in gültigem Basic nochmal überarbeitet - jetzt mit Stringverarbeitung an Stelle von Peek & Pokes, aber weiterhin eintippbar. Dateigröße ist dabei leicht auf 166 geschrumpft. Mein Ansatz war und ist immer noch der Gleiche wie unter anderem auch der von Tale-X, also Codierung von Farbe und Anzahl in einem Byte. Interessant vielleicht zu erwähnen, dass jetzt im selben String nicht nur die Froschdaten, sondern auch Farbzuweisung, Reverse und die zu schreibenden Leerzeichen stehen.


    ypsfrog_purebasic3.prg

  • Die animierten Lösungen sind allesamt echt klasse 8o !
    [...]
    ZeHa: Danke für den froschigen Spass :winke: !!

    Beiden Worten möchte ich mich anschließen! Hat mir auch großen Spaß gemacht, mal wieder tagelang über einem einfachen Problem in Basic zu brüten. ^^


    Ich habe jetzt auch einige angeschaut. Hat eigentlich jemand versucht die Symmetrie des Frosches (bis auf die Pupillen) zu nutzen?

    Versucht hatte ich das, es lockte ja immerhin eine Ersparnis von 17-25 Bytes. Leider habe ich es nicht geschafft daraus Kapital zu schlagen, das resultierende Programm war anschließend immer länger als ohne Ausnutzung der Symmetrie. X/


    Noch kurz zu meiner Lösung: Die ist eigentlich so straightforward wie sie nur sein kann, da war ich schon überrascht das nicht mehr Teilnehmer diesen Ansatz gewählt haben.
    Die Graphicdaten für den Frosch liegen bei mir in Form eines normalen Sprites im Speicher. Die beiden geschachtelten Schleifen lesen die Daten Zeile für Zeile, Pixel für Pixel aus und printen jeweils ein reverses Space in der ermittelten Farbe des Pixels auf den Bildschirm.


    Zu den Unsauberkeiten:
    - die Spritedaten wurden "einfach so" in den Speicher geklatscht, wie man es halt von Assembler her gewohnt ist. Das macht es freilich schwer das Programm mit den sauberen Lösungen zu vergleichen; eine Datenablage in Form eines Strings oder gar Datazeilen kosten ja gleiche einige Bytes mehr. Aber hey, ein sauberes Programm war ja nicht verlangt. :D
    - die Spritedaten liegen im Speicher gleich hinter dem letzten "next:". Den Syntax Error könnte man vermeiden indem man an der Stelle noch ein "rem"-token einfügt. Aber das hätte ja ein zusätzliches Byte gekostet!
    - die Farbe grün wurde auf die Bitkombination 00 abgebildet. Da der Frosch ein paar Zeilen enthält die nur grüne Pixel enthalten ergaben sich dadurch mehrere Nullbytes am Stück. Die wurden auch gleich als Kennung für das Ende des Basicprogramms mitbenutzt. :) Mit der Konsequenz das nun zwischen dem Ende des Programms und dem Anfang des Variablenspeichers eine kleine Lücke klafft in der noch Nutzdaten stehen. Man darf das Programm also nicht editieren, dann läuft's nicht mehr...


    ZeHa: Mach, wie du meinst (Ich möchte aber nicht in deiner Haut stecken... :bgdev ). Das rasselt auf jeden Fall dutzende Beschwerden, Abmahnungen, Klagen etc. :zeig: Selbst Schuld ^^ !

    Das befürchte ich auch. :D



    PS: Den gelben Frosch fand ich am allercoolsten! Dachte Tale-X hätte sich da kurzerhand über die Regeln hinweggesetzt um der Lösung seinen ganzen persönlichen Stempel aufzudrücken. Frei nach dem Motto: Normal is Boring! :thumbsup:

  • die Farbe grün wurde auf die Bitkombination 00 abgebildet. Da der Frosch ein paar Zeilen enthält die nur grüne Pixel enthalten ergaben sich dadurch mehrere Nullbytes am Stück. Die wurden auch gleich als Kennung für das Ende des Basicprogramms mitbenutzt.

    Ah, gefixxt eingeschädelt 8o .


    Ich hatte bei irgendeiner Version auch versucht, die Daten hinten ranzuhängen, aber da hatte mir das BASIC dann immer einen Streich gespielt und die Daten verkrüppelt. War ich wohl irgendwie zu blöd zu :) .


    Man könnte mit diesem Frosch auch ein schönes Spiel machen, wo mehrere Spieler gegeneinander und so... :woot::gruebel:platsch::D:roll2:

  • Die Farbe grün muss man doch nur einmal vorgeben, solange sich im Bildaufbau in der Farbe erstmal nichts ändert. Einmal eingestellt bleibt sie ja erhalten, muss also nicht jedes Kästchen eine eigene Farbinformation (Byte) erhalten.
    Nur so, ansonsten ist das aber 'mal wieder hier alles recht gekonnt. Bevorzuge nur sauberere Programme, vlt. - Genialität ok, aber weniger verquer ;).