《从零开始学Python游戏编程17-函数2》中,通过代码重构的方式将游戏的主要代码写入到自定义函数runGame()中。对于runGame()中的代码,可以继续对其进行重构,以达到简化代码结构的目的。
1 自定义函数askPlayer()
1.1 函数作用
自定义函数askPlayer()的作用是提示玩家输入所猜的数字,也就是获取玩家输入的数字。
1.2 askPlayer()与runGame()的关系
在文章的开头也提到了,将runGame()的部分代码写入到askPlayer()中,也就是说,要在runGame()中调用askPlayer()。自定义函数askPlayer()的作用是提示玩家输入要猜的数字,因此在runGame()中调用该函数后,应该得到玩家输入的数字,也就是说要把askPlayer()函数中玩家输入的数字提取出来,以供在runGame()函数中使用。关系如图1所示。
图1 askPlayer()与runGame()的关系
其中,红色字为runGame()函数的“范围”,绿色字是askPlayer()函数的范围。如果要将在绿色字范围内得到的数据拿到红色字范围内使用,可以通过return语句实现。
1.3 函数代码
将runGame()中用于玩家输入所猜数字的代码写入到自定义函数askPlayer()中,之后对代码进行调整修改,代码如图2所示。
图2 自定义函数askPlayer()的代码
其中,第29行原先的代码是使用break跳出while循环,在此将其改为return None,表示如果玩家输入的是“quit”,则返回None;第36行代码使用return语句返回玩家输入的数字。
相关链接1 在 Python 中,None 是一个特殊的常量,表示“空”或“无值”。它是 Python 中的一个内建类型,通常用于表示一个变量或对象的缺失值,或者一个函数没有返回值时的默认返回值。
注意1 return语句的作用是结束函数的同时让函数返回相应的值,也就是同时结束了函数中的while循环。
2 runGame()函数的修改
因为将runGame()函数的部分代码写入到askPlayer()中,runGame()函数的代码可以简化为如图3所示。
图3 runGame()函数的代码
其中,第13行代码调用自定义函数askPlayer()获取玩家的输入,因为在askPlayer()中使用了return语句,变量playerNumber中保存的就是askPlayer()函数的返回值,其可能取值是玩家输入的数字或者None;第19-20行代码判断playerNumber的值是否是None,也就是判断玩家是否输入了“quit”,如果是,则通过break函数跳出while循环,runGame()函数结束;接下来的代码就是比较playerNumber和magicNumber,这些代码没有改变。
3 完整代码
游戏完整代码如下所示。
import random
def runGame():
magicNumber = random.randint(1,10)
guessCount = 0
while True:
playerNumber = askPlayer()
guessCount += 1
if playerNumber == magicNumber:
print("猜对了,玩家获胜!")
print("你一共猜了{}次。".format(guessCount))
break
elif playerNumber == None:
break
elif magicNumber < playerNumber:
print("你猜的数字太大了!")
elif magicNumber > playerNumber:
print("你猜的数字太小了")
print("猜错了,请重试!")
def askPlayer():
while True:
number = input("请输入数字: ")
if number == "quit":
return None
try:
playerNumber = int(number)
except ValueError:
print("请输入正确格式的数字!")
continue
return playerNumber
while True:
print('-----游戏菜单-----')
print('1. 启动游戏')
print('2. 退出')
print('-----------------')
choice = input('请输入选项序号:')
if choice == '1':
runGame()
elif choice == '2':
break