这样说

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)

10-04 20:48