python-3.x - 跨多维数组、基于文本的游戏的“移动”问题
问题描述
我目前正在处理代码以解决一些运动问题。理想情况下,我希望能够将角色移动到包含“”的数组(世界地图)中的任何位置,并用“P”标记玩家的位置。
我不知道我遇到的问题是什么,我遇到的一些问题如下...... - 当我移动 E 时,它总是进入 worldMap[3][3] - N 只向上移动从 worldMap[3][x] 到 worldMap [2][x] - S 不起作用
以下是我当前的代码...
import math
import random
import sys
import os
import time
gameplay= True
#world map lay out, X--> wall, player can't go that way. ' ', possible area for player to move, 'P', player indicator.
worldMap = [['X','X','X','X','X'],
['X',' ',' ',' ','X'],
['X',' ',' ',' ','X'],
['X','P',' ',' ','X'],
['X','X','X','X','X']]
west=str("w" or "W")
east=str("e" or "E")
north=str('n' or 'N')
south=str('s' or 'S')
for row in worldMap:
for column in row:
print(column, end=' ')
print()
while gameplay == True:
x=str((input("\nWhat direction would you like to move?\n ")))
if x==west:
for row in worldMap:
for i, column in enumerate(row):
if column == 'P':
if((i>0) and (i<4) and row[i-1]) == ' ':
row[i-1] = 'P'
row[i]=' '
else:
print("\nCan't do that.\n")
for row in worldMap:
for column in row:
print(column, end=' ')
print()
elif x==east:
for row in worldMap:
for i, column in enumerate(row):
if column == 'P':
if((i>0) and (i<4) and row[i+1]) == ' ':
row[i+1] = 'P'
row[i]=' '
else:
print("\nCan't do that.\n")
for row in worldMap:
for column in row:
print(column, end=' ')
print()
elif x == north: #move north
for column in worldMap:
for i, row in enumerate(column):
if row == 'P':
if((i>0) and (i<4) and column[i-1]) == ' ':
column[i-1] = 'P'
column[i]=' '
else:
print("\nCan't do that.\n")
for row in worldMap:
for column in row:
print(column, end=' ')
print()
elif x== south: #move south
for column in worldMap:
for i, row in enumerate(column):
if column == 'P':
if((i>0) and (i<4) and column[i+1]) == ' ':
column[i+1] = 'P'
column[i]=' '
else:
print("\nCan't do that.\n")
for row in worldMap:
for column in row:
print(column, end=' ')
print()
else:
for row in worldMap:
for column in row:
print(column, end=' ')
print()
print("\nCan't do that.\n")
解决方案
我已经调整了你的代码。需要重构代码的一个很好的线索是,如果你在代码中写了很多相同的东西。在这些情况下,最好编写一个函数,然后从您的代码中调用该函数。下面的代码只是一个示例,可帮助您走上正确的道路。
在这个例子中,我没有为玩家扫描整个地图,而是跟踪玩家的位置并计算新的位置,如果它是一个空间,然后移动玩家。我们可以通过在玩家的 x 或 y 坐标上加或减 1 来轻松移动玩家。
我还清理了打印地图功能,现在它只在每个循环开始时调用。
from random import randint
def generate_map(size):
# world map lay out, X--> wall, player can't go that way. ' ', possible area for player to move, 'P', player indicator.
world_map = [[wall for _ in range(size)]]
for i in range(1, size - 1):
world_map.append([wall])
for j in range(1, size - 1):
#generate random walls in our map (currently set to genearete spaces 90% of the time
if randint(1,100) < 90:
world_map[i].append(space)
else:
world_map[i].append(wall)
world_map[i].append(wall)
world_map.append([wall for _ in range(size)])
return world_map
def print_map():
for row in worldMap:
print(" ".join(row))
def move_player():
x, y = player_position
if direction == "W":
y -= 1
elif direction == "E":
y += 1
elif direction == "N":
x -= 1
elif direction == "S":
x += 1
if worldMap[x][y] == space:
worldMap[player_position[0]][player_position[1]] = space
worldMap[x][y] = player
player_position[0] = x
player_position[1] = y
else:
print("Cannot more there")
#Genearte a map and position the player
wall, space, player = "X", " ", "P"
map_size = 10
worldMap = generate_map(map_size)
player_position = [1, 1]
worldMap[player_position[0]][player_position[1]] = player
#Run the game
gameplay = True
while gameplay:
print_map()
direction = input("\nWhat direction would you like to move? ").upper()
if direction:
move_player()
else:
break
推荐阅读
- ethereum - 如何存储要在智能合约中使用的数据?
- magento2 - 前端显示的产品图片错误,而不是后端 magento 2.3 中上传的产品图片
- sql - 向 h2 列添加唯一的、不区分大小写的索引
- html - VBA Excel,Selenium - 循环遍历单选按钮值以查找所选值并打印它
- java - TestContainers SQL 连接数过多异常
- python - Zapier 代码:Python,生成 CSV 字符串
- sqlalchemy - 使用 SQLAlchemy 迁移数据库
- ansible - ansible-playbook 中的 yml 语法不正确
- swift - 活动编译条件不起作用
- java - java 无法为标签 fmt:bundle 加载标签处理程序类