这应该制作一个基于文本的游戏的地图,这个游戏很有效,直到我向地图添加多个点,当我向它添加第二个点时,它会使地图的长度比所需的大2倍
这是2分
的例子mapS = [5,5] ##Size of the map
line = ""
objects = dict()
numx = 0
numy = 0
def mapSize(x,y):
mapS = [x,y]
def addObject(name, x, y, symbol):
globals()[name] = [x,y, symbol]
objects[name] = [x,y, symbol]
addObject("House", 2,3, "H") ##############FIRST POINT
addObject("Cabin", 3,4, "C") ##############SECOND POINT
for y in range(mapS[1]):
numy += 1
for x in range(mapS[0]):
numx += 1
for place in objects:
if objects[place][0] == numx:
if objects[place][1] == numy:
line += objects[place][2]
else:
line += "*"
else:
line += "*"
print(line)
line =""
numx = 0
numy = 0
答案 0 :(得分:0)
实际问题是,对于每个y
和每个x
,您为每个对象打印一个字符:
for y in range(mapS[1]):
numy += 1
for x in range(mapS[0]):
numx += 1
for place in objects:
if objects[place][0] == numx:
if objects[place][0] == numy:
line += objects[place][2]
else:
line += "*"
else:
line += "*"
所以,如果你有2个对象,你将在每个x,y点打印2个字符;如果你有6个对象,你将在每个x,y点打印6个字符。
您要做的只是在每个x,y点打印1个字符。例如:
for y in range(mapS[1]):
numy += 1
for x in range(mapS[0]):
numx += 1
for place in objects:
if objects[place][0] == numx and objects[place][0] == numy:
line += objects[place][2]
break
else:
line += "*"
这会遍历对象,直到找到第一个与该位置匹配的对象,并仅添加该对象的角色,并停止使用break
进行搜索。然后,只有当它在没有break
的情况下到达循环的末尾时(这是else
语句中的for
子句意味着),它才会添加*
。
您还有其他一些问题:
mapSize
实际上并没有改变mapS
;你需要一个global mapS
声明。numx
和numy
与objects[place][0]
进行比较。您几乎肯定想将numy
与objects[place][1]
进行比较。一次完成所有这一切的好方法是:if objects[place][:2] == [numx, numy]:
。numx
和numy
是基于1的。你想要那个吗?如果是这样的话,它会使你的意图更明确 - 而且更简单 - 只需使用numx == x+1
而不是跟x
分开跟踪它,但总是以同样的方式跟踪它为x+1
。如果没有,请使用x
本身。globals()[name] =
是一个坏主意。由于您没有使用它,最简单的方法是删除该行。line
之类的东西要简单得多,而不是在循环外部创建它们,然后在循环的底部重新创建它们。所以,把它们放在一起:
mapS = [5, 5]
objects = {}
def mapSize(x, y):
global mapS
mapS = [x, y]
def addObject(name, x, y, symbol):
objects[name] = [x, y, symbol]
addObject("House", 2, 3, "H") ##############FIRST POINT
addObject("Cabin", 3, 4, "C") ##############SECOND POINT
for y in range(mapS[1]):
line = ""
numy = y+1
for x in range(mapS[0]):
numx = x + 1
for place in objects:
if objects[place][:2] == [numx, numy]:
line += objects[place][2]
break
else:
line += "*"
print(line)