基于文本的游戏地图

时间:2015-04-30 01:04:18

标签: python

这应该制作一个基于文本的游戏的地图,这个游戏很有效,直到我向地图添加多个点,当我向它添加第二个点时,它会使地图​​的长度比所需的大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

1 个答案:

答案 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声明。
  • 您正在将numxnumyobjects[place][0]进行比较。您几乎肯定想将numyobjects[place][1]进行比较。一次完成所有这一切的好方法是:if objects[place][:2] == [numx, numy]:
  • 您的numxnumy是基于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)