[Tutor] GameTracker help

Mark Lawrence breamoreboy at yahoo.co.uk
Sun Feb 26 06:04:17 CET 2012


On 25/02/2012 15:37, Joel Goldstick wrote:
> On Sat, Feb 25, 2012 at 5:57 AM, Mike Nickey<mnickey at gmail.com>  wrote:
>> I think I found the issue. It seems that the UserOppSkillLvl wasn't
>> passing the integer version of this variable back.
>> Changing line 97 from
>>     return UserOppSkillLvl
>> to
>>     return int(UserOppSkillLvl)
>>   seems to have helped.
>>
>> Any suggestions on how to implement the UserSkillLvl section so it's
>> not redundant code?
>>
>> On Sat, Feb 25, 2012 at 02:07, Mike Nickey<mnickey at gmail.com>  wrote:
>>> Hey all,
>>>
>>> I'm trying to wok on a game tracker for my friends. What I have here
>>> partly works but there are areas that I want to change and some areas
>>> that are just not working for me.
>>>
>>> The areas that I am having difficulty with are the def pointsNeeded
>>> and oppPointsNeeded.
>>> What is strange to me is that I had pointsNeeded almost exactly as
>>> oppPointsNeeded and only pointsNeeded worked.
>>>
>>> I'd like to change this to one function since it does the same thing.
>>> I've tried using a dictionary but that does not seem to be working
>>> well either.
>>>
>>> Any advice would be great.
>>> Thanks in advance.
>>>
>>> CODE
>>> #===============================================================================
>>> # Get users name -- DONE
>>> # Get Users opponent name DONE
>>> # Get user opponents APA number --DONE
>>> # get users APA number -- DONE
>>> # Determine if this is 8-ball or 9-ball -- DONE
>>> # create number of points needed to win for 9-ball
>>> # create number of games needed to win for 8-ball
>>> # Get Users skill level -- DONE
>>> # get users current opponent skill level -- DONE
>>> # get number of innings played
>>> # number of defenses played
>>> # record who won and lost
>>> #===============================================================================
>>> import __builtin__
>>> import string
>>>
>>> pointDictionary = {1:14, 2:19, 3:25, 4:31, 5:38, 6:46, 7:55, 8:65, 9:75}
>>>
>>> def getUserName():
>>>     return raw_input("Enter your name: ")
>>>
>>> def getUserOppName():
>>>     return raw_input ("Enter your opponents name: ")
>>>
>>> def getUserNumber():
>>>     UserID = raw_input("Enter your APA ID number: ")
>>>     while (str.isdigit(UserID)==False):
>>>         UserID = raw_input("That is not a proper ID. Please re-enter
>>> your APA number: ")
>>>     return UserID
>>>
>>> def getUserOppNumber():
>>>     OppUserID = raw_input("Enter your opponents APA ID number: ")
>>>     while (str.isdigit(OppUserID)==False):
>>>         UserID = raw_input("That is not a proper ID. Please re-enter
>>> your opponents APA number: ")
>>>     return OppUserID
>>>
>>> def getGameType():
>>>     temp = 0
>>>     while temp == 0:
>>>         GameType = raw_input("Are you playing 8-ball or 9-ball? ")
>>>         if GameType == "8":
>>>             print "Good luck and don't get an early 8"
>>>             GameType = 8
>>>             temp = 1
>>>         elif GameType == "9":
>>>             print "Good luck! Let's hope you sink the stripe on the break!"
>>>             GameType = 9
>>>             temp = 1
>>>         else:
>>>             print "That's not a valid entry, Please try again.: "
>>>     return int(GameType)
>>>
>>> def CheckRange8Ball(GameType, min=1, max=8):
>>>     if not min<= GameType<= max:
>>>         raise ValueError('Value out of range')
>>>
>>> def getUserSkillLvl(GameType):
>>>     if GameType == 8:
>
>>>         UserSkillLvl = prompt = "Enter your current 8-ball skill level: "
>
> This is kind of odd looking.  Istead try this:
>             prompt = "Enter your current %d-ball skill level: " % prompt
>
> Look at http://docs.python.org/release/2.5.2/lib/typesseq-strings.html
>    or just google python string formatting
> Then you can get rid of this below
>
>>>     elif GameType == 9:
>>>         UserSkillLvl = prompt = "Enter your current 9-ball level:"
>>>
>>>     UserSkillLvl = raw_input(prompt)
>>>     UserSkillLvl = int(UserSkillLvl)
>>>
>
> Now, below.  It looks like if GameType is 9, SkillLvl is from 1 to 9.
> If GameType is 8, SkillLvl is from 1 to 8.
> Your elif statements are complicated.  Since the if case succeeds for
> Lvl from 1 to GameType, the elif is redundant.  You need the else, but
> else will always be true if the 'if' code failed.
> So simplify elif to else with no condition.
>
> Notice that your logic is identical except for the test dependant on
> the game.  That logic identical except for the upper range -- if game
> 8 then 8, if game 9 then 9.
>
> So, try to clean this up and figure a way to just test once, depending
> on the game.
>

To go further you don't need all those round brackets and you can chain 
comparisons in Python so this should work.

if 1 <= UserSkillLvl <= GameType:

>>>     if GameType == 9:
>>>         temp = 0
>>>         while temp == 0:
>>>             if ((UserSkillLvl<= 9) and (UserSkillLvl>=1)):
>>>                 print "Thank You"
>>>                 temp = 1
>>>                 break
>>>             elif ((UserSkillLvl>9) or (UserSkillLvl<  1)):
>>>                 while temp == 0:
>>>                     UserSkillLvl = raw_input("Please re-enter your
>>> 9-ball skill level")
>>>                     return UserSkillLvl
>>>
>>>     if GameType == 8:
>>>         temp = 0
>>>         while temp == 0:
>>>             if ((UserSkillLvl<= 8) and (UserSkillLvl>=1)):
>>>                 print "thank you"
>>>                 temp = 1
>>>                 break
>>>             elif (UserSkillLvl>8) or (UserSkillLvl<  1):
>>>                 while temp == 0:
>>>                     UserSkillLvl = raw_input("Please re-enter your
>>> skill level: ")
>>>     return UserSkillLvl
>>>
>>> def getUserOppSkillLvl():
>>>     UserOppSkillLvl = raw_input("Enter your opponents current skill level: ")
>>>     while (str.isdigit(UserOppSkillLvl)==False):
>>>         UserOppSkillLvl = raw_input("That is not a proper Skill Level. \
>>>         Please enter a number between 1 and 9 for 9-ball or 1 and 8
>>> for 8-ball: ")
>>>         UserOppSkillLvl = int(UserOppSkillLvl)
>>>     return UserOppSkillLvl
>>>
>>> def getPointsNeeded():
>>>     if (GameType == 9):
>>>         for UserSkillLvl in range (0, len(pointDictionary)):
>>>             pointsNeeded = pointDictionary(UserSkillLvl)
>>>     return pointsNeeded

getPointsNeeded will never work as :-
a) you can't call a dictionary, i.e. pointsNeeded = 
pointDictionary(UserSkillLvl) is incorrect
b) if you write pointsNeeded = pointDictionary[UserSkillLvl] instead 
you'll get a KeyError
c) if GameType isn't 9 you'll get an UnboundLocalError

How do I know this?  I've tried it at the interactive prompt, one of 
Python's great strengths.

 >>> pointDictionary = {1:14, 2:19, 3:25, 4:31, 5:38, 6:46, 7:55, 8:65, 
9:75}
 >>> def getPointsNeeded():
     if (GameType == 9):
         for UserSkillLvl in range (0, len(pointDictionary)):
             pointsNeeded = pointDictionary(UserSkillLvl)
     return pointsNeeded
 >>> GameType = 9
 >>> pointsNeeded = getPointsNeeded()
Traceback (most recent call last):
   File "<interactive input>", line 1, in <module>
   File "<interactive input>", line 4, in getPointsNeeded
TypeError: 'dict' object is not callable!
 >>> def getPointsNeeded():
... 	if GameType == 9:
... 		for UserSkillLvl in range (0, len(pointDictionary)):
... 			pointsNeeded = pointDictionary[UserSkillLvl]
... 	return pointsNeeded
... 			
 >>> pointsNeeded = getPointsNeeded()
Traceback (most recent call last):
   File "<interactive input>", line 1, in <module>
   File "<interactive input>", line 4, in getPointsNeeded
KeyError: 0
 >>> GameType = 8
 >>> pointsNeeded = getPointsNeeded()
Traceback (most recent call last):
   File "<interactive input>", line 1, in <module>
   File "<interactive input>", line 6, in getPointsNeeded
UnboundLocalError: local variable 'pointsNeeded' referenced before 
assignment

But this function isn't needed anyway just have.

pointsNeeded = pointDictionary[UserSkillLvl]

Hence.

 >>> UserSkillLvl = 5
 >>> pointsNeeded = pointDictionary[UserSkillLvl]
 >>> pointsNeeded
38

>>>
>>> def getOppPointsNeeded():
>>>     if (GameType == 9):
>>>         if (UserOppSkillLvl == 9):
>>>             oppPointsNeeded = 75
>>>         elif (UserOppSkillLvl == 8):
>>>             oppPointsNeeded = 65
>>>         elif (UserOppSkillLvl == 7):
>>>             oppPointsNeeded = 55
>>>         elif(UserOppSkillLvl == 6):
>>>             oppPointsNeeded = 46
>>>         elif (UserOppSkillLvl == 5):
>>>             oppPointsNeeded = 38
>>>         elif (UserOppSkillLvl == 4):
>>>             oppPointsNeeded = 31
>>>         elif (UserOppSkillLvl == 3):
>>>             oppPointsNeeded = 25
>>>         elif (UserOppSkillLvl == 2):
>>>             oppPointsNeeded = 19
>>>         elif (UserOppSkillLvl == 1):
>>>             oppPointsNeeded = 14
>>>     return oppPointsNeeded
>>>
>>> UserName = getUserName()
>>> UserOppName = getUserOppName()
>>> UserID = getUserNumber()
>>> OppUserID = getUserOppNumber()
>>> GameType = getGameType()
>>> UserSkillLvl = getUserSkillLvl(GameType)
>>> UserOppSkillLvl = getUserOppSkillLvl()
>>>
>>> print "\nPlayer Name:",UserName, "\nOpponent Name:", UserOppName,
>>> "\nUser ID: ",UserID, "\nOpponent APA ID", OppUserID, \
>>> "\nGameType: ",GameType,"\nUser Skill Level: ",UserSkillLvl, "\nUser
>>> Opponents Level: ",UserOppSkillLvl
>>>
>>> pointsNeeded = getPointsNeeded()
>>> oppPointsNeeded = getOppPointsNeeded()
>>> print "\nYou need", pointsNeeded, "to win while your opponent needs",
>>> oppPointsNeeded,"."
>>>
>>>
>>> --
>>> ~MEN
>>
>>
>>
>> --
>> ~MEN
>> _______________________________________________
>> Tutor maillist  -  Tutor at python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>
>
>


-- 
Cheers.

Mark Lawrence.



More information about the Tutor mailing list