它说这个
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
答案 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 -------------^