Folgende Zeile habe ich in Verdacht:
players = Spieler.input_players(4)
Variablennamen auf str und int zusammensetzen
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
bzw. die dadurch aufgerufene Funktion:
def input_players(count):
result = []
for n in range(1, count + 1):
name = input("Spieler {}:".format(n))
result.append(Spieler(name, 0))
def input_players(count):
result = []
for n in range(1, count + 1):
name = input("Spieler {}:".format(n))
result.append(Spieler(name, 0))
dafür müsste aber die Methode input_players etwas mit der Liste die du eingibst machen
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Und wo steht in dieser Funktion was zurückgegeben werden soll? Du hast das doch in anderen Funktionen/Methoden bereits richtig gemacht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
Ich glaube, ich weiß, worauf du hinaus willst...
Aber: result.append(Spieler(name, 0)) legt mir doch einen Spieler an.
z.B: den Spieler "__blackjack__" mit dem Kontostand "0",
wenn ich das so in bei der Funktion eingebe, oder nicht?
Aber: result.append(Spieler(name, 0)) legt mir doch einen Spieler an.
z.B: den Spieler "__blackjack__" mit dem Kontostand "0",
wenn ich das so in bei der Funktion eingebe, oder nicht?
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sofasurfer0815: Ja schon, der `Spieler` wird dann an die Liste `result` angehängt. Und das war es dann aber auch schon. Wo steht denn das `result` an den Aufrufer der Funktion zurückgegeben werden soll? Das ist einfach eine lokale Liste.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
OK - verstanden.
Ich habe die Zeile "Spieler(result)" angefügt.
Damit sollte mir z.B. der Spieler "Hans" mit Kontostand 0 angelegt werden, aber:
(1) Namen eingeben - (2) Spiel eingeben - (3) Spielstand anzeigen
1
Eingabe Spielernamen:
=====================
Spieler 1:a
Traceback (most recent call last):
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 162, in <module>
main()
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 97, in main
players = Spieler.input_players(4)
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 18, in input_players
Spieler(result)
TypeError: __init__() missing 1 required positional argument: 'konto'
Konto "0" ist doch in result drin.
Ich habe die Zeile "Spieler(result)" angefügt.
Damit sollte mir z.B. der Spieler "Hans" mit Kontostand 0 angelegt werden, aber:
(1) Namen eingeben - (2) Spiel eingeben - (3) Spielstand anzeigen
1
Eingabe Spielernamen:
=====================
Spieler 1:a
Traceback (most recent call last):
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 162, in <module>
main()
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 97, in main
players = Spieler.input_players(4)
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 18, in input_players
Spieler(result)
TypeError: __init__() missing 1 required positional argument: 'konto'
Konto "0" ist doch in result drin.
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sofasurfer0815: Was soll die Zeile denn bewirken? Wenn Du `Spieler` aufrufst, erstellst Du *ein* Spieler-Objekt. Und der Aufruf erwartet einen Namen und einen Kontostand als Argumente. Du übergibst keinen Kontostand und als Namen eine Liste mit Spieler-Objekten. Das macht keinen Sinn. Die Funktion muss das Ergebnis an den Aufrufer zurückgeben. Das steht da nicht in der Funktion. In der `spielwert_berechnen()`-Funktion wird ja ein Wert an den Aufrufer zurückgegeben. Du weisst also wie das geht. Du musst es nur machen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Nein, nicht wirklich.
Die Liste result muss am Ende der Funktion an den 'Caller' zurück gegeben werden
Wenn du das nicht explizit machst, gibt die Funktion None zurück.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
@sofasurfer0815: Dein Programmcode ist Dir, gemessen an Deinen Einsteigerwissen, über den Kopf gewachsen. Das ist ein häufiger Fehler. Auch hast Du nicht bemerkt, dass in Deinem Code Typeannotations drin waren, weil Du annahmst, diese Syntax mache etwas anderes. Auch der Hinweis auf den @staticmethod-Dekorator wird Dich nicht weiter bringen.
Am besten Du fängst noch einmal von vorne an mit dem Beispiel von Sirius3 und versuchst dessen Code zu verstehen. Z.B. warum 'input_players' keine Methode auf 'Spieler' ist. Warum sollte auch ein Spieler dafür zuständig sein, sich selbst und weitere anzulegen? Und wo landet dann die Spielerliste? Das sind Designfehler, die Dir das Verständnis Deines eigenen Codes erschweren und diesen auch umständlich und fehlerträchtig machen.
Am besten Du fängst noch einmal von vorne an mit dem Beispiel von Sirius3 und versuchst dessen Code zu verstehen. Z.B. warum 'input_players' keine Methode auf 'Spieler' ist. Warum sollte auch ein Spieler dafür zuständig sein, sich selbst und weitere anzulegen? Und wo landet dann die Spielerliste? Das sind Designfehler, die Dir das Verständnis Deines eigenen Codes erschweren und diesen auch umständlich und fehlerträchtig machen.
Zuletzt geändert von kbr am Sonntag 22. Juli 2018, 14:39, insgesamt 1-mal geändert.
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
Ich möchte aber nicht mit "return result" die Liste an diese Stelle zurückliefern:
Stattdessen will ich daraus eher folgendes "stricken":
s1 = Spieler ("julian", 0)
s2 = Spieler ("__blackjack__", 0)
usw.
Ich glaub, ich sitz auf dem Schlauch ... Schonmal danke für die Geduld mit mir!
Code: Alles auswählen
if auswahl == "1": # Eingabe Spielernamen
print("Eingabe Spielernamen:")
print("=====================")
players = Spieler.input_players(4)
s1 = Spieler ("julian", 0)
s2 = Spieler ("__blackjack__", 0)
usw.
Ich glaub, ich sitz auf dem Schlauch ... Schonmal danke für die Geduld mit mir!
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
@ kbr
Ich fürchte, du hast recht!
Ich fürchte, du hast recht!
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sofasurfer0815: Doch Du möchtest an der Stelle die Liste mit ``return`` zurück geben und Du möchtest *nicht* einzelne Namen nach dem Muster `s1`, `s2`, usw. haben. Statt dieser einzelnen Namen nimmt man eine Liste. Wenn Du anfängst Namen zu nummerieren, machst Du etwas falsch. Und alles viel komplizierter als es sein müsste. Um zum Beispiel alle Spieler in der Liste auszugeben, egal wie viele das sind, reicht folgender Code:
Code: Alles auswählen
for player in players:
print(player)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
Danke. Jetzt hab ich's kapiert.
Ich arbeite mir der Liste, die ich in "result" habe. Ich hab das jetzt eingebaut und es funktioniert.
Aber mein Code überfordert mich:
Ich lege jetzt eine Liste mit Spielern an und kann mit dieser in main() arbeiten; aber benötige ich dann überhaupt die Klasse Spieler?
Ich arbeite mir der Liste, die ich in "result" habe. Ich hab das jetzt eingebaut und es funktioniert.
Aber mein Code überfordert mich:
Ich lege jetzt eine Liste mit Spielern an und kann mit dieser in main() arbeiten; aber benötige ich dann überhaupt die Klasse Spieler?
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sofasurfer0815: Was hat denn das eine mit dem anderen zu tun? Also wie sollte eine Liste in die Du `Spieler`-Exemplare steckst, `Spieler` als Datentyp unnötig machen? Die Klasse `Spieler` beschreibt Daten und Verhalten von *einem* Spieler. Und die Liste fasst mehrere konkrete Spieler-Werte zusammen. Jeder einzelne davon hat/braucht ja immer noch die Daten und das Verhalten das einen Spieler ausmacht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 14
- Registriert: Sonntag 22. Juli 2018, 11:06
OK. Ich muss Spieler als "Datentyp" sehen, und nicht als Container, in den ich Daten reinstecke.
Danke, das hab ich ursprünglich falsch verstanden.
Danke, das hab ich ursprünglich falsch verstanden.
Doch, doch: Klassen (bzw. Instanzen davon) sind schon eine Art Container, in die Du Daten reinstecken kannst. Diese werden dann zu den Attributen. Klassen sind aber auch Datentypen in der Hinsicht, dass Du zusätzlich noch Methoden anlegen kannst, die dann z.B. gegen diese Attribute arbeiten.