簡體   English   中英

簡單的函數問題。 嘗試制作一個簡單的擲骰子比賽游戲,跟蹤他們擲骰子時的位置

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM