簡體   English   中英

如何使怪物移動?

[英]How do I make my monster move?

這樣說

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)

沒有必要傳遞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 -------------^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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