[英]Simple Function Problem. Trying to make a simple dice roll race game that tracks the position when they roll the dice
试图找出程序无法运行的原因。 这是我得到的错误代码:update_position (random_roll_1, random_roll_2) builtins.NameError: name 'random_roll_1' is not defined
我以为我有所有正确的参数,但我想没有。 任何帮助将非常感激
import random
from random import randint
#both of the players are able to roll out their turs
这是玩家可以掷骰子并接收随机数的功能
def roll_die(p1_move,p2_move):
if p1_move is True:
input('Press enter to roll the die for player 1')
random_roll_1 = randint(1,6)
random_roll_1 = str(random_roll_1)
print('Player 1 rolled ' + random_roll_1)
random_roll_1 = int(random_roll_1)
return random_roll_1
elif p2_move is true:
input('Press enter to roll the die for player 2')
random_roll_2 = randint(1,6)
random_roll_2 = str(random_roll_2)
print('Player 2 rolled ' + random_roll_2)
random_roll_2 = int(random_roll_2)
return random_roll_2
这部分更新每个玩家在掷骰子后所处的位置。 玩家必须精确地掷出 8 点才能获胜。 高于此值的任何值都会导致玩家停留在其位置上
def update_position(random_roll_1, random_roll_2):
player_1_position = 0
player_2_position = 0
max_score = 8
if player_1_position < max_score:
if player_1_position + random_roll_1 > 8:
print('The roll was too high, player 1 stays in the same spot')
else:
player_1_position += random_roll_1
print('Player 1 moved up ' + random_roll_1 + ' spots!')
return player_1_position
elif player_2_position < max_score:
if player_2_position + random_roll_2 > 8:
print(' The roll was too high, player 2 stays in the same spot')
else:
player_2_position += random_roll_2
print('Player 2 moved up ' + random_roll_2 + ' spots!')
return player_2_position
此函数检查是否有一名玩家打到 8 作为他们的得分 #checks 以查看是否有任何玩家已经设法到达游戏结束 def check_game_over(player_1_position, player_2_position): if player_1_position == 8: print('玩家 1 赢了!') print('感谢您玩游戏!') continue_game = False return continue_game
elif player_2_position == 8:
print('Player 2 has won!')
print('Thank you for playing!')
continue_game = False
return continue_game
此功能是控制轮到谁的功能。 我添加了掷骰子功能以及更新点功能,因为将它们一起包含在一个整体功能中会更容易。 这就是我遇到问题的地方。
#random_roll_1,random_roll_2, player_1_position, player_2_position
#change the turn over to the next player
def opponent():
p1_move = True
p2_move = False
if p1_move is True:
roll_die (p1_move, p2_move)
update_position (random_roll_1, random_roll_2)
p1_move = False
p2_move = True
return p1_move, p2_move
elif p2_move is True:
roll_die(p1_move, p2_move)
update_position (random_roll_1, random_roll_2)
p1_move = True
p2_move = False
return p1_move, p2_move
此功能主要向用户显示他们当前所在的位置。
def display_state (player_1_position, player_2_position, p1_move, p2_move):
if p1_move is True:
player_1_position = str(player_1_position)
print('Player 1 is in ' + player_1_position + ' spot')
player_1_position = int(player_1_position)
elif p2_move is True:
player_2_position = str(player_2_positon)
print('Player 2 is in ' + player_2_position + ' spot')
player_2_position = int(player_2_position)
不完全确定这个函数是否正确,因为我仍然不完全理解 main 函数所以不确定这个 main 函数是否有效
def main():
#display instructions
continue_game = True
while continue_game:
opponent()
display_state (player_1_position, player_2_position, p1_move, p2_move)
check_game_over(player_1_position, player_2_position)
main()
所以你上面的程序有一些错误。 当您尝试在定义之前将 2 个变量传递到update_position
函数时,会导致上述运行时错误。
roll_die (p1_move, p2_move)
## random_roll_1 and random_roll_2 have not been defined
update_position (random_roll_1, random_roll_2)
但是,在处理此错误之前,需要了解一个关键的编程概念。
全局和局部变量。
全局变量是整个程序都可以使用的变量。 它们通常在程序的顶部定义:
p1_move = True
p2_move = False
def roll_die(): ...
def main(): ...
etc
局部变量是一种只能在创建它的函数内部使用的变量。
def foo():
x = 10
y = 5
return x + y
在这个例子中,变量 x 和 y 是局部变量,不能在程序的其他函数中使用(因为它们只存在于函数foo
)。 需要注意的一件事是,在将变量作为函数参数传递的情况下,然后在函数中修改该变量而不返回修改后的变量。 该变量只会在该函数内被修改,其他地方不会。 这适用于原始数据类型(不是通过引用传递的变量)。
def foo(z):
z += 1
z = 5
foo(z)
print(z)
在此示例中,输出将是 5,而不是 6,因为函数foo
修改后的 z 变量尚未返回。
仅出于这个原因,全局变量似乎是更好的选择,但通常全局变量是一个坏主意,建议您坚持使用局部变量。
有关全局和局部变量的更多信息。
有了这些知识,你的一些错误可能看起来更明显。 例如,在您的函数roll_die
,您定义了 2 个变量random_roll_1
和random_roll_2
。 但是,您尝试在其他函数中使用这些变量,例如update_position
。
我意识到您已经尝试独立于roll_die
函数返回每个 random_roll 变量,但是您没有存储这些返回值。
# Original
roll_die (p1_move, p2_move)
# Correctly returned
random_roll = roll_die(p1_move, p2_move)
在下一行中,您尝试同时使用random_roll_1
和random_roll_2
变量,即使在那个阶段您只知道其中 1 个变量。
# Original
update_position (random_roll_1, random_roll_2)
# Possible Correction
update_position(random_roll)
然后,您必须重新定义 update_position 函数,将每个玩家的下棋视为一个接一个地发生,而不是同时发生。
我还想强调减少程序中重复代码数量的重要性。
你的opponent
函数可以写成:
def opponent(p1_move, p2_move):
random_roll = roll_die(p1_move, p2_move)
update_position(random_roll)
p1_move = not p1_move
p2_move = not p2_move
return p1_move, p2_move
这次重构改变了一些细节,最重要的是not
的使用。
此运算符将变为 True->False 和 False->True。 例如,如果p1_move
为假,则not p1_move
为真。
此外,该函数具有参数p1_move, p2_move
,因为这些变量在程序的其他部分是必需的,您应该在此函数范围之外定义它们,并将它们作为参数传递给其他函数。 并且不要忘记存储返回值!
请注意,此函数重构是如何减少重复代码的示例,旨在与您修改后的程序一起使用。
要使您的程序运行,还需要进行一些修改,但我会让您自己解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.