2015-04-30 3 views
0

это должно сделать карту для текстовой игры, которая отлично работает, пока я не добавлю несколько точек к карте, когда добавлю к ней вторую точку, она делает длину карты 2x больше, чем нужноКарта для текстовой игры

это пример с 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

Я сомневаюсь, что это ваша проблема, но с помощью 'глобалам()', как это очень плохая идея. Если вам нужен глобальный словарь вещей, к которым можно получить доступ по имени, просто создайте глобальный словарь, например 'd = {}', и сделайте 'd [name] =' вместо 'globals() [name] ='. Единственная причина когда-либо нажимать на глобальные переменные - это когда у вас есть код, который должен получить к ним доступ статически и другой код, который должен получить доступ к ним динамически. – abarnert

+0

Между тем ваша функция 'mapSize' ничего не делает; он создает локальную переменную с именем «mapS», которая временно скрывает глобальное имя с тем же именем, а затем сразу же выходит и локальное уходит. Если вы хотите переназначить глобальную переменную изнутри функции, вам понадобится инструкция 'global mapS'. – abarnert

+0

Я пробовал, и ничего не изменилось. – user3666755

ответ

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 объекта, вы будете печатать 2 символа в каждой точке x, y; если у вас есть 6 объектов, вы будете печатать 6 символов в каждой точке x, y.

Что вы хотите сделать, это только напечатать 1 символ в каждой точке x, y. Например:

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 ing (это то, что означает пункт 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) 
+0

Спасибо! Работает как шарм! – user3666755

Смежные вопросы