Реальная проблема заключается в том, что для каждого 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)
Я сомневаюсь, что это ваша проблема, но с помощью 'глобалам()', как это очень плохая идея. Если вам нужен глобальный словарь вещей, к которым можно получить доступ по имени, просто создайте глобальный словарь, например 'd = {}', и сделайте 'd [name] =' вместо 'globals() [name] ='. Единственная причина когда-либо нажимать на глобальные переменные - это когда у вас есть код, который должен получить к ним доступ статически и другой код, который должен получить доступ к ним динамически. – abarnert
Между тем ваша функция 'mapSize' ничего не делает; он создает локальную переменную с именем «mapS», которая временно скрывает глобальное имя с тем же именем, а затем сразу же выходит и локальное уходит. Если вы хотите переназначить глобальную переменную изнутри функции, вам понадобится инструкция 'global mapS'. – abarnert
Я пробовал, и ничего не изменилось. – user3666755