Skip to main content
 首页 » 编程设计

python之如何让我的怪物移动

2025年05月04日26xxx_UU

上面写着

Traceback (most recent call last): 
File "dungeon2.py", line 93, in <module> 
move_monster(monster, steps) 
NameError: name 'steps' is not defined 

当游戏开始时,怪物留在它的位置,但我不确定为什么。

import random 
 
BOARD = [(0, 0), (0, 1), (0, 2), 
         (1, 0), (1, 1), (1, 2), 
         (2, 0), (2, 1), (2, 2)] 
 
def get_locations(): 
  monster = random.choice(BOARD) 
  start = random.choice(BOARD) 
  door = random.choice(BOARD) 
 
  #If player, door or monster are random, do it all over again. 
  if monster == door or monster == start or door == start: 
    return get_locations() 
 
  return monster, door, start 
 
def move_player(player, move): 
  x, y = player 
  if move == 'LEFT': 
    y -= 1 
  elif move == 'RIGHT': 
    y += 1 
  elif move == 'UP': 
    x -= 1 
  elif move == 'DOWN': 
    x +=1 
  else: 
    print("That move doesn't exist PLEASE.") 
  return x, y 
 
def move_monster(monster, steps): 
  x, y = monster 
  moves = ['LEFT', 'RIGHT', 'UP', 'DOWN'] 
  steps = random.choice(moves) 
  if steps == 'LEFT': 
    y -= 1 
  elif steps == 'RIGHT': 
    y += 1 
  elif steps == 'UP': 
    x -= 1 
  elif steps == 'DOWN': 
    x +=1   
 
 
def get_moves(player): 
  moves = ['LEFT', 'RIGHT', 'UP', 'DOWN'] 
  if player[1] == 0: 
    moves.remove('LEFT') 
  if player[1] == 2: 
    moves.remove('RIGHT') 
  if player[0] == 0: 
    moves.remove('UP') 
  if player[0] == 2: 
    moves.remove('DOWN') 
  return moves 
 
 
def draw_map(player, monster): 
  print('_ _ _') 
  tile = '|{}'   
  for idx, cell in enumerate(BOARD): 
    if idx in [0, 1, 3, 4, 6, 7]: 
      if cell == player: 
        print(tile.format("X"), end ='')  
      elif cell == monster: 
        print(tile.format("M"), end = '') 
      else: 
        print(tile.format("_"), end ='') 
    else: 
      if cell == player: 
        print(tile.format("X|")) 
      elif cell == monster: 
        print(tile.format("M|")) 
      else: 
        print(tile.format("_|"))     
 
 
monster, player, door = get_locations() 
 
print("Welcome to the dungeon! *evil laugh*") 
 
while True: 
  moves = get_moves(player) 
 
  draw_map(player, monster)               
  print("You are currently in room {}".format(player)) #fill in with player position 
  print("You can move {}".format(moves)) # fill in with available positions 
  print("Enter 'GIVEUP' to quit") 
 
  move = input("> ") 
  move = move.upper() 
  move_monster(monster, steps)                                       LINE 93 
 
  if move == "GIVEUP": 
      print("Giving up, you wait sadly for the Beast to find you. It does, and makes a tasty meal of you...") 
      print("You lose.") 
      break 
 
  if move in moves: 
        player = move_player(player, move) 
  else: 
        print("Walls are hard, stop walking into them!") 
        continue 
  if player == door: 
    print("You narrowly escaped the beast and escaped") 
    print("You win!") 
    break 
  elif player == monster: 
    print("The beast found you!") 
    print("You lose!") 
    print("Game over") 
    break 
  # If it's a good move, change the player's position 
  # If it's a bad move, don't change anything 
  # If the new position is the door, they win! 
  # If the new positon is the Beast's, they lose!       
  # Otherwise, continue 

看起来像这样

|X|_|_|                                                                                                                      
|_|_|_|                                                                                                                      
|_|_|M|  where M is player and X is monster 

请您参考如下方法:

>>> monster = (2,3) 
>>> x,y=monster 
>>> x+=1 
>>> x, y 
(3, 3) 
>>> monster 
(2, 3) 

正如您在这里看到的,将怪物的位置分配给新变量并更改新变量并不会改变原始怪物的位置。将函数更改为不将步数作为参数(如 Mureinik 的回答中所述)后,您必须按照对玩家所做的方式移动怪物,方法是将代码更改为以下内容:

def move_monster(monster): 
  x, y = monster 
  moves = ['LEFT', 'RIGHT', 'UP', 'DOWN'] 
  steps = random.choice(moves) 
  if steps == 'LEFT': 
    y -= 1 
  elif steps == 'RIGHT': 
    y += 1 
  elif steps == 'UP': 
    x -= 1 
  elif steps == 'DOWN': 
    x +=1 
  return x,y 

和

monster = move_monster(monster)