我如何让我的怪物移动?

时间:2016-06-14 17:13:25

标签: python nameerror

它说这个

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

2 个答案:

答案 0 :(得分:3)

>>> 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)

答案 1 :(得分:2)

steps传递给move_monster是没有意义的,因为你在第三行覆盖它,并且从不使用原始值。只需将其从函数的定义中删除:

def move_monster(monster):
  # here ---------------^
  x, y = monster
  moves = ['LEFT', 'RIGHT', 'UP', 'DOWN']
  steps = random.choice(moves) # steps is now a local variable
  if steps == 'LEFT':
    y -= 1
  elif steps == 'RIGHT':
    y += 1
  elif steps == 'UP':
    x -= 1
  elif steps == 'DOWN':
    x +=1  

当你调用函数时停止尝试传递它:

move_monster(monster)
# here -------------^