我正在为我的妹妹创建一个游戏,我想要一个函数来返回一个列表变量,所以我可以将它传递给另一个变量。
相关代码如下:
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!"
然后将其传递给从另一个模块导入的另一个函数
from potatohead import *
...
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)
PotatoHead对象的代码位于上面导入的potatohead.py模块中,如下所示:
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)
但是,当我运行程序时,会出现此错误:
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
我做错了什么?
- - - - - - - - 编辑
程序完成如下:
第7步(共7步):
Your PotatoHead will now be created... Creating variables...
inputPHName
inputPHFirstToy
然后进入Tracback
- - - - - - - - EDIT2
这是我正在运行的完整代码:
#+--------------------------------------+#
#| 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)
potatohead.py模块如下:
#+--------------------------------------+#
#| 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)
游戏仍在开发中 - 可能有部分模块不完整,但我认为它们不会导致问题
答案 0 :(得分:5)
首先,我必须说你正在为初学者编写好的代码,尽管你可以通过编写一个函数来改进startNewGame,以便在循环中获取用户输入,而不是一次又一次地编写相同的代码。
我复制了你的代码并且它运行没有问题,虽然我做了一些小改动
你正在做什么MCreatePH = startGame()
但你还没有定义startGame?所以如果用startNewGame替换它就可以了
MCreatePH = startNewGame()
所以你可能在某处定义了startGame而它什么也没有返回?
答案 1 :(得分:0)
起初我以为你只是调用一个不存在的函数,因为你的“相关代码”片段向我们展示了startNewGame()的定义,后面是:
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)
然而,我读完了整个代码,发现startGame()也是一个函数。
在startGame()
函数中,您的案例会调用startNewGame()
,但在调用startNewGame()
时,任何内容都不会从startGame()
返回数据。这就是为什么您正在创建的__init__
实例的PotatoHead
方法无法尝试索引数据的原因。在startGame()
函数中,您可以将“return”放在您调用startNewGame()
的位置前面,我认为所有内容都应该很好地链接。