Programm bewerten (snake)



  • weini37 schrieb:

    Mechanics schrieb:

    Kurfassung: da kann man noch sehr viel verbessern 😉 Du solltest mehr auf solche Sachen wie Schichtentrennung und Kapselung achten.

    Wie meinste Sichtentrennung und Kapselung, hab noch nie was von gehört?

    Schichtentrennung, nicht Sichtentrennung 😉 Macht nichts. Das wirst du später noch lernen, wenn du tiefer in die Softwareentwicklung einsteigen willst, wollte dich schon mal darauf hinweisen. Du hast da verschiedene Schichten. Die eine ist die Spiellogik, die andere die UI (user interface). Die sollte man strikt trennen. Ist bei der Riesenmenge an Code jetzt zwar nicht so kritisch, aber generell sollte die Spiellogik völlig unabhängig von irgendwelchen Ein- und Ausgaben sein. Dann kannst du später eine andere GUI über dein Spiel drübersetzen, z.B. eine Windowsfenster-GUI oder OpenGl oder Web-GUI oder Client-Server was auch immer. Dadurch wird dein Code wiederverwendbar.
    Und die Spiellogik sollte man besser kapseln. z.B. keinen direkten Zugriff auf das Array zulassen, sondern Funktionen wie int move_snake(GameField * field, Movemenent * movement) oder so anbieten, und die Funktion prüft z.B. intern, ob die Bewegung gültig ist und gibt den entsprechenden Fehlercode zurück.



  • #define ZEILEN 100
    #define SPALTEN 50
    //Matrixgroesse muss 2 * so gross sein, wie das groesste define  /* um sowas abzusichern, nutzt man assert und lässt damit den Compiler überwachen */
    #define MATRIXGROESSE 200
    
    #ifndef SNAKE_FUNKTIONEN_H_ /* sowas gehört immer ganz an den Beginn der h-Datei */
    #define SNAKE_FUNKTIONEN_H_
    
    void countdown(); /* "Joker"-Prototyp und damit sinnfrei */
    

    Du nutzt sowohl return 1; als auch return EXIT_SUCCESS; das widerspricht sich.

    Du nutzt unnötig C99 und da du wohl mit MS-VisualStudio arbeitest, compilierst du als C++, dein Code ist aber zweifelsfrei C.

    ...



  • Wutz schrieb:

    void countdown(); /* "Joker"-Prototyp und damit sinnfrei */
    

    |

    Joker-Prototyp?

    Wutz schrieb:

    Du nutzt sowohl return 1; als auch return EXIT_SUCCESS; das widerspricht sich.

    Kann man ausbessern 😉

    Wutz schrieb:

    Du nutzt unnötig C99

    Wo?
    ps. ich kenn den unterschied zw. den beiden nicht

    Wutz schrieb:

    und da du wohl mit MS-VisualStudio arbeitest, compilierst du als C++, dein Code ist aber zweifelsfrei C.

    Ne ich arbeite mit Eclipse und hab ausgewählt C-Projekt. (Compiler: Mingw)



  • Mechanics schrieb:

    weini37 schrieb:

    Mechanics schrieb:

    Kurfassung: da kann man noch sehr viel verbessern 😉 Du solltest mehr auf solche Sachen wie Schichtentrennung und Kapselung achten.

    Wie meinste Sichtentrennung und Kapselung, hab noch nie was von gehört?

    Schichtentrennung, nicht Sichtentrennung 😉 Macht nichts. Das wirst du später noch lernen, wenn du tiefer in die Softwareentwicklung einsteigen willst, wollte dich schon mal darauf hinweisen. Du hast da verschiedene Schichten. Die eine ist die Spiellogik, die andere die UI (user interface). Die sollte man strikt trennen. Ist bei der Riesenmenge an Code jetzt zwar nicht so kritisch, aber generell sollte die Spiellogik völlig unabhängig von irgendwelchen Ein- und Ausgaben sein. Dann kannst du später eine andere GUI über dein Spiel drübersetzen, z.B. eine Windowsfenster-GUI oder OpenGl oder Web-GUI oder Client-Server was auch immer. Dadurch wird dein Code wiederverwendbar.
    Und die Spiellogik sollte man besser kapseln. z.B. keinen direkten Zugriff auf das Array zulassen, sondern Funktionen wie int move_snake(GameField * field, Movemenent * movement) oder so anbieten, und die Funktion prüft z.B. intern, ob die Bewegung gültig ist und gibt den entsprechenden Fehlercode zurück.

    Unser Professor hat gesagt, das er im nächsten jahr mehr Spieleprogrammieren, als "trockene sachen" (so was wie vertausche 2 strings... oder zeichen aus string entfernen) mit uns macht



  • Du könntest das ganze modularer gestalten.
    Modul ist dabei jeweils eine zusammengehörende .c und .h Datei.

    Ein Modul ist für die Schlange verantwortlich, eines für das Fressen, und eines für die Spiellogik.
    In main verwendest du dann einfach die Funktionen aus den Modulen die du in den .h Dateien deklariert hast, und machst die Ein und Ausgaben.

    Aufbau zum Beispiel folgendermaßen:

    main
      |
    Controller
     |      |
    Snake  Food
    

    main interagiert nur noch mit dem Controller, und dieser wiederum verwaltet jeweils eine Schlange sowie das Fressen. Die Schnittstelle zu main ist ja hauptsächlich auf die Ein / Ausgabe beschränkt.

    Das Modul Schlange könnte zum Beispiel (ausschnittsweise) so aussehen:
    (Code ist nicht getestet und enthält sicher 1000 Fehler, aber es sollte dir eine Idee geben wie man das ganze aufbauen kann)

    enum direction_enum {LEFT;RIGHT;UP;DOWN;};
    typedef direction_enum direction_t; //kann man evtl. zusammenfassen
    
    typedef struct {int x; int y;} position_t;
    
    typedef struct snake_t
    {
     position_t *segments;
     unsigned int length;
     direction_t direction;
    };
    
    snake_t* createSnake(...);
    ...neue Struktur Snake am Heap erzeugen und evtl. mit Startwerten belegen
    
    snake_t destroySnake(snake_t* snake);
    ...vom heap löschen
    
    void move_on(snake_t* snake);
    ...schlange um eins weiterwandern lassen mit bisheriger richtung
    
    void change_direction(snake_t* snake, direction_t newDirection);
    ...richtung ändern
    

    Wie schon gesagt, der Code ist ungetestet und unvollständig, sollte dir aber eine Idee davon geben, wie sich das lösen lässt. Zusammengehörende Daten kommen in gemeinsame Strukturen, und mittels Funktionen wird darauf zugegriffen. So gibt es keine heiklen Programmstellen in main, weil dort nur noch die Funktionen der einzelnen Module aufgerufen werden. Es erfolgt in main garantiert kein direkter Aufruf von malloc oder free mehr.

    Und wie bereits erwähnt macht das die Spiellogik unabhängig von der darüberliegenden GUI. Ob du dein C Programm nun auf einem PC oder Mikrocontroller oder was weiß denn ich wo ausführst ist egal, solange du dann jeweils die oberste GUI Schicht anpasst.



  • weini37 schrieb:

    Unser Professor hat gesagt, das er im nächsten jahr mehr Spieleprogrammieren, als "trockene sachen" (so was wie vertausche 2 strings... oder zeichen aus string entfernen) mit uns macht

    Was machst du eigentlich? Das ist doch hoffentlich kein Informatikstudium? Hört sich ehrlich gesagt alles wenig sinnvoll an, hat für mich wenig mit professioneller Softwareentwicklung zu tun. Wenn das nur ein Nebenfach ist oder so, ok.



  • (Ich bin österreicher, darum weiss ich nicht, ob man das in auch verwendet) Also ich gehe in eine HTL mit dem Zweig Informationstechnologie.
    (Schulstufe 9+)
    Und die "trockenen übungen" machen wir nur, weil wir 25 Nicht Genügend / 36 haben, also es kennt sich keiner in Programmieren aus (Ausser wenige, wie z.b. ich) Ich muss auch sagen, die meisten von denen Programmieren daheim garnicht (und dann regen sie sich auf, warum sie so schlecht sind). Hier mal die Übungsaufgaben, die zum letzten Test gekommen sind (sind nicht alle):

    // 1. Anzahl der Zeichen von text bestimmen:
    // 2. Anzahl der Zeichen der Zeile 4 von textmatrix bestimmen:
    // 3. text mit den ASCII-Codes von 0 bis 255 befüllen:
    // 4. Zeile 2 von textmatrix mit den ASCII-Codes von 0 bis 255 befüllen:
    // 5. ushortfeld mit den Zahlen von 1255 bis 1000 (absteigend) befüllen:
    // 6. Summe aller Werte von dblfeld bestimmen:
    // 7. Summe aller Werte der Zeile 3 von dblmatrix bestimmen:
    // 9. intfeld komplett einlesen (ohne printf, fflush):
    // 11. text zeichenweise einlesen (Ende bei Enter-Taste):
    // 12. Alle Zeilen von textmatrix zeichenweise einlesen (Zeilenende bei Enter-Taste):
    // 16. Beliebieg viele Worte in Zeile 9 von textmatrix einlesen (ohne Schleife
    //21. Zeilensumme und Spaltensumme von ushortmatrix in jew. erste Zeile
    // bzw. erste Spalte von intmatrix berechnen:

    Ps. wir programmieren schon ca. ein Schuljahr / 3 Wochenstunden



  • failpost



  • war selber auf einer HTL.
    Wenn ich dir einen Tipp geben darf: beschäftige dich selbst damit!

    In der HTL interessieren sich geschätzte 75% der Leute absolut nicht für Programmieren, wollen ihre Matura endlich haben und fertig. Von den restlichen 25% sind vielleicht die Hälfte halbwegs in der Lage, einfache Programme zu schreiben.

    Der Schwierigkeitsgrad ist also sehr moderat. Wir haben Arrays sortiert oder ähnliches, doch da sind die meisten eh schon ausgestiegen. Bei den meisten waren Arrays an sich schon ein spanisches Dorf. Und die ganz intelligenten kamen dann mit Meldungen wie "C ist doch total veraltet, ist doch wieder mal total weltfremd was wir hier in der Schule lernen, interessiert mich daher nicht".

    Aber wenn es einen interessiert, ist das HTL Fach ein guter Einstieg in die Programmierung. Mehr aber auch nicht!
    Dinge wie verkettete Listen, Details zum Thema Zeiger oder ähnliche Dinge lernten wir überhaupt nicht. Darf man den Lehrern aber auch nicht übel nehmen, weil siehe oben!

    Mich hat das Thema damals schon interessiert, ich hab C daheim weiter gelernt, habe Programme in C für den TI 200 ("Voyage") programmiert, habe C Programme für Windows geschrieben, usw... Hat mir Spaß gemacht und habe dadurch auch einiges gelernt.
    Damit hatte ich es dann in der Uni sehr leicht in Programmieren 1. Dort hat es die ganzen Pappnasen nämlich aufgestellt, die in der HTL meinten, C sei ein weltfremder Scheiß. Jaja, man trifft sich immer zweimal...das gilt wohl auch für ungeliebte Programmiersprachen!
    Während der Uni hatte ich einen Nebenjob in dem ich ein Gerät in C programmieren musste. Spätestens hier hat sich mein Hobby von damals bezahlt gemacht ... im Gegensatz zu den ganzen Dummjobs a la Widerstäde sortieren konnte ich dort nämlich einige Euro mit nach Hause nehmen 😃



  • fsdfsdfs schrieb:

    war selber auf einer HTL.
    Wenn ich dir einen Tipp geben darf: beschäftige dich selbst damit!

    Freud mich zu hören, das du auch auf einer HTL warst 😉
    Ich beschäftige mich jeden Tag damit 😉

    fsdfsdfs schrieb:

    In der HTL interessieren sich geschätzte 75% der Leute absolut nicht für Programmieren, wollen ihre Matura endlich haben und fertig. Von den restlichen 25% sind vielleicht die Hälfte halbwegs in der Lage, einfache Programme zu schreiben.

    Schaut bei uns genau so aus

    fsdfsdfs schrieb:

    Der Schwierigkeitsgrad ist also sehr moderat. Wir haben Arrays sortiert oder ähnliches, doch da sind die meisten eh schon ausgestiegen. Bei den meisten waren Arrays an sich schon ein spanisches Dorf. Und die ganz intelligenten kamen dann mit Meldungen wie "C ist doch total veraltet, ist doch wieder mal total weltfremd was wir hier in der Schule lernen, interessiert mich daher nicht".

    genauso machen sie es auch bei uns

    fsdfsdfs schrieb:

    Aber wenn es einen interessiert, ist das HTL Fach ein guter Einstieg in die Programmierung. Mehr aber auch nicht!
    Dinge wie verkettete Listen, Details zum Thema Zeiger oder ähnliche Dinge lernten wir überhaupt nicht. Darf man den Lehrern aber auch nicht übel nehmen, weil siehe oben!

    Mal sehen ob wir es lernen (glaube aber nicht)

    fsdfsdfs schrieb:

    Mich hat das Thema damals schon interessiert, ich hab C daheim weiter gelernt, habe Programme in C für den TI 200 ("Voyage") programmiert, habe C Programme für Windows geschrieben, usw... Hat mir Spaß gemacht und habe dadurch auch einiges gelernt.

    Mich hat programmieren schon immer interessiert, wollte mit Java anfangen, hat sich aber herrausgestellt, das es (noch) zu scwhierig gewesen ist, somit habe ich es gelassen. Aber habe jtzt sehr viel Spass mit C



  • weini37 schrieb:

    Wutz schrieb:

    void countdown(); /* "Joker"-Prototyp und damit sinnfrei */
    

    |

    Joker-Prototyp?

    Die leere Parameterliste beim Prototyp verhindert eine mögliche Warnung des Compilers bei falschem Gebrauch der Funktion, da sie bedeutet:
    "eine unbekannte aber feste Zahl von Parametern"
    Außerdem würde hier jeweils auch noch die default-argument-promotion greifen, d.h. der Compiler trifft, da ihm die konkreten Typangaben aus dem Prototyp fehlen, beim Aufruf der Funktion bestimmte Annahmen und macht bestimmte Umwandlungen, die u.U. nicht gewollte und zur Laufzeit schlecht analysierbare Fehler hervorrufen.

    weini37 schrieb:

    Wutz schrieb:

    Du nutzt unnötig C99

    Wo?

    Du definierst Variablen mitten im Codeblock und nicht am Anfang.
    Das wird dir z.B. ein MS-VisualC Compiler nicht übersetzen.

    weini37 schrieb:

    Wutz schrieb:

    und da du wohl mit MS-VisualStudio arbeitest, compilierst du als C++, dein Code ist aber zweifelsfrei C.

    Ne ich arbeite mit Eclipse und hab ausgewählt C-Projekt. (Compiler: Mingw)

    In deinem Quellcode steht irgendwo was von VisualC++6, das und das o.g. C99 Feature haben mich auf C++ schließen lassen.
    Mingw benutzt den Win-Port von gcc, und der arbeitet defaultmäßig im GNU99 Modus, d.h. C99+GCC-Features und nur deshalb compilierte das Programm.
    Stelle die Compileroptionen mal auf "-Wall -ansi -pedantic", dann gibt der Compiler dir schon mal viele Infos über nicht strikt-konforme Codeteile.
    C-Programmierung unter Windows mit Eclipse halte ich gerade auch für Anfänger und Eclipse-Ungeübte für suboptimal, es gibt bessere IDE, z.B. VisualC++ 2010 Express.


Anmelden zum Antworten