Seite 1 von 3
Sinnvolle Aufteilung in Klassen
Verfasst: Dienstag 4. Januar 2011, 14:22
von heal.p
Hallo zusammen
Hab gerade echt ne Blockade. Mir fällt keine gescheite (oder nicht gescheite) Lösung für mein Problem ein. :K
Code: Alles auswählen
# -*- coding: cp1252 -*-
# Charakter
skillpunkte = 25
name = raw_input('Welchen Namen soll der Charakter tragen? ')
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
staerke = int(raw_input('Wieviele Punkte in Stärke investieren? '))
skillpunkte -= staerke
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
agi = int(raw_input('Wieviele Punkte in Beweglichkeit investieren? '))
skillpunkte -= agi
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
stam = int(raw_input('Wieviele Punkte in Ausdauer investieren? '))
skillpunkte -= stam
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
intel = int(raw_input('Wieviele Punkte in Inteligenz investieren? '))
skillpunkte -= intel
waffe = None
leben = 100 + (stam * 6)
print "\n\n---Dein Charakter---"
print "Name: ", name
print "Stärke: ", staerke
print "Beweglichkeit: ", agi
print "Ausdauer: ", stam
print "Inteligenz: ", intel
print "Leben: ", leben
print "Waffe: ", waffe
Ich möchte natürlich verhindern das die Variabel
skillpunkte negativ wird, da man ja nicht mehr Skillpunkte vergeben darf/kann als man hat.
Der Code ist erst mal ein Entwurf, wird wahrscheindlich noch eine Funktion geben usw. aber erstmal habe ich diese Problem.
Gruss Heal
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 14:35
von JonasR
Du schaust halt ob Skillpunkte - Attribut < 0 ist wenn ja gibst du aus das nicht genügend Punkte zur Verfügung stehen. Und danach am besten eine neue Eingabe erwarten ^^
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 14:49
von heal.p
JonasR hat geschrieben:Du schaust halt ob Skillpunkte - Attribut < 0 ist wenn ja gibst du aus das nicht genügend Punkte zur Verfügung stehen. Und danach am besten eine neue Eingabe erwarten ^^
In der Theorie ist mir das auch bewusst das ich das irgendwie so realisieren muss, aber kannst du mir da bitte ein konkretes Code-Beispiel geben, weil eben ich steh irgendwie vor ner Wand.
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 15:06
von JonasR
Spontan ist mir das hier eingefallen:
Code: Alles auswählen
def readAttr(name, skillpunkte):
attr = raw_input('Wieviele Punkte in %s investieren?' % (name))
while int(attr) > skillpunkte:
print 'Dir stehen nicht genügend Skillpunkte zur verfügung.'
attr = raw_input('Wieviele Punkte in %s investieren?' % (name))
return attr
staerke = readAttr("Stärke", skillpunkte)
Edit Gerade noch ein par Debugvariablen gelöscht ^^
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 15:20
von EyDu
Und wenn du noch falsche Eingaben abfangen möchtest:
Code: Alles auswählen
def ask_skill(name, remaining_points):
while True:
try:
points = int(raw_input("Wieviele Punkte sollen in %s investiert werden?" % name))
if 0 <= points <= remaining_points:
return remaining_points - points
else:
print "Dir stehen nicht genügend Punkte zur Verfügung."
except ValueError:
print "Deine Eingabe ist ungültig."
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 15:23
von JonasR
Ich fände eine Rückgabe von "points" alleine sinnvoller
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 16:16
von heal.p
Vielen Dank euch beiden.
So sieht das jetzt mal bis jetzt aus
Code: Alles auswählen
# -*- coding: cp1252 -*-
# Charakter
def readAttr(name, skillpunkte):
attr = int(raw_input('Wieviele Punkte in %s investieren?' % (name)))
while int(attr) > skillpunkte:
print 'Dir stehen nicht genügend Skillpunkte zur verfügung.'
attr = int(raw_input('Wieviele Punkte in %s investieren?' % (name)))
return attr
skillpunkte = 25
name = raw_input('Welchen Namen soll der Charakter tragen? ')
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
stre = readAttr("Stärke", skillpunkte)
skillpunkte -= staerke
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
agi = readAttr("Beweglichkeit", skillpunkte)
skillpunkte -= agi
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
stam = readAttr("Ausdauer", skillpunkte)
skillpunkte -= stam
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
intel = readAttr("Inteligenz", skillpunkte)
skillpunkte -= intel
waffe = None
leben = 100 + (stam * 6)
print "\n\n---Dein Charakter---"
print "Name: ", name
print "Stärke: ", stre
print "Beweglichkeit: ", agi
print "Ausdauer: ", stam
print "Inteligenz: ", intel
print "Leben: ", leben
print "Waffe: ", waffe
EyDu bei deinem Lösungansatz ist das Problem, das er immer in der While Schleife drinne ist, weil ja alles immer True sein wird. Oder vielleicht habe ich es auch einfach nur falsch integriert. Habe so etwas ähnliches auch schon versucht.
Auf jedenfall werd ich mal weiter Programmieren

und meld mich wieder.
PS: Wie kann ich allenfalls den Thread-Titel anpassen?
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 16:21
von JonasR
Also als ich den Code von EyDu getestet habe lief es Problemlos... anscheinend beendet das return die Schleife....
Insgesamt solltest du auch seinen Code verwenden oder meinen Anpassen da dieser noch Fehler abfängt was mein Code nicht tut.
Denke zum ändern des Titels musst du den ersten Post editieren...
Re: Verhindern das eine Variabel negativ wird
Verfasst: Dienstag 4. Januar 2011, 16:23
von Xynon1
heal.p hat geschrieben:EyDu bei deinem Lösungansatz ist das Problem, das er immer in der While Schleife drinne ist, weil ja alles immer True sein wird. Oder vielleicht habe ich es auch einfach nur falsch integriert. Habe so etwas ähnliches auch schon versucht.
Ist doch aber in dem Fall korrekt, es soll sich doch so oft wiederholen bis vernünpftige Angaben gemacht werden, dann verlässt er über ein "return" die Funktion und damit auch die Schleife.
heal.p hat geschrieben:PS: Wie kann ich allenfalls den Thread-Titel anpassen?
Einfach den Betreff vom erstem Post ändern.
Edit: Jonas war schneller

Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 09:23
von heal.p
Danke euch

ich mag die Kommunitie hier (Schreibt man das so auf Deutsch?)
Arg ^^ dachte doch irgendwas ist falsch und bis ich den Fehler gefunden habe. Entweder lags daran das ich den Code von EyDu falsch eingefügt habe oder der Logikfehler wurde wirklich von EyDu gemacht (soll kein Vorwurf sein)
Aber mit
habe ich nachher "Attribut" = "übrige skillpunkte" was ja nicht mein Ziel ist, denn ich will ja "Attribut" = Input haben. Hoffe das war verständlich
Falls mir jmd noch ne elegantere Lösung für skillpunkte -= "Attribut" geben kann, bin ich gerne offen. Werd da aber noch ein bisschen dran rumbasteln
Mein Code sieht nun so aus
Code: Alles auswählen
# Charakter
def readAttr(name, skillpunkte):
while True:
try:
points = int(raw_input("Wieviele Punkte sollen in %s investiert werden? " % name))
if 0 <= points <= skillpunkte:
return points
else:
print "Zuwenig Skillpunkte verfügbar."
except ValueError:
print "Deine Eingabe ist ungültig."
skillpunkte = 25
name = raw_input('Welchen Namen soll der Charakter tragen? ')
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
stre = readAttr("Stärke", skillpunkte)
skillpunkte -= stre
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
agi = readAttr("Beweglichkeit", skillpunkte)
skillpunkte -= agi
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
stam = readAttr("Ausdauer", skillpunkte)
skillpunkte -= stam
print 'Dir stehen', skillpunkte, 'Skillpunkte zur verfügung.'
intel = readAttr("Inteligenz", skillpunkte)
skillpunkte -= intel
waffe = None
leben = 100 + (stam * 6)
Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 09:36
von Xynon1
Mh, ich würde folgendes aus der Nutzerperspektive bemängeln.
1. Ich weiß so zu Beginn nicht welche, bzw. wie viele Attribute es gibt.
2. Wenn ich keine Skillpunkte mehr habe, dann fragt er mich trotzdem noch, wie viele Punkte ich investieren möchte.
Und aus Programmier Sicht,
3. Wieso schreibst du die Abfragen doppelt und dreifach, nutze dafür doch einfach eine Schleife
(4.) readAttr, ist eine Funktion und diese sollten in Python eigentlich nicht mixedCase sein.
(5.) Man sollte nicht deutsche und englische Variablen mischen, entscheide dich für eine Sprache
Edit: Das selbe gilt für die Anführungsstriche, einmal benutzt du dopplte (") und dann wieder einfache (').
Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 10:08
von heal.p
Xynon1 hat geschrieben:Mh, ich würde folgendes aus der Nutzerperspektive bemängeln.
1. Ich weiß so zu Beginn nicht welche, bzw. wie viele Attribute es gibt.
2. Wenn ich keine Skillpunkte mehr habe, dann fragt er mich trotzdem noch, wie viele Punkte ich investieren möchte.
Und aus Programmier Sicht,
3. Wieso schreibst du die Abfragen doppelt und dreifach, nutze dafür doch einfach eine Schleife
(4.) readAttr, ist eine Funktion und diese sollten in Python eigentlich nicht mixedCase sein.
(5.) Man sollte nicht deutsche und englische Variablen mischen, entscheide dich für eine Sprache
Edit: Das selbe gilt für die Anführungsstriche, einmal benutzt du dopplte (") und dann wieder einfache (').
Für die Nutzerperspektive werde ich später sorgen. Im Moment geht es mir vorallem darum meine Kenntnisse in Python zu vertiefen.
3. Wer ich mir mal überlegen, wie die Schleife den aussehen müsste und probier das dann mal aus.
4. Wie ist mixedCase gemeint? Versteh ich nun nicht ganz.
5. Ja, wurde unterdessen angepasst.
Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 10:14
von Xynon1
4. Das heißt Klein- und Großbuchstaben, Funktionen/Methoden sollten nur kleine Buchstaben und _ im Namen enthalten.
Die Richtlinien für Python findest du hier
http://www.python.org/dev/peps/pep-0008/
Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 10:16
von JonasR
http://www.python.org/dev/peps/pep-0008/
Kannst du dir mal durch lesen
Der Punkt vier war meine Schuld

Ich hatte es falsch im Kopf. mixedCase ist wenn du das Anfangswort klein und bei jedem weiteren den Anfangsbuchstaben groß schreibst. Also z.b setText.
Richtig wäre es set_text
Edit: Xynon1 diesmal warst du schneller ^^
Re: Verhindern das eine Variabel negativ wird
Verfasst: Mittwoch 5. Januar 2011, 10:35
von heal.p
Achso. Jo ich hab PEP8 auch schon angeschaut. Mich selbst stört mixedCase jetzt nicht, finde es sogar eher angenehmer zum Betrachten, aber ich werde schaun das ich das vermeiden kann, wenn ich hier was poste
Edit:
Hab nun mal ne Schleife gemacht, die funktioniert teils.
Es werden die Richtigen Namen bei der Abfrage verwendet (also Stärke, Beweglichkeit usw.) Es werden auch alle 4 Attribute abgefragt. Jedoch überschreibt es nicht den eigentlichen Wert der Attribute.
Code: Alles auswählen
def read_attr(name, skillpoints):
while True:
try:
points = int(raw_input("Wieviele Punkte sollen in %s investiert werden? " % name))
if 0 <= points <= skillpoints:
return points
else:
print "Zuwenig Skillpunkte verfügbar."
except ValueError:
print "Deine Eingabe ist ungültig."
skillpoints = 25
stre = 0
stam = 0
agi = 0
intel = 0
name = raw_input('Welchen Namen soll der Charakter tragen? ')
for attr, Name in enumerate(["Stärke", "Beweglichkeit", "Ausdauer", "Inteligenz"]):
print 'Dir stehen', skillpoints, 'Skillpunkte zur verfügung.'
attr = read_attr(Name, skillpoints)
skillpoints -= attr
weapon = None
life = 100 + (stam * 6)
Edit: Bitte sagt mir falls mein Lösungs"versuch" total daneben ist.
Re: Schleife zum Abfragen mehrer Variablen.
Verfasst: Mittwoch 5. Januar 2011, 16:42
von yipyip
Also das
ist sinnlos, damit überschreibst Du nicht Deine Attribute. Mein Vorschlag ist etwas anders organisiert:
Code: Alles auswählen
def ask_attributes(attributes, max_points=100):
available = max_points
length = len(attributes)
attr_points = dict(zip(attributes, [0] * length))
for i, attr in enumerate(attributes):
while True:
try:
points = int(raw_input("Attribute %s (max=%d, %d. from %d) -> " %
(attr, available, i+1, length)))
if available - points < 0:
print "That's to much!"
continue
else:
break
except ValueError:
print "Hu?"
#continue
attr_points[attr] = points
available -= points
if not available:
print 'No more points!'
break
return attr_points
my_attributes = ['Smartness', 'Stamina', 'Strength', 'Intelligence', 'Humor']
print ask_attributes(my_attributes)
Nach dem Motto: Liste kommt rein, Dictionary mit Attribut-Punkte-Paaren kommt raus.
yipyip
Re: Schleife zum Abfragen mehrer Variablen.
Verfasst: Mittwoch 5. Januar 2011, 16:57
von Leonidas
yipyip, aber bitte nicht mit 2 Spaces einrücken... und dein ``attr_points`` ist komisch, dafür würde man eher ``collections.defaultdict(int)`` nutzen, was nahezu das gleiche macht, aber nicht so umständlich. Auch hast du da ein ``continue`` das nicht notwendig ist.
Re: Schleife zum Abfragen mehrer Variablen.
Verfasst: Mittwoch 5. Januar 2011, 17:06
von yipyip
@Leonidas:
Ok, ich gestehe. Ich halte es mit Google: 2 statt 4 Leerzeichen.
(hat mir bis jetzt noch nie Schwierigkeiten gemacht)
An defaultdict hatte ich auch erst gedacht, aber es sollen ja auch die Attribute ins Dictionary, die keine Punkte zugewiesen bekommen.
yipyip
Re: Schleife zum Abfragen mehrer Variablen.
Verfasst: Mittwoch 5. Januar 2011, 17:08
von EyDu
Statt des vorgeschlagenen "defaultdict"s würde ich "dict.fromkeys" verwenden. Und vielleicht noch
in
ändern.
Re: Schleife zum Abfragen mehrer Variablen.
Verfasst: Mittwoch 5. Januar 2011, 18:18
von yipyip
Stimmt. "fromkeys" ist wesentlich schöner. Dann heißt es:
yipyip