"Al Stern" <albst...@gmail.com> wrote

Anyway, I finally finished the program.  I am sure it isn't the most
efficient code and I suspect I should have used the 'while' loop earlier,

Some things to think about below.

attributes = {"strength": 0, "health": 0, "wisdom": 0, "dexterity": 0}
MAX_POINTS = int(30)
keys = attributes.keys()
values = attributes.values()

you don't need keys and values as variables because you can always
fetch them from atttributes as needed.

list (values)

This converts values into a list, which it already is, then throws it away.
I suspect you think its doing something else?.

attributes["strength"] = int(input("\nHow many points do you want to assign
to strength?: "))
attributes["health"] = int(input("\nHow many points do you want to assign to
health?: "))
attributes["wisdom"] = int(input("\nHow many points do you want to assign to
wisdom?: "))
attributes["dexterity"] = int(input("\nHow many points do you want to assign
to dexterity?: "))

One of the advantages of using a dict is that you can use a loop here
and thus easily extend your data in the futire without changing the
input/output code:

for name in attributes.keys():
attributes[name] = int( input("How many points do you want to assign to %s " % name) )


#point allocation
point_total = 0
for val in values:
 point_total += val

point_total = sum( attributes.values() )



print ("\nThis is how you have chosen to allocate your 30 points.")
print ("\nStrength:",(attributes["strength"]))
print ("Health:", (attributes["health"]))
print ("Wisdom:", (attributes["wisdom"]))
print ("Dexterity:", (attributes["dexterity"]))

And as above this can be a loop:

for name in attributes.keys():
   print("\n", name, ":", attributes[name] )

available_points = (MAX_POINTS) - (point_total)

No need for any of the parentheses here

while point_total != "":

You are comparing point_total to a string, but point_total is a number.
You need to be careful about keeping your data types consistent.

   if point_total > 30:
     print ("\nYou have gone over your alloted 30 points.")
     print ("Please re-enter your choices. ")
....

     #point allocation
     point_total = 0
     for val in values:
       point_total += val

again, use sum()

print ("\nThis is how you have chosen to allocate your 30 points.")
     print ("\nStrength:",(attributes["strength"]))
     print ("Health:", (attributes["health"]))
     print ("Wisdom:", (attributes["wisdom"]))
     print ("Dexterity:", (attributes["dexterity"]))
     available_points = (MAX_POINTS) - (point_total)
     continue
   else:
     break

The logic here could be simplified into

while point_total > 30:

print ("\nYou have", available_points, "points left.")
print ("\nSince you have points left over, you may reallocate your points or
begin your quest.")
choice = int(input("\nTo reallocate, press 1. To begin, press 2: "))
while choice != "":

Again comparing to a string but you have made choice an integer

 if choice == 1:
   print ("Please re-enter your choices. ")
attributes["strength"] = int(input("\nHow many points do you want to
assign to strength?: "))
attributes["health"] = int(input("\nHow many points do you want to
assign to health?: "))
attributes["wisdom"] = int(input("\nHow many points do you want to
assign to wisdom?: "))
attributes["dexterity"] = int(input("\nHow many points do you want to
assign to dexterity?: "))

   #point allocation
   point_total = 0
   for val in values:
     point_total += val

Note, you haven't actually assigned anything to values since the user
entered the new data. This is another reason it would be better to not
have the variable, just get values directly from attributes on demand.


HTH,


--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to