Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 20 von 45

Thema: Progforum Contest 2013 - Teenage Mutant Ninja (?) Turtles

  1. #1

    Progforum Contest 2013 - Teenage Mutant Ninja (?) Turtles

    Willkommen, liebes Progforum, zu unserem alljaehrlichen Programmier-Contest !

    Dieses Jahr haben wir (d.h. Jeez, DFYX und ich) uns etwas ganz Besonderes ausgedacht.
    Um allen gerecht zu werden, haben wir uns ueberlegt, dieses Mal sowohl etwas Programmiertechnisches als auch etwas Kuenstlerisches zu machen.

    Ziel ist es, einen Interpreter fuer unseren speziellen Turtle-Graphik-Dialekt zu schreiben und damit ein aesthetisch besonders ansprechendes Bild (inklusive des Turtle-Graphik-Codes) zu generieren.
    Hierzu bieten sich L-Systeme an, muessen aber nicht verwendet werden.

    Wie letzten Endes die Graphiken erzeugt werden, ist jedem selbst ueberlassen. Hauptsache ist, man kann sie am Ende hier im Forum praesentieren. Valide Moeglichkeiten sind so z.B.

    • C++ Programm mit SDL / OpenGL
    • Javascript und / oder HTML5
    • Bashscript, das eine SVG-Datei erzeugt
    • DCPU16 Assembler, welches eine Portable Pixmap Datei ausgibt
    • ... was euch sonst noch einfaellt


    Der Contest besteht aus drei abstimmbaren Teilen.
    1. Der Sourcecode des Interpreters - wie elegant und womit setzt ihr den Turtle-Graphik-Interpreter um?
    2. Die Aesthetik eueres eingesendeten Beispielbildes
    3. Die Art und Weise, wie ihr zum Code eueres Beispielbildes gekommen seid.

    Gewinner ist derjenige, der in der Summe aller drei Multiple-Choice-Umfragen die meissten Prozentpunkte erreicht.

    Einsendeschluss ist voraussichtlich Sonntag, der 14. April. Anschliessend gibt es zwei Wochen Zeit für die Abstimmung.

    Jeder Interpreter gilt als eigenstaendige Einsendung. Es steht allerdings jedem frei, mehrere Einsendungen zu machen oder mehrere Bilder zu seinem Interpreter abzugeben. Es zaehlt dann in allen Kategorien das jeweils beste Ergebnis.

    Dieses Mal wird es sogar etwas zu gewinnen geben. Jeez, DFYX und ich haben ein paar Steam-Keys gesponsort (wenn ihr euch anschliessen wollt, weitere Keys sind gerne willkommen), aus denen die Gewinner waehlen koennen.
    Der erste Platz darf sich 3 Keys aussuchen, der zweite Platz zwei Keys und der dritte Platz bekommt noch einen Key. Bisher haben wir folgende Keys im Angebot:

    • Bastion
    • Cargo! The Quest for Gravity
    • Cave Story +
    • 2x Crayon Physics Deluxe
    • 2x Cogs
    • Defcon
    • 2x Dungeon Defenders + DLC
    • Gemini Rue
    • Gish
    • Humble Bundle 3
    • 2x Machinarium
    • Multivinia
    • NightSky
    • Resonance
    • 3x Superbrothers: Sword & Sorcery EP
    • Swords and Soldiers HD
    • The Binding of Isaac
    • Titan Quest (German)
    • Trine
    • Warhammer 40,000: Dawn of War


    Und damit ihr auch wisst, was euerer Interpreter mindestens koennen muss, hier alle notwendigen Befehle fuer die Turtle-Graphik:
    Code:
    2D Turtle-Grafik, optional auf 3D (oder mehr) erweiterbar
    
    F  : move forward $length units while drawing
    X  : move forward $length units without drawing
    *  : multiply length with $factor
    /  : divide length by $factor
    +  : turn left by $angle degrees
    -  : turn right by $angle degrees
    >  : multiply angle with $factor
    <  : divide angle by $factor
    !  : increase $factor by 1
    ?  : decrease $factor by 1
    [  : push all states to stack
    ]  : pop all states from stack
    0-7: line colour, Palette: black, red, green, yellow, blue, magenta, cyan, white
    
    Es duerfen auch zusaetzliche Operationen verwendet werden.
    (z.B. Laden von RGB-Farbpaletten, etc)
    
    Startzustand: 
    $factor: 2
    $length: 1
    $angle: 90
    Facing up at start
    Und nun viel Spass mit unserem Contest.

    Geändert von Ineluki (05.04.2013 um 23:01 Uhr)

  2. #2
    Kleine Anmerkung:
    Code:
    [...]
    0-8: line colour, Palette: black, red, green, yellow, blue, magenta, cyan, white
    [...]
    Das muss "0-7" heißen. ^^

    Aber dass mit dem Stack versteh ich noch nicht so ganz. Heißt das, wenn ich z.B. "[FFF]" eingebe, dass er dann die drei Schritte nochmal ausführt? Kann man dann mit "]" den Stack nochmal ausführen? Also "[FFF]]"?

    Ansonsten: Sehr netter Wettbewerb. Ich versuch da auch mal was zu basteln. Ich hoffe, dass Java trotz der ganzen Sicherheitsbedenken erlaubt ist. ^^

  3. #3
    Sollte 0-7 heißen, ja.

    Stack ist so zu verstehen, dass bei "]" die Position und Orientierung des "Stifts", sowie $factor, $length und $angle wieder auf die Werte gesetzt werden, die sie beim zugehörigen "[" hatten.

    "F/[+F]-F" würde also zum Beispiel ein T zeichnen. (Gibt übrigens ein schönes Fraktal, wenn man rekursiv jedes F außer dem ersten wieder durch diese Zeichenkette ersetzt)

  4. #4
    ah, ok. Also leichter, als ich dachte. Danke

  5. #5
    Noch zwei Dinge, die mir grade so aufgefallen sind:

    Ihr solltet für euch selbst definieren, was passiert, wenn jemand eine ungültige Operation ausführen will. Also etwa durch 0 teilen oder von einem leeren Stack poppen. Ich für meinen Teil werde solche Befehle schlicht ignorieren und eine Warnmeldung ausgeben. Ähnliche Überlegungen sollte man auch für die Multiplikation mit 0 anstellen, weil sich der Stift anschließend nicht mehr bewegen bzw. nicht mehr rotieren lässt.

    Außerdem wird natürlich auch die Farbe auf den Stack gepusht. Das hatte ich vorhin vergessen.

  6. #6
    Wie soll der Code eingelesen werden? Command-Prompt, Textdokument oder dergleichen?

  7. #7
    Bleibt euch überlassen. Insgesamt habt ihr so ziemlich überall, wo wir nichts vorgegeben haben, freie Hand.

  8. #8
    mmh, Programm steht, aber ich bin zu untalentiert für solche Grafiken >_<

  9. #9
    Wie sollen die Einsendungen eingeschickt werden?

  10. #10
    Bis jetzt war es immer so, dass die Ergebnisse in einem Thread präsentiert wurden waren.

  11. #11
    Genau. Einsendungen hier in den Thread. Die Umfragen kommen dann in jeweils separate Threads, ebenso wie die Siegerehrung.

  12. #12
    Hier ist meine Abgabe.
    Einmal der Source-Code, eine Windows-, Mac- und Linux-Version.
    Ich kann persönlich nur die Windows-Version testen, für die Mac- und Linux-Versionen ist keine Garantie von meiner Seite, dass sie starten werden.

    Code ist in Java geschrieben.
    Für den Grafikkontext wird OpenGL verwendet, als Wrapper lwjgl.

    Der Source-Code kann einfach erweitert werden um zusätzliche Operationen hinzuzufügen.
    Wird das Programm über die Kommandozeile gestartet wird das erste übergebene Argument, falls vorhanden, als Code kompiliert.
    Weitere Argumente werden ignoriert.
    Sollte kein Argument übergeben werden oder nicht über die Kommandozeile gestartet werden wird ein zufälliger Code von Länge 500 oder mehr Zeichen erzeugt.
    Fehler werden, sofern nicht über eine Kommandozeile gestartet wurde, in die Datei Out.txt geschrieben.

    An Operationen sind derzeit nur die vorgegebenen implementiert. Weitere Funktionen sollten jedoch sehr einfach selbst erstellt werden können.
    Da das ganze Programm sehr Objektorientiert programmiert ist, und zudem in Java, ist es bei weitem nicht so effizient wie es sein könnte. Falls man einen sehr langen Code mit sehr vielen Zeichenaufrufen verwendet muss man eventuell die Heap-Size vergrößern.

    Fenstergröße ist fix auf 640x480 eingestellt, kein Vollbild. V-Sync ist aktiviert, framerate zum Zeichnen liegt bei 10 FPS.
    Mit Druck auf die Escape-Taste kann die Anwendung beendet werden.

    Special thanks to lwjgl für die wundervolle API und die aktive Hilfe im Forum.

    Source-Code: http://www.file-upload.net/download-...ource.zip.html

    Windows: http://www.file-upload.net/download-...ndows.zip.html

    Mac: http://www.file-upload.net/download-...x-Mac.zip.html

    Linux: http://www.file-upload.net/download-...Linux.zip.html

    Hier ein Beispiel wie der (OpenGL) Compiler Initialisiert werden kann:
    Code:
            OGL_Turtle_Compiler compiler = new OGL_Turtle_Compiler();
            compiler.add_operation(new Operation_Color("0", 0, 0, 0));
            compiler.add_operation(new Operation_Color("1", 1, 0, 0));
            compiler.add_operation(new Operation_Color("2", 0, 1, 0));
            compiler.add_operation(new Operation_Color("3", 1, 1, 0));
            compiler.add_operation(new Operation_Color("4", 0, 0, 1));
            compiler.add_operation(new Operation_Color("5", 1, 0, 1));
            compiler.add_operation(new Operation_Color("6", 0, 1, 1));
            compiler.add_operation(new Operation_Color("7", 1, 1, 1));
            compiler.add_operation(new Operation_FactorDecr());
            compiler.add_operation(new Operation_FactorIncr());
            compiler.add_operation(new Operation_Draw());
            compiler.add_operation(new Operation_Move());
            compiler.add_operation(new Operation_Mult());
            compiler.add_operation(new Operation_LengthDiv());
            compiler.add_operation(new Operation_Push());
            compiler.add_operation(new Operation_Pop());
            compiler.add_operation(new Operation_TurnLeft());
            compiler.add_operation(new Operation_TurnRight());
            compiler.add_operation(new Operation_TurnMult());
            compiler.add_operation(new Operation_TurnDiv());
            OGL_Turtle_Program prog = compiler.compile("F/[+F]-F");
            Turtle_Graphic img = prog.run();
    Und hier ein Beispiel wie eine einzelne Operation implementiert werden kann:
    Code:
    public class Operation_TurnLeft extends Turtle_Operation {
        private static final long serialVersionUID = 5036124779502200375L;
        
        private static final String TOKEN = "+";
    
        public String get_token() {
            return TOKEN;
        }
        
        public void affect(final Turtle_Program prog, final Turtle_Graphic image) {
            final Turtle_State state = prog.get_state();
            final Turtle turtle = state.get_turtle();
            turtle.set_angle(turtle.get_angle() + state.get_angle());
        }
        
        public Turtle_Operation clone() {
            return new Operation_TurnLeft();
        }
        
    }
    Sollte das Programm zufälligerweise nicht starten dann bitte ich darum, dass so schnell wie möglich Bescheid gegeben werden kann.
    Bei Fragen und Anregungen bitte hier im Forum kontaktieren oder per Mail an: CornixMail@gmail.com


    Edit:
    Mir ist aufgefallen, dass ich einen ziemlich dummen Fehler in dem Algorithmus für den zufälligen Code habe. Allerdings stellt dies in dieser Situation kein Problem dar, ganz im Gegenteil, das Ergebnis wird durch den Fehler sogar noch verbessert.
    Hier ist ein Screenshot von dem, von DFYX als Beispiel angegebenen, rekursiven Code-Schnipsels:

    Geändert von Cornix (18.03.2013 um 00:57 Uhr)

  13. #13
    Tut nicht unter Mac OS X:

    Code:
     ### Mon Mar 18 01:01:43 CET 2013 ### 
    
    
    org.lwjgl.LWJGLException: Could not get the JAWT interface
    	at org.lwjgl.opengl.AWTSurfaceLock.lockAndInitHandle(Native Method)
    	at org.lwjgl.opengl.AWTSurfaceLock.access$100(AWTSurfaceLock.java:51)
    	at org.lwjgl.opengl.AWTSurfaceLock$1.run(AWTSurfaceLock.java:94)
    	at org.lwjgl.opengl.AWTSurfaceLock$1.run(AWTSurfaceLock.java:92)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at org.lwjgl.opengl.AWTSurfaceLock.privilegedLockAndInitHandle(AWTSurfaceLock.java:92)
    	at org.lwjgl.opengl.AWTSurfaceLock.lockAndGetHandle(AWTSurfaceLock.java:66)
    	at org.lwjgl.opengl.MacOSXCanvasPeerInfo.initHandle(MacOSXCanvasPeerInfo.java:57)
    	at org.lwjgl.opengl.MacOSXDisplayPeerInfo.doLockAndInitHandle(MacOSXDisplayPeerInfo.java:56)
    	at org.lwjgl.opengl.PeerInfo.lockAndGetHandle(PeerInfo.java:85)
    	at org.lwjgl.opengl.MacOSXContextImplementation.create(MacOSXContextImplementation.java:47)
    	at org.lwjgl.opengl.ContextGL.<init>(ContextGL.java:132)
    	at org.lwjgl.opengl.Display.create(Display.java:847)
    	at org.lwjgl.opengl.Display.create(Display.java:754)
    	at org.lwjgl.opengl.Display.create(Display.java:736)
    	at cs.turtle.misc.OGLWrapper.make_display(OGLWrapper.java:39)
    	at cs.turtle.misc.MainContest.main(MainContest.java:50)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:601)
    	at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
    Dazu auf der Kommandozeile:
    Code:
    JavaVM WARNING: JAWT_GetAWT must be called after loading a JVM

  14. #14
    Vielen Dank für die Information.
    Eine schnelle Google-Suche ergab folgenden Treffer zu dem Problem:
    http://lwjgl.org/forum/index.php?topic=4326.0

    Zitat Zitat
    it seems that the JAWT/NSView API will intentionally not be included in OpenJDK 7
    Zitat Zitat
    the OS X port of LWJGL needs to be completely rewritten
    So wie es aussieht, heist das also, dass dieses Programm auf Mac nicht laufen wird.
    Zumindest nicht solange die nächste Version von lwjgl erscheint.
    Ich werde mich trotzdem versuchen noch ein bisschen zu diesem Thema schlau zu machen, vielleicht lässt sich ein Weg finden, immerhin ist dieser Beitrag bereits ein Jahr alt.

    Edit: Wie es aussieht wurde das Problem bis heute noch nicht komplett aus der Welt geschafft: http://lwjgl.org/forum/index.php/top....html#msg26517

    Geändert von Cornix (18.03.2013 um 01:14 Uhr)

  15. #15
    Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)

    Edit:
    Es könnte ein Kompatibilitätsproblem von LWJGL mit Java 1.7 unter OS X sein. Evtl. mal mit dem vorinstallierten Java 1.6 probieren. Allerdings muss ich dafür deinen Code erstmal neu kompilieren.

  16. #16
    Zitat Zitat von DFYX Beitrag anzeigen
    Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)

    Edit:
    Es könnte ein Kompatibilitätsproblem von LWJGL mit Java 1.7 unter OS X sein. Evtl. mal mit dem vorinstallierten Java 1.6 probieren. Allerdings muss ich dafür deinen Code erstmal neu kompilieren.
    Das kannst du gerne probieren.
    Der Quellcode müsste vollständig sein. Ich hoffe das Neukompilieren wird helfen.

    Edit:
    Eine Frage noch am Rande: Wird die Anzahl der vorhandenen Operationen einen Einfluss auf die Bewertung haben?

    Geändert von Cornix (18.03.2013 um 01:39 Uhr)

  17. #17
    Zitat Zitat von Cornix Beitrag anzeigen
    Eine Frage noch am Rande: Wird die Anzahl der vorhandenen Operationen einen Einfluss auf die Bewertung haben?
    Die Bewertung läuft per Abstimmung durch die Userschaft. Dementsprechend können wir kaum Vorhersagen machen, worauf die Leute Wert legen werden.

  18. #18
    Zuerst hatte ich nicht vor teilzunehmen, aber irgendwie hat mich das Thema dann doch gepackt Sehr schönter Contest! Echt toll, was man mit so einem kleinen Spielzeug für interessante Bilder erzeugen kann. Mein Programm steht im groben, einzig die Farben sind noch nicht integriert. Wenn mir bis zur Abgabe noch lustige Features einfallen, kommen die noch rein.


  19. #19
    Nocheinmal eine Frage:
    Ist die angegebene Syntax aus dem Eröffnungsbeitrag verpflichtend oder dürfen wir die Operationen umbenennen falls wir es für passend empfinden? Wenn wir sie umbenennen dürfen werden parametrisierte Eingaben erlaubt oder nur atomare Operationen?

  20. #20
    Aufgrund der besseren Vergleichbarkeit würde ich doch eher vorschlagen, dass die eingesendeten Programme lediglich nur das besitzen, was vorgeschrieben wurde.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •