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
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
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)
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
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)
Anmeldungsdatum: 18. September 2007
Beiträge: 78
Wohnort: Espasingen
|
Vielen Dank für deine Antworten. Mir ist da so einiges klar geworden!
|
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)
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
Ehemalige
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/
|