Sinnvolle Aufteilung in Klassen

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.
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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
Zuletzt geändert von heal.p am Freitag 7. Januar 2011, 13:19, insgesamt 2-mal geändert.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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 ^^
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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 ^^
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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."
Das Leben ist wie ein Tennisball.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Ich fände eine Rückgabe von "points" alleine sinnvoller
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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...
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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 :)
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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

Code: Alles auswählen

return remaining_points - points
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)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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 (').
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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/
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

http://www.python.org/dev/peps/pep-0008/

Kannst du dir mal durch lesen ;)

Der Punkt vier war meine Schuld :P 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 ^^
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Also das

Code: Alles auswählen

for attr, ...
    attr = ...
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.

:wink:
yipyip
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@Leonidas:
Ok, ich gestehe. Ich halte es mit Google: 2 statt 4 Leerzeichen. :oops:
(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.
:wink:
yipyip
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Statt des vorgeschlagenen "defaultdict"s würde ich "dict.fromkeys" verwenden. Und vielleicht noch

Code: Alles auswählen

available - points < 0
in

Code: Alles auswählen

available < points
ändern.
Das Leben ist wie ein Tennisball.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Stimmt. "fromkeys" ist wesentlich schöner. Dann heißt es:

Code: Alles auswählen

    attr_points = dict.fromkeys(attributes, 0)
:wink:
yipyip
Antworten