2

I'm creating a game for my sister, and I want a function to return a list variable, so I can pass it to another variable.

The relevant code is as follows:

def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"

Then it is passed to another function that was imported from another module

from potatohead import *

...

welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)

the code for the PotatoHead object is in the potatohead.py module which was imported above, and is as follows:

class PotatoHead:
#Initialise the PotatoHead object:
def __init__(self, data):
    self.data = data    #Takes the data from the start new game function - see main.py
    #Defines the PotatoHead starting attributes:
    self.name = data[0]
    self.gender = data[1]
    self.colour = data[2]
    self.favouriteThing = data[3]
    self.firstToy = data[4]
    self.age = '0.0'
    self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
    self.fitness = '0.0'
    self.happiness = '10.0'
    self.health = '10.0'
    self.hunger = '0.0'
    self.tiredness = 'Not in this version'
    self.toys = []
    self.toys.append(self.firstToy)
    self.time = '0'
    #Sets data lists for saving, loading and general use:
    self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
    self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                      self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                      self.tiredness, self.toys)

However, when I run the program this error appears:

Traceback (most recent call last):
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/main.py", line 158, in <module>
myPotatoHead = PotatoHead(MCreatePH)
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/potatohead.py", line 15, in __init__
self.name = data[0]
TypeError: 'NoneType' object is unsubscriptable

What am i doing wrong?

-----EDIT-----

The program finishes as so:

Step 7 of 7:

Your PotatoHead will now be created...

Creating variables...

inputPHName

inputPHFirstToy

Then it goes to the Tracback

-----EDIT2-----

This is the EXACT code I'm running in its entirety:

#+--------------------------------------+#
#| main.py                              |#
#| A main module for the Potato Head    |#
#|  Game to pull the other modules      |#
#|  together and control through user   |#
#|  input                               |#
#| Author:                |#
#| Date Created / Modified:             |#
#|              3/2/10 | 20/2/10         |#
#+--------------------------------------+#  Tested: No

#Import the required modules:
import time
import random
import sys
from potatohead import *
from toy import *

#Start the Game:
def welcomeMessage():
    print "----- START NEW GAME -----------------------"
    print "==Print Welcome Message=="
    print "loading... \t loading... \t loading..."
    time.sleep(1)
    print "loading..."
    time.sleep(1)
    print "LOADED..."
    print; print; print;
    print """Hello,
    Welcome to the Potato Head Game. In this game you can create
a Potato Head, and look after it, like a Virtual Pet.
    This game is constantly being updated and expanded. Please
look out for updates.
"""

#Choose whether to start a new game or load a previously saved game:
def startGame():
    while 1:
        print "--------------------"
        print """ Choose an option:
New_Game
or
Load_Game
"""
        startGameInput = raw_input('>>> >')
        if startGameInput == 'New_Game':
            startNewGame()
            break
        elif startGameInput == 'Load_Game':
            print "This function is not yet supported"
            print "Try Again"
            print
        else:
            print "You must have mistyped the command: Type either 'New_Game' or 'Load_Game'"
            print

#Set the new game up:
def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"

#Run Program:
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)

The potatohead.py module is as follows:

#+--------------------------------------+#
#| potatohead.py                        |#
#| A module for the Potato Head Game    |#
#| Author:                              |#
#| Date Created / Modified:             |#
#|              24/1/10 | 24/1/10       |#
#+--------------------------------------+#  Tested: Yes (24/1/10)

#Create the PotatoHead class:
class PotatoHead:
    #Initialise the PotatoHead object:
    def __init__(self, data):
        self.data = data    #Takes the data from the start new game function - see main.py
        #Defines the PotatoHead starting attributes:
        self.name = data[0]
        self.gender = data[1]
        self.colour = data[2]
        self.favouriteThing = data[3]
        self.firstToy = data[4]
        self.age = '0.0'
        self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
        self.fitness = '0.0'
        self.happiness = '10.0'
        self.health = '10.0'
        self.hunger = '0.0'
        self.tiredness = 'Not in this version'
        self.toys = []
        self.toys.append(self.firstToy)
        self.time = '0'
        #Sets data lists for saving, loading and general use:
        self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
        self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                          self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                          self.tiredness, self.toys)

    #Define the phStats variable, enabling easy display of PotatoHead attributes:
    def phDefStats(self):
        self.phStats = """Your Potato Head's Stats are as follows:
----------------------------------------
Name: \t\t""" + self.name + """
Gender: \t\t""" + self.gender + """
Colour: \t\t""" + self.colour + """
Favourite Thing: \t""" + self.favouriteThing + """
First Toy: \t""" + self.firstToy + """
Age: \t\t""" + self.age + """
Education: \t""" + str(float(self.eduScience) + float(self.eduEnglish) + float(self.eduMaths)) + """
-> Science: \t""" + self.eduScience + """
-> English: \t""" + self.eduEnglish + """
-> Maths:   \t""" + self.eduMaths + """
Fitness: \t""" + self.fitness + """
Happiness: \t""" + self.happiness + """
Health: \t""" + self.health + """
Hunger: \t""" + self.hunger + """
Tiredness: \t""" + self.tiredness + """
Toys: \t\t""" + str(self.toys) + """
Time: \t\t""" + self.time + """
"""

    #Change the PotatoHead's favourite thing:
    def phChangeFavouriteThing(self, newFavouriteThing):
        self.favouriteThing = newFavouriteThing
        phChangeFavouriteThingMsg = "Your Potato Head's favourite thing is " + self.favouriteThing + "."

    #"Feed" the Potato Head i.e. Reduce the 'self.hunger' attribute's value:
    def phFeed(self):
        if float(self.hunger) >=3.0:
            self.hunger = str(float(self.hunger) - 3.0)
        elif float(self.hunger) < 3.0:
            self.hunger = '0.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Exercise" the Potato Head if between the ages of 5 and 25:
    def phExercise(self):
        if float(self.age) < 5.1 or float(self.age) > 25.1:
            print "This Potato Head is either too young or too old for this activity!"
        else:
            if float(self.fitness) <= 8.0:
                self.fitness = str(float(self.fitness) + 2.0)
            elif float(self.fitness) > 8.0:
                self.fitness = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Teach" the Potato Head:
    def phTeach(self, subject):
        if subject == 'Science':
            if float(self.eduScience) <= 9.0:
                self.eduScience = str(float(self.eduScience) + 1.0)
            elif float(self.eduScience) > 9.0 and float(self.eduScience) < 10.0:
                self.eduScience = '10.0'
            elif float(self.eduScience) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'English':
            if float(self.eduEnglish) <= 9.0:
                self.eduEnglish = str(float(self.eduEnglish) + 1.0)
            elif float(self.eduEnglish) > 9.0 and float(self.eduEnglish) < 10.0:
                self.eduEnglish = '10.0'
            elif float(self.eduEnglish) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'Maths':
            if float(self.eduMaths) <= 9.0:
                self.eduMaths = str(float(self.eduMaths) + 1.0)
            elif float(self.eduMaths) > 9.0 and float(self.eduMaths) < 10.0:
                self.eduMaths = '10.0'
            elif float(self.eduMaths) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        else:
            print "That subject is not an option..."
            print "Please choose either Science, English or Maths"
        self.time = str(int(self.time) + 1) #Pass time

    #Increase Health:
    def phGoToDoctor(self):
        self.health = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #Sleep: Age, change stats:              #(Time Passes)
    def phSleep(self):
        self.time = '0'                   #Resets time for next 'day' (can do more things next day)
        #Increase hunger:
        if float(self.hunger) <= 5.0:
            self.hunger = str(float(self.hunger) + 5.0)
        elif float(self.hunger) > 5.0:
            self.hunger = '10.0'
        #Lower Fitness:
        if float(self.fitness) >= 0.5:
            self.fitness = str(float(self.fitness) - 0.5)
        elif float(self.fitness) < 0.5:
            self.fitness = '0.0'
        #Lower Health:
        if float(self.health) >= 0.5:
            self.health = str(float(self.health) - 0.5)
        elif float(self.health) < 0.5:
            self.health = '0.0'
        #Lower Happiness:
        if float(self.happiness) >= 2.0:
            self.happiness = str(float(self.happiness) - 2.0)
        elif float(self.happiness) < 2.0:
            self.happiness = '0.0'
        #Increase the Potato Head's age:
        self.age = str(float(self.age) + 0.1)

The game is still under development - There may be parts of modules that aren't complete, but I don't think they're causing the problem

6
  • Do you ever see "Your PotatoHead varibles have been successfully created!" get printed? Commented Feb 20, 2010 at 3:54
  • No, the program seems to stop before it gets to that part of the code Commented Feb 20, 2010 at 3:56
  • 2
    Are startNewGame and startGame the same? I bet you're sorting or reversing the MCreatePH list or data in the __init__ method. l.sort() and l.reverse() in Python sort and reverse in place and return None. You can try sorted(l) and reversed(l) respectively if you want a new list. But we need actual code. Commented Feb 20, 2010 at 3:57
  • The code you've pasted here is not the same as the code you're running. We can't help you without the actual code. As for the above comments, no code is executed in a method after a return statement. Commented Feb 20, 2010 at 3:58
  • You print "Your PotatoHead varibles have been successfully created!" after return from the function, so that wouldn't run anyway. Commented Feb 20, 2010 at 3:59

2 Answers 2

5

First all, i must say you are writing good code for a beginner, though you can improve startNewGame by writing a function, for getting user input in a loop, instead of writing same code again and again.

I copied your code and it runs without problem, though i did a small change

you are doing

MCreatePH = startGame()

but you haven't defined startGame? so if replace that with startNewGame it works

MCreatePH = startNewGame()

so may be you have defined startGame somewhere and it returns nothing?

Sign up to request clarification or add additional context in comments.

1 Comment

You can also improve your code (conformance with community conventions is an improvement) by complying with PEP 8: functions should be named start_game and start_new_game, attributes should be named ph_data and favourite_thing, etc.
0

At first I thought you were just calling a function that didn't exist because your "relevant code" snippet shows us the definition of startNewGame() followed by this:

welcomeMessage()

MCreatePH = startGame()

myPotatoHead = PotatoHead(MCreatePH)

However, then I read the full code and saw that startGame() is also a function.

In the startGame() function you have a case that will call startNewGame(), but nothing ever returns the data from startNewGame() when startGame() is called. That is why the __init__ method of the PotatoHead instance you are creating fails trying to index into data. In the startGame() function, you can put "return " in front of where you call startNewGame() and I think everything should link up nicely.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.