Dartprogramm, grundsätzlicher Aufbau

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Code Codain
User
Beiträge: 28
Registriert: Samstag 8. Dezember 2018, 16:12

Hi Leute,

ich probiere zur Zeit eine Programmiersprache zu lernen und habe mir Python ausgesucht. Anhand des Buches "Der leichte Weg zum Python-Experten" konnte ich mir schon ein grundlegendes Bild machen. In dem Buch werden anhand eines Gebrauchtwarenhändlers die verschiedenen Befehle und Grundlagen wie Klassen, Objekte etc erläutert. Im Buch ist es auch super schlüssig und macht alles Sinn, da es ja im Grunde nur eine Datenbank mit Autos ist.

Als kleine Herausforderung will ich nun ein Dartprogramm schreiben, es soll also z.b. von 301 runtergespielt werden, jeder Spieler hat 3 Würfe, double out etc...

Ich zerbrech mir gerade die ganze Zeit den Kopf, ob und wie einzelne Objekte interagieren können. Beispielsweise habe ich eine Klasse Spieler angelegt, mit den Atributen Name, Rang, Durchschnittliche Punktzahl und eine Klasse Spiel mit den Attributen Datum, Spieleranzahl, Punkte, Würfe.

Irgendwie weiß ich jetzt nicht ich weiter machen soll. Ich kann bsp. 2 Spielerobjekte erzeugen und ein Spielobjekt. Aber wie kriege ich es jetzt zusammen? Sollte ich vielleicht als nächstes eine Funktion bauen, die ich werfen nenne? Könnte diese Funktion dann mit den beiden generierten Spielerobjekten und dem Spielobjekt interagieren?

Ich steh noch ganz am Anfang und mir fehlt da grundsätzliches Verständnis. Ziel soll sein, dass man ein Dartprogramm hat, bei dem seinen Fortschritt speichern kann und bsp. auch statistische Sachen auswerten kann wie z.B. Durchschnitt pro Wurf, Ranglisten etc.

Vielleicht könnt ihr mal kurz erklären, wie ihr sowas grundsätzlich angehen würdet. Also mir gehts jetzt nicht um konkreten code sondern eher der grundlegende Aufbau.

VG

Codain
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt viele Wege das zu lösen, aber ein paar Tipps:

Es gibt ja prinzipiell beliebig viele Spieler. Mit jeweiligen Historien, etc. Ein Spiel ist nun ein beschränkter Zeitraum, bei dem n Spieler zusammen kommen, und spielen. Das Spielobjekt sollte also die Spieler kennn, die es ausmachen. Die kannst du also im Konstruktor zb als Liste übergeben.

Natürlich gibt es verschiedene Spielarten, aber für den Anfang reicht ja 301. Das Spiel muss ein paar Informationen haben und bereitstellen. Zb wer dran ist. Wieviele Punkte jeder Spieler runter zu spielen hat.

Dann gibt es diverse Dinge die passieren. Jeder Spieler spielt reihum. Da das Spiel selbst weiß, wer dran ist, kannst du eine Methode “next_turn()” machen die

- den aktiven Spieler eine Wurf ausführen lässt.
- den Wurf entsprechend den Regeln verarbeitet.
- den nächsten Spieler bestimmt.
- zurück gibt, ob das Spiel noch läuft.
Code Codain
User
Beiträge: 28
Registriert: Samstag 8. Dezember 2018, 16:12

Dank Dir, dass sind ja schon mal super Tipps. Gerade auf die Sache mit dem Konstruktur (Spielerübergabe) wäre ich nie gekommen. Das eigentliche spielen würde ich dann in einer Funktion umsetzten. Macht diese Herangehensweise Sinn?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Dafuer habe ich ja Methode geschrieben. Dein Spiel verwaltet doch, wieviele Punkte jeder Spieler hat. Eine Funktion zum naechsten Zug machen muss alle Informationen des Spiels kennen. Also ist es eine Methode.

Ein bisschen anders stellt sich das Problem dar, wenn man dann spaeter mal an verschiedene Spielarten denkt, aber so weit solltest du im ersten Schritt nicht gehen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Code Codain: dankenswerterweise darf man die Code-Beispiele dieses Buchs anschauen. Und wie bei vielen dieser Bücher, wo der Autor jeden Monat ein Buch für eine andere Sprache schreibt, ist er dann kein Experte auf dem Gebiet. `eval` sollte man nicht benutzen, wobei an den Stellen ein einfaches `int` reichen würde. Es werden die Namenskonventionen nicht eingehalten, es gibt nicht mal einheitliche für's Buch. Was noch schlimmer ist, die Einrückungen sind uneinheitlich, diese sollten immer 4 Leerzeichen pro Ebene sein. Auch wenn der Platz in einem Buch begrenzt ist, Variablennamen wie ma, mo, bj, pr sollte niemand verwenden.

Die erste Variante der Klasse `Auto` sah ja noch recht brauchbar aus, dann aber merkt man, dass der Autor eigentlich Java programmiert; ich kann zwar nicht sagen, ob die Erklärungen was taugen, der Code ist aber nur für den Mülleimer. Sollte da was von Getter und Setter und Privat erklärt werden, ist auch das Buch für's Altpapier. Aber selbst for-Schleifen über einen Index macht man in Java seit ein paar Jahrzehnten nicht mehr.

Im Kapitel zu Tkinter wird es dann ganz absurd. Klassen, die innerhalb von Methoden von anderen Klassen definiert werden? Verbotenerweise mehrere Tk-Instanzen. Von den vielen Schreibfehlern gar nicht zu reden.

Wenn Du also mit dem Buch gelernt hast, muß man Dir wieder vieles abgewöhnen.
Code Codain
User
Beiträge: 28
Registriert: Samstag 8. Dezember 2018, 16:12

Ja, über die Sache mit dem eval bin ich auch über google gestoßen. Scheinbar ist dies aus Sicherheitsgründen keine gute Vorgehensweise, so wie ich es sehe, wollte der Autor dort nur schnell zum Ziel kommen. Schade, dass er nicht erwähnt hat, dass es keine gute Vorgehensweise ist. Das Kapitel bzgl. GUI (Tkinker) habe ich auch komplett ausgelassen, weil es mich (noch) nicht interessiert. Kennst du vielleicht ein brauchbares Buch über Python? Auch bin ich gerade auf der Suche nach grundsätzlicheren Informationen übers coden. Wie oben schon erklärt, habe ich Probleme mit der Logik, ich weiß nicht genau für was ich eine Klasse definieren soll/muss bzw. wann es sinnvoll ist und wann nicht.

Noch eine grundsätzliche Frage (sorry falls ne totale Newbiefrage ist). Mein Gedanke war es das Dartprogramm später auf einem Webserver laufen lassen zu lassen. Ist der Gedanke richtig, dass ich erstmal das Programm schreibe, lokal ausführe und verbessere und als finalen Step einfach auf einen Webserver schieben kann, damit man es einfach durch den Browser bedienen kann.

Inwieweit muss man dies schon beim Erstellen des Codes berücksichtigen bzw. wir groß ist der Arbeitsaufwand? Ich weiß, dass man es ohne konkreten Code nicht sagen kann, aber die grundsätzliche Vorgehensweise würde mich mal interessieren.

VG
Code Codain
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, man kann nicht einfach ein Programm, dass man für die Konsole geschrieben hat, nicht einfach über einen Webserver laufen lassen. Zumindest die Ein- und Ausgabe muß man umschreiben. Daher ist es auch wichtig, die eigentliche Spiellogik unabhängig von Ein- und Ausgaben zu schreiben.

Fang einfach an, das Programm so zu schreiben, wie Du jetzt denkst, dass es funktionieren könnte. Du mußt sowieso Deinen Code 5 bis 6 mal komplett wegschmeißen. Auch bei mir ist es oft so, dass erst die dritte Iteration die komplette Funktionalität unterstützt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Kennst du vielleicht ein brauchbares Buch über Python?
Ich habe früher, also als es freiesMagazin noch gab, relativ viele (deutschsprachige) Bücher für Rezensionen gelesen. Das Grundproblem bei so gut wie allen: jedes hat mehr oder minder viele kleine & große Fehler. Doof ist halt, wenn's bei grundlegenden Sachen wie Umsetzen der PEP8 oder stark suboptimale Beispiele für Klassen ist. "Python 3 - Das umfassende Handbuch" war früher grottig, aber in der letzten Auflage ganz ok. Es kommt jetzt wohl einen neue - keine Ahnung, wie die ist.

Du brauchst zum lernen aber kein Buch: einfach das offizielle Python Tutorial auf python.org lesen. Das ist fehlerfrei und hat alles, was man braucht. Um einen Überblick über die Standradmodule von Python zu erhalten ist die Webseite "Python Module of the Week" sehr gut.

Zu deinem "Problem": der Ansatz, was umzusetzen, was man kennt und mag, ist genau richtig. Dann hat man auch die richtige Motivation :-) Das Problem: man kann das mit dem Dart beliebig komplex gestalten, __deets__ hat das ja schon ausgeführt. Von daher der Tipp: fang' einfach an und erweitere das ganze dann schrittweise. Und am besten immer wieder den Code hier posten, Kritik abholen, besser machen. Das hilft gerade beim Lernen oft mehr als ein Buch lesen.

Gruß, noisefloor
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Code Codain hat geschrieben: Samstag 8. Dezember 2018, 19:38 Auch bin ich gerade auf der Suche nach grundsätzlicheren Informationen übers coden.
In dem Fall ist vielleicht auch "Think Python" einen Blick wert, da es allgemeine Programmierkonzepte vermittelt:
https://greenteapress.com/wp/think-python-2e/

(Es gibt mehrere Inkarnationen des Buchs teilweise auch unter dem Titel "(How to) Think Like a Computer Scientist" und in verschiedenen Autorenkonstellationen. Das müsste hoffentlich die aktuellste sein)
Code Codain
User
Beiträge: 28
Registriert: Samstag 8. Dezember 2018, 16:12

__deets__ hat geschrieben: Samstag 8. Dezember 2018, 17:54 Nein. Dafuer habe ich ja Methode geschrieben. Dein Spiel verwaltet doch, wieviele Punkte jeder Spieler hat. Eine Funktion zum naechsten Zug machen muss alle Informationen des Spiels kennen. Also ist es eine Methode.

Ein bisschen anders stellt sich das Problem dar, wenn man dann spaeter mal an verschiedene Spielarten denkt, aber so weit solltest du im ersten Schritt nicht gehen.
Ok, hatte ich wohl falsch verstanden. Denke auch, dass ich erstmal nur eine Spielart (301, doubleout) nehmen werde.
Sirius3 hat geschrieben: Samstag 8. Dezember 2018, 19:54 Nein, man kann nicht einfach ein Programm, dass man für die Konsole geschrieben hat, nicht einfach über einen Webserver laufen lassen. Zumindest die Ein- und Ausgabe muß man umschreiben. Daher ist es auch wichtig, die eigentliche Spiellogik unabhängig von Ein- und Ausgaben zu schreiben.

Fang einfach an, das Programm so zu schreiben, wie Du jetzt denkst, dass es funktionieren könnte. Du mußt sowieso Deinen Code 5 bis 6 mal komplett wegschmeißen. Auch bei mir ist es oft so, dass erst die dritte Iteration die komplette Funktionalität unterstützt.
Ok, aber grundsätzlich wäre es schon möglich (nach Anpassungen) das Programm aufm einem Server laufen zu lassen. Ja, ich denke auch, dass ich einfach mal loslegen sollten anstatt die Sache zu verkopft anzugehen :)

@noisefloor

Danke bzgl. des Tutorials, werde ich mir angucken.

@nezzcarth

Genau sowas hab ich gesucht, Syntax is ja eine Sache aber beim grundsätzlichen Verständnis haperts bei mir. ty
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Weg, das Programm spaeter noch anderweitig verwenden zu koennen besteht darin, Eingabe und Ausgabe strikt von der Logik zu trennen. In dem Moment kannst du den Kern des ganzen (konkrete Spiellogik) wiederverwenden.

Es ist allerdings eine der hoeheren Kuenste, sowas wirklich hinzubekommen, und selbst erfahrenen Programmierern passiert es, dass die konkrete Umgebung in die eigentlich schoene Logik reinsuppt, und ploetzlich alles wieder ein Knoten Spaghetti ist. So ist das halt im Leben der Programmierer.
Antworten