Прежде всего, я должен объяснить, что я пытаюсь сделать в первую очередь.
Я создаю игру, похожую на подземелья, и пытаюсь запрограммировать движение компьютерных персонажей / монстров на карте. Карта в основном является декартовой координатной сеткой.
Расположение символов представлено кортежами значений x и y (x, y).
Игра работает по очереди, и в свою очередь персонаж может двигаться только вверх, вниз, влево или вправо на 1 пробел. Я создаю очень простую систему движений, в которой персонаж будет просто принимать решения, чтобы двигаться по очереди. По сути, «забывчивая» система движений.
Основная блок-схема того, что я собираюсь сделать:
- Найти направление к месту назначения
- Составьте список приоритетов движений, которые должны быть выполнены, используя направление, например, («r», «u», «d», «l») означает, что он будет пытаться сначала двигаться вправо, затем вверх, затем вниз, затем влево.
- Попробуйте каждую из возможностей, следующих за порядком приоритетов. Если первое движение не удается (заблокировано препятствием и т. Д.), Оно будет последовательно пробовать движения до первого успешного движения, затем оно остановится.
На шаге 3 я пытаюсь это сделать так:
def move(direction,location):
try:
-snip- # Tries to move, raises the exception Movementerror if cannot move in the direction
return 1 # Indicates movement successful
except Movementerror:
return 0 # Indicates movement unsuccessful (thus character has not moved yet)
prioritylist = ('r','u','d','l')
if move('r',location): pass
elif move('u',location): pass
elif move('d',location): pass
elif move('l',location): pass
else: pass
В блоке if / else программа попытается выполнить первое перемещение по приоритету в списке приоритетов. В функции перемещения персонаж будет пытаться двигаться. Если персонаж не заблокирован и движется, он возвращает 1, что приводит к проходу, на котором он остановится. Если персонаж заблокирован, он возвращает 0, затем он пытается следующее движение.
Однако это приводит к двум проблемам:
1.Как мне отредактировать переменную, переданную в функцию внутри самой функции, при возврате, если редактирование прошло успешно?
Мне сказали, что вы не можете редактировать переменную внутри функции, так как она не изменит значения переменной, она просто заставляет переменную внутри функции ссылаться на что-то другое, в то время как исходная переменная остается неизменной. Таким образом, решение состоит в том, чтобы вернуть значение и затем присвоить переменную возвращаемому значению. Однако я хочу, чтобы он возвращал другое значение, указывающее, успешно ли выполнено это редактирование, поэтому я хочу отредактировать эту переменную внутри самой функции. Как мне это сделать?
2.Как изменить порядок операторов if / else, чтобы они соответствовали порядку списка приоритетов? Он должен быть в состоянии изменить во время выполнения, так как список приоритетов может измениться, что приведет к изменению порядка перемещения.