gm-d.de Technikcontest Sommer '09

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • gm-d.de Technikcontest Sommer '09

      gm-d.de Technikcontest Sommer '09

      Und es ist endlich soweit, ein neuer Contest ist da!
      Diesmal handelt es sich um einen Technikcontest, angelehnt an den kleineren, den ich vor einiger Zeit organisiert habe und von dem sich viele eine Fortsetzung gewünscht haben.
      Wie auch schon bei dem ersten Technikcontest geht es hier nicht nur darum, sein Können unter Beweis zu stellen, sondern auch seine Grenzen kennenzulernen und neue Erfahrungen zu sammeln.

      Im Gegensatz zum letzten Mal ist für alle etwas dabei: GML-Einsteiger, -Fortgeschrittene und auch Experten werden hier (hoffentlich) irgendwie gefordert werden. Ferner gibt es mehrere Aufgaben, die auch alle Punkte geben. Abhängig von den erreichten Punkten gibt es am Ende des Wettbewerbs auch entsprechende Benutzertitel bzw. -ränge. Betrachtet dies also auch als Chance, eure "Selbsteinschätzung" zu untermauern. Keine Sorge: Wer nur Aufgabe 1 schafft und etwas von Aufgabe 2, wird vermutlich schon einen Titel bekommen.
      Unabhängig davon werden wir dennoch Sieger kühren. Wieviele das sein werden, machen wir von der Teilnehmeranzahl abhängig.

      Verständnisfragen zu den Wettbewerbsregeln können hier im Thread gestellt werden, Fragen bezüglich der Aufgabenstellungen aber bitte per PN an mich. Auch bitte keine Diskussionen über Lösungsansätze hier im Thread oder in den Technikforen für die Dauer des Wettbewerbs.

      Infos zur Abgabe befinden sich unter der Aufgabenstellung.

      Aufgabenstellung
      Spoiler anzeigen
      1. (GML-Einsteiger) Schreibe zu den folgenden Funktionen Ersatzfunktionen in GML.
        Funktionsaufrufe innerhalb der Funktionen dürfen dabei nicht benutzt werden (auch von keinen eigenen Funktionen). Build-In Variablen sind ebenfalls nicht erlaubt (hspeed, speed, ...). Es ist nicht notwendig, die Parameter auf ihren Typ hin zu überprüfen.
        1. abs(x)
        2. sign(x)
        3. min(x,y) (2 Parameter reichen)
        4. max(x,y) (2 Parameter reichen)

      2. (GML-Fortgeschritter) Schreibe folgende Funktionen in GML. Es gelten alle Regeln aus Aufgabe 1. Die selbstgeschriebenen Funktionen aus Aufgabe 1 dürfen nicht aufgerufen werden. Die angewendeten Prinzipien sollten aber im Hinterkopf behalten werden.
        Zusätzlich darf draw_point (bzw. draw_pixel) verwendet werden.
        1. draw_hline(x1,y1,x2,y2) zeichnet eine gerade, horizonte Linie von (x1,y1) nach (x2,y2). Es soll zuerst überprüft werden, ob die zu zeichnende Linie tatsächlich parallel zur x-Achse ist.
        2. draw_stairs(x1,y1,x2,y2) zeichnet eine Linie im 45° Winkel von (x1,y1) nach (x2,y2). Auch hier soll eine entsprechende Überprüfung der Parameter stattfinden.
        3. draw_stairs_flat(x1,y1,x2,y2) ähnlich wie b), nur darf der Winkel der Treppe nun auch weniger als 45° betragen. Wieder soll zuerst überprüft werden, ob die zu zeichnende "Treppe" wirklich flach ist (Tipp: Keine Kommazahlen benutzen!). Es reicht, wenn nur einer der 4 Fälle abgedeckt ist (0-45°, 135°-180°, 180°- 225° bzw. 315°-0°, d.h. nach rechts oben, links oben, links unten, rechts unten).

      3. (GML-Fortgeschritter bis -Experte) Schreibe eine Ersatzfunktion für draw_line. Es gelten die gleichen Regeln wie in Aufgabe 2. Es ist nicht notwending, dass die Funktion deckungsgleiche Linien mit draw_line zeichnet.
        1. Schreibe die Funktion mit geeigneten Fallunterscheidungen (Tipp: Aufgabe 2 gibt hierfür einen guten Leitfaden).
        2. Optimiere deine Funktion bezüglich ihrer Performance. Hierfür ist die Benutzung von den GM-Funktionen aus dem Kapitel "Computing Things" erlaubt. Stelle sicher, dass keine Variablen nach dem Aufrufen der Funktion in der entsprechenden Instanz gespeichert bleiben (Tipp: Debugmodus -> View Local Variables). Nimm als Maßstab die erreichte Fps bei einem Roomspeed von ~9999. Notiere zusätzlich deine Beobachtungen. Beachte dabei allerdings, dass diese eine Schwäche des GMs aufzeigen sollten und keine Allgemeingültigkeit besitzen!

      4. (GML-Fortgeschritter bis -Experte) Schreibe deine draw_line-Funktion (lieber die aus 3a, sonst gibts evtl- böse Überraschungen!) so um, dass sie die Instanz bewegt, von der aus sie aufgerufen wird (diese sollte eine rechteckige Maske haben). Als Parameter wird eine x- und y-Verschiebung übergeben. Das Script soll die "Linie" dieser Bewegung (von x, y nach x+.., y+...)ablaufen und die Instanz entsprechend verschieben. Sollte ein Wandobjekt im Weg sein, soll die Instanz auf der letzten freien Stelle stehenbleiben. Zusätzlich zu den in Aufgabe 3 beschriebenen Funktionen ist die Benutzung der Funktion place_free erlaubt.
        1. Schreibe die oben beschriebene Funktion mit dem Namen move_along(hspd,vspd) und entwerfe eine einfache Testumgebung, um ihre Funktionalität zu überprüfen. Hierfür reicht ein einfacher Raum mit solid Wandobjekten und einer Spielerfigur (Tipp: Du kannst als Parameter einfach hspeed und vspeed übergeben, solange du sie nach dem Aufrufen der Funktion auf 0 setzt).
        2. Erweitere die Funktion so, dass sie einen Spielraum von 1 Pixel erlaubt. Sollte sich die Spielfigur also z.B. auf einer Geraden befinden (Seitenansicht), auf der sich eine 1-Pixel-hohe und - breite Erhebung befindet, soll sie diesen ohne Geschwindigkeitsverlust umgehen bzw. "hochklettern". Es ist dabei zu erwarten, dass die Figur nach dem Überqueren dieser Erhebung sich nicht wieder um den einen Pixel nach unten bewegt, den sie vorher nach oben ausgewichen ist.
        3. Erweitere deine Testumgebung um Schrägen und beobachte, wie sich deine Spielfigur nun verhält.
        4. Beschreibe in Worten je eine Situation in einem Spiel, in der das Verhalten aus dem letzten Satz aus Aufgabenteil b (nicht) wünschenswert ist.
        5. Überlege, wie man die Problematik deiner nicht wünschenswerten Situation aus Aufgabenteil d umgehen könnte.

      5. (Bonusaufgabe) Erweitere deine draw_line-Funktion so, dass sie draw_line_color entspricht.

      Anmerkung: Die Aufgaben sollten nicht außerhalb ihrer Reihenfolge bearbeitet werden. Für eine volle Punktzahl müssen alle Aufgaben gelöst werden. Aufgabe 5 steht außerhalb der Wertung für die Rangvergabe nach Punkten, wird aber für die Bestimmung des Siegers / der Sieger mitangerechnet.

      Abgabe / Richtlinien:
      Arbeiten im Team ist nicht erlaubt. Der Wettbewerb verfolgt zugleich ein Lernziel, das durch Teamarbeit allerdings stark gefährdet wird. Tut euch daher selbst einen Gefallen und kommt auch nicht darauf, abzuschreiben. Mitglieder des Teams sind vom Wettbewerb nicht ausgeschlossen, liegen aber außerhalb der Wertung.
      Benutzt bitte bei selbstgeschriebenen Funktionen ein Präfix, das aus eurem Nickname besteht (Beispiel: mewx_draw_line, mewx_abs).
      Schickt dann eine *.gm6 oder *.gmk mit den entsprechenden Skripten bzw. der Testumgebung (sofern vorhanden) an uawg@gm-d.de (da die Weiterleitung anscheinend ewig braucht, vermerkt am besten noch im Thread oder per PN, dass ihr eine Email geschickt habt. Nicht, dass nachher etwas verloren geht). Als Namen für die Datei bitte ebenfalls den Nickname verwenden.

      Schriftliche Aufgaben, die kein auszuführender Code sind, einfach in eine eigene Scriptdatei schreiben und mit /* und */ auskommentieren. Bitte nicht die Game Info benutzen!

      Einsendeschluss ist Sonntag, 9. August, 2009 um 20:00 Uhr.

      Viel Erfolg und viel Spaß, ran ans Coden!


      Ergänzung:
      Ein Testscript für Aufgabe 1. Einfach ins eigene Projekt kopieren und ausführen (funktioniert derzeit leider nur für registrierte Benutzer, sorry). Und: Ein "OK" bedeutet nur sehr wahrscheinlich, dass euer Script korrekt ist. Ein Fehler kann trotzdem drin sein.
      Spoiler anzeigen

      GML-Quellcode

      1. // context_check()
      2. // written by MewX
      3. // init variables
      4. var map,i,prefix,str,src,res;
      5. // create script map
      6. map = ds_map_create();
      7. for (i=0;i<100;i+=1) {
      8. if (!script_exists(i))
      9. continue;
      10. ds_map_add(map,string_lower(script_get_name(i)),i);
      11. }
      12. // get prefix
      13. prefix = "";
      14. while (prefix = "")
      15. prefix = get_string("Bitte gib deinen Nickname bzw. das Präfix deiner Skripte ein:","mewx")+"_";
      16. // test abs()
      17. res = true;
      18. str = "Aufgabe 1#a) abs(x): ";
      19. src = ds_map_find_value(map,prefix+"abs");
      20. if (!script_exists(src))
      21. str += "nicht gefunden";
      22. else {
      23. for (i=-25;i<25;i+=0.5)
      24. res &= (abs(i) == script_execute(src,i));
      25. if (res)
      26. str += "OK";
      27. else
      28. str += "FEHLER";
      29. }
      30. // test sign()
      31. res = true;
      32. str += "#b) sign(x): ";
      33. src = ds_map_find_value(map,prefix+"sign");
      34. if (!script_exists(src))
      35. str += "nicht gefunden";
      36. else {
      37. for (i=-25;i<25;i+=0.5)
      38. res &= (sign(i) == script_execute(src,i));
      39. if (res)
      40. str += "OK";
      41. else
      42. str += "FEHLER";
      43. }
      44. // test min()
      45. res = true;
      46. str += "#c) min(x,y): ";
      47. src = ds_map_find_value(map,prefix+"min");
      48. if (!script_exists(src))
      49. str += "nicht gefunden";
      50. else {
      51. res &= (script_execute(src,0,0) == 0);
      52. res &= (script_execute(src,32,2) == 2);
      53. res &= (script_execute(src,7,32) == 7);
      54. res &= (script_execute(src,-32,-2) == -32);
      55. res &= (script_execute(src,32,-2) == -2);
      56. res &= (script_execute(src,0,-2) == -2);
      57. res &= (script_execute(src,2,0) == 0);
      58. res &= (script_execute(src,23.4,79.7) == 23.4);
      59. if (res)
      60. str += "OK";
      61. else
      62. str += "FEHLER";
      63. }
      64. // test max()
      65. res = true;
      66. str += "#d) max(x,y): ";
      67. src = ds_map_find_value(map,prefix+"max");
      68. if (!script_exists(src))
      69. str += "nicht gefunden";
      70. else {
      71. res &= (script_execute(src,0,0) == 0);
      72. res &= (script_execute(src,32,2) == 32);
      73. res &= (script_execute(src,7,32) == 32);
      74. res &= (script_execute(src,-32,-2) == -2);
      75. res &= (script_execute(src,32,-2) == 32);
      76. res &= (script_execute(src,0,-2) == 0);
      77. res &= (script_execute(src,2,0) == 2);
      78. res &= (script_execute(src,23.4,79.7) == 79.7);
      79. if (res)
      80. str += "OK";
      81. else
      82. str += "FEHLER";
      83. }
      84. // clean up
      85. ds_map_destroy(map);
      86. // show result
      87. show_message(str);
      Alles anzeigen
    • Ergänzung!

      Da es schon bei einigen für Verwirrung sorgte:
      Die Aufgaben sollen der Reihe nach gelöst werden. Wer bestimmte Aufgaben nicht schafft, braucht diese natürlich nicht zu machen, aber für die höchstmögliche Punktzahl müssen alle Aufgaben gelöst werden, auch die trivialen (Aufgabe 1 und 2 lassen sich von guten Codern binnen 10 Minuten oder weniger lösen).

      Edit:
      Wer nur einen Teil schafft, kann auch schon einen Rang bekommen. Die Untergrenze legen wir erst beim Bewerten fest, sollte aber ungefähr Aufgabe 1 + etwas von Aufgabe 2 umfassen.

      Edit2:
      Die Weiterleitung der Emails braucht etwas zu lange. Bedenkt das bitte bei der Abgabe.

      Edit3:
      Ich habe für die Anfänger ein Testscript für Aufgabe 1 hinzugefügt, es befindet sich am Ende des ersten Posts (derzeit nur für registrierte GM Benutzer, sorry).
    • Schreibe die Funktion mit geeigneten Fallunterscheidungen

      Was soll das heißen? Was gibt es denn da für Fälle?


      Mann darf aber doch alle Operatoren und Statements benutzen oder?
      Und ab 3.b auch round, floor, ceil, sin... ?


      3. Besteht aus 3 Teilaufgaben?
      ( Also schreibe draw_line neu, schreibe geeignete fallunterscheidungen (was auch immer das heißen mag) und optimiere deine draw_line - funktion)

      Würde es dann reichen, wenn man nur eine optimierte schreibt?
    • maxda schrieb:


      Was soll das heißen? Was gibt es denn da für Fälle?

      Aufgabe 2 bringt da einen Leitfaden.

      maxda schrieb:

      Mann darf aber doch alle Operatoren und Statements benutzen oder?
      Und ab 3.b auch round, floor, ceil, sin... ?

      Darf man, aber keine der genannten Funktionen ist sinnvoll.

      maxda schrieb:

      3. Besteht aus 3 Teilaufgaben?
      ( Also schreibe draw_line neu, schreibe geeignete fallunterscheidungen (was auch immer das heißen mag) und optimiere deine draw_line - funktion)

      Nein, 2 Teilaufgaben. draw_line neu soll mithilfe geeigneter Fallunterscheidungen geschrieben werden.

      maxda schrieb:

      Würde es dann reichen, wenn man nur eine optimierte schreibt?

      Das würde wohl 0 Punkte geben. Wenn ich die Zeichen außerdem richtig deute und und du mit dem Sinus arbeiten willst, dann kann ich dir direkt sagen: Das ist nicht optimal.
    • Das würde wohl 0 Punkte geben. Wenn ich die Zeichen außerdem richtig deute und und du mit dem Sinus arbeiten willst, dann kann ich dir direkt sagen: Das ist nicht optimal.
      Ja, das weiß ich wohl ^^ es war eine generelle Frage! Also braucht man für die 3 2 Scripts? Einmal das mit den Fallunterscheidungen (auch wenn ich nicht erkennen kann, was daran sinnvoll wäre (ich glaube, ich benutze eine andere Methode :S (nicht mit sinus :pinch: ))) und einmal die optimierte Version. Wäre es nicht genügend nur eine (optimierte) Version abzugeben?
    • Kurze Frage zu draw_stairs_flat(x1,y1,x2,y2):
      Soll das so ausehen:

      ?
      Wenn ja,soll das gefüllt sein?
      (Gilt auch für draw_stairs_flat) Eine Linie, kein Dreieck.
      Schade ^^
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von henrik1235 ()

    • Soll die optimierte Version von draw_line ähnlich der der suboptimalen sein, oder kann man theoretisch nochmals eine ganz neue draw_line-Funktion schreiben, die jedoch schneller als die vorige ist? Bzw bekommt man dann die Punkte für die Aufgabe?!^^
      edit: Je öfter ich die Aufgabenstellung lese, desto schwachsinniger finde ich meine Frage. Werds einfach so machen wie ich eigentlich vermute - ähnlicher Aufbau.
      Aber eine andere Frage: Müssen dort auch wieder die Fallunterschiede rein?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Superdaniel ()