ubuntuusers.de

Erstes Python-Programm

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

Nachtstahlgargoyle

Avatar von Nachtstahlgargoyle

Anmeldungsdatum:
18. September 2007

Beiträge: 78

Wohnort: Espasingen

Hallo Ubuntuusers!

Seit gestern Abend habe ich mir überlegt etwas in Python zu schreiben, da mir dies offensichtlich viel einfacher fällt als C++. Zum anfangen ist das imho sehr gut. Ich habe ein keines Spiel für den Terminal geschrieben. Im ersten Level muss man eine Zahl zwischen 1 und 100 erraten. Für jedes Raten werden 10 Punkte abgezogen. Hat man die Zahl erraten bekommt man 50 Punkte dazu. Sehr einfach eigentlich. Ab 1500 oder mehr Punkten kommt man in das 2te Level. Jetzt wird es Interessant: Man muss zwischen 1 und 150 Punkten raten und verliert pro Tipp 15 Punkte. Der Gewinn beträgt 100 punkte. Aber nur wenn die KI (Künstliche Idiotie) nicht schneller ist. Diese rät mit und kann den Gewinn abstauben. Gewinner ist derjenige der zu erst 4500 Punkte hat.

An der KI muss ich noch feilen. Und zwar eine Menge da sie noch recht blöde ist und auch über den Zahlen Bereich (150) hinaus geht... Wer in den Quelltext schaut wird sich schnell verlieren. Ich habe die Variablen sehr undeutlich benannt. Auch wen es recht gut Auskommentiert ist, wird man da sicher nicht viel Durchblick haben. Außerdem wollte ich die "KI" in ein Extra Modul verschieben aber da gab es Probleme mit Lokalen und Globalen Variablen. Ich hab da noch kein Durchblick...

Was haltet ihr davon? Und seid nicht zu hart zu meinen ersten Gehversuchen seit langer langer Zeit...

Grafzahl-vers.0.0.1-Beta.py (5.2 KiB)
Download Grafzahl-vers.0.0.1-Beta.py

gkuhl

Avatar von gkuhl

Anmeldungsdatum:
1. Dezember 2007

Beiträge: 99

Wohnort: Hong Kong

Einige würden sagen gruselig 😉

Ich hab jetzt nur mal schnell rein geschaut und folgende Anmerkungen:

  • Dazu sind die Namen von Funktionen und Variablen total unverständlich. Weißt du ja selbst, sonst würdest du es nicht dahinter schreiben.

  • global ist und bleibt böse!

  • Du definierst Funktionen, die

    • nur eine andere Funktion aufrufen.

    • nur eine Konstante zu einer Zahl addieren. Und hast dann auch noch verschiedene Funktionen für verschiedene Konstanten.

Die Grundstruktur eines Python-Datei sollte die folgende sein:

def main():
    pass

if __name__ == "__main__":
    main()

Grüße
Gerrit


Edit: Den Style Guide PEP8 berücksichtigen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Da ich nicht "zu hart" sein soll, sage ich nicht, was ich davon halte, sondern nur, was man daran kritisieren kann 😉

Im Allgemeinen ist das Programm viel zu komplex! Eine Addition um 50 Punkte rechtfertigt keine eigene Funktion! Wenn dann noch zwei Funktionen mit verschiedenen Namen exakt das Gleiche tun, ist irgendwas falsch gelaufen. Von dem Code widersprechenden Kommentaren und den Funktionsnamen selbst (cashm(), cashm1(), lvlchk1()) ganz zu schweigen ...

Nachtstahlgargoyle

(Themenstarter)
Avatar von Nachtstahlgargoyle

Anmeldungsdatum:
18. September 2007

Beiträge: 78

Wohnort: Espasingen

gkuhl schrieb:

Einige würden sagen gruselig 😉

Ich hab jetzt nur mal schnell rein geschaut und folgende Anmerkungen:

  • Dazu sind die Namen von Funktionen und Variablen total unverständlich. Weißt du ja selbst, sonst würdest du es nicht dahinter schreiben.

  • global ist und bleibt böse!

  • Du definierst Funktionen, die

    • nur eine andere Funktion aufrufen.

    • nur eine Konstante zu einer Zahl addieren. Und hast dann auch noch verschiedene Funktionen für verschiedene Konstanten.

Die Grundstruktur eines Python-Datei sollte die folgende sein:

def main():
    pass

if __name__ == "__main__":
    main()

Grüße
Gerrit


Edit: Den Style Guide PEP8 berücksichtigen.

Gruselig ist es aufjedenfall. Das finde sogar ich. Das mit den Variablen werde ich noch ändern. Aus Schreibfaulheit habe ich sie einfach in das bennant was mir grad im Kopf war. Und ich habe es nur für Leser Auskommentiert. Zumindest die sachen in der Schleife... Warum ist Global böse? Und ich finde die Funktion äusserst praktisch ☺ Wie man sieht... Aber du hast recht. Ich könnte einige Funktionen rausnehmen... Das mit deiner Grundfunktion kapiert ich nicht einen byte weit... soll beim main das Programm sein? Und der 2te teil checkt dann nur ob das Programm selbstständig läuft oder wie? Vielen Dank für deine Tipps! NSG

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

global führt dazu, dass das Verhalten einer Funktion nicht nur von übergebenen Argumenten und lokalen Namen abhängt, sondern auch von globalen Namen. Somit ist eine Funktion kein isolierter Programmteil mehr, sondern mit dem Gesamtprogramm und dessen Zustand untrennbar verwoben. Für den Leser erschwert dies das Nachvollziehen des Kontrollflusses, da er beim Lesen einer Funktion immer auch den globalen Zustand berücksichtigen muss. Desweiteren erschwert es die Wartung, da Änderungen einer Funktion unvorhersehbare Änderungen auf das Gesamtsystem haben können. Außerdem macht es das automatisierte Testen schwierig, da ein Test immer auch den globalen Zustand berücksichtigen und eventuell zurücksetzen muss.

Bei einem so einfachen Programm wie diesem Spiel fällt das vielleicht noch nicht auf, bei großen Systemen aber sind globale Objekte in höchstem Maße problematisch.

Der von gkuhl gezeigte Code führt dazu, dass das Programm zwischen der Ausführung als Skript und dem Import unterscheidet. Somit kann man das Programm auch als Modul importieren und somit wiederverwenden und insbesondere auch automatisiert testen.

Nachtstahlgargoyle

(Themenstarter)
Avatar von Nachtstahlgargoyle

Anmeldungsdatum:
18. September 2007

Beiträge: 78

Wohnort: Espasingen

Vielen Dank für deine Antworten.

Mir ist da so einiges klar geworden!

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Das ganze Programm schreit IMHO nach einer Klasse.

Lunar schrieb:

Von dem Code widersprechenden Kommentaren und den Funktionsnamen selbst (cashm(), cashm1(), lvlchk1()) ganz zu schweigen ...

Ist doch toll: Da versucht jemand, der von C++ kommt, Funktionsnamen aus der Stdlib von C zu immitieren. ☺

Bauer

Anmeldungsdatum:
28. Juni 2006

Beiträge: 333

Versuch doch mal, das Programm in < 30 Zeilen neu zu schreiben. Leerzeilen und Kommentare nicht mitgezählt. Dabei nimm aber gleich lesbare Funktionsnamen. Also check_level oder level_check statt lvlchk. Falls du das nicht schaffst, mach erstmal nur den ersten Level und wenn du uns deinen Quelltext zeigen willst, dann lad ihn hier hoch.

Nachtstahlgargoyle

(Themenstarter)
Avatar von Nachtstahlgargoyle

Anmeldungsdatum:
18. September 2007

Beiträge: 78

Wohnort: Espasingen

Bauer schrieb:

Versuch doch mal, das Programm in < 30 Zeilen neu zu schreiben. Leerzeilen und Kommentare nicht mitgezählt. Dabei nimm aber gleich lesbare Funktionsnamen. Also check_level oder level_check statt lvlchk. Falls du das nicht schaffst, mach erstmal nur den ersten Level und wenn du uns deinen Quelltext zeigen willst, dann lad ihn hier hoch.

30 oder weniger Zeilen? Ist das denn Möglich? Ich habe nicht den Hauch einer Ahnung wie das gehen soll! Alleine schon die "print" 's wären um die 20... Jedenfalls hab ich das erste Level auf 29 Zeilen reduziert und ausser der KI alle Funktionen entfernt. Allerdings hab eich immer noch 3 Globale variablen, da ich nicht wieß wie ich dieses Problem lösen soll. Dann ist mir nachwievor unklar was oder wie genau ich den Code von gkuhl benutzen soll.

Und was mit snafu1 schrieb:

Das ganze Programm schreit IMHO nach einer Klasse.

gemeint ist kann ich mir auch nicht ganz erklären. Ich werde diese woche, sofern es mir die Arbeit erlaubt, noch ein wenig mehr in Tutorials stöbern um vielleicht eine Möglichkeit zu finden wie das mit der "30 Zeilen-Grenze" schaffen soll. Ich kann mir das nicht vorstellen wie das gehen soll.

Und vielen Dank für Antworten.

P.s.: Das mit dem hochladen geht nicht Richtig.

Grafzahl-vers.0.0.2-Beta.py (4.7 KiB)
Download Grafzahl-vers.0.0.2-Beta.py

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@Nachtstahlgargoyle: Der Code von gkuhl soll so eingesetzt werden, dass auf Modulebene kein Quelltext ausser Konstanten-, Funktions-, und Klassendefinitionen und eben diesem Quelltextschnippsel am Ende mehr steht und in der main()-Funktion der Quelltext steht, der das Programm steuert. Halt die Hauptfunktion.

Und das ganze bitte ohne global. Wenn Du nicht weisst was Klassen sind, dann musst Du das entweder lernen, oder das Programm mit Funktionen ausdrücken. Da bekommt man global weg, in dem man Argumente und Rückgabewerte verwendet.

Auf 30 Zeilen insgesamt bekommt man es wohl nicht, aber diese ganzen Wiederholungen von Quelltextstrukturen kann mit Funktionen beseitigen.

Bauer

Anmeldungsdatum:
28. Juni 2006

Beiträge: 333

Die 30 Zeilen sind auch mehr eine grobe Richtungsvorgabe als eine harte Grenze.

P.s.: Das mit dem hochladen geht nicht Richtig.

Wodran bist du gescheitert? Einfach unten in der Auswahlliste Python wählen, Text ins Textfenster kopieren und auf Paste! drücken.

http://paste.pocoo.org/show/128893/

Antworten |