[英]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.