Форум сайта python.su
0
Здравствуйте.
Лутца прочитал, но видимо что-то недопонял
Предположим у меня есть программа в которой определена функция loadlevel(). Есть так же модуль player, который импортируется в основную программу. В модуле player проверяется проверка на столкновение. Если игрок “сталкивается” с телепортом - надо вызвать функцию loadlevel().
Сам вопрос:можно ли делать перекрестный импорт (импортить плеер в мейн и мейн в плеер)? понятно что это костыль, но не сломает ли он чего-нибудь (одинаковых переменных, например, нет) (очевидно что нет)
Как это должно выглядеть красиво? У меня уже игра на 8 модулей, хотя функций всего ничего. Похоже придется сгружать все общие функции в отдельные модули?
Второй вопрос (появился после решения первого вопроса костылем)
Есть два игровых уровня. Игрок находился на первом, необходимо загрузить второй уровень, а значит очистить список стен. Список стен в главном модуле blocks. Вызываю функцию loadlevel из модуля, в ней прописываю global blocks и изменяю этот список. Но список не изменяется. Т.е. внутри самой функции он изменился, а список в основном коде программы нет. Пытался изменять список с припиской имени модуля - main.blocks - тоже не вышло. Можно сделать чтобы вызов функции возвращал новый список, но мне необходимы еще координаты героя и другие переменные - получается очень много и некрасиво. Подскажите как сделать правильно.
Небольшой пример иллюстрирующий второй случай:
test.py
import test2
x = ()
print x
test2.n()
print x
x = test2.x
print x
test2.py
def n():
test.x = (5,4)
второй случай заработал, хотя наверное будет правильным копировать данные, а не указывать их на один объект (приравнивать)
Отредактировано Kongfu (Дек. 19, 2013 23:20:57)
Офлайн
221
Kongfu
а вы не думали что подобные вещи решаются просто - использованием классов?
Офлайн
58
Действительно. Классы решат все Ваши проблемы. Лутца, может вы и прочитали, но понять - пока не поняли 
P.S. Если действительно непонятен механизм использования классов да и вообще объектно -ориентированная концепция, то я рекомендую почитать что-нибуть именно по ней. Я читал Буч Г. “Объектно-ориентированный анализ и проектирование с примерами приложений”, хотя сейчас уже наверное книг по этой теме навалом…
Офлайн
0
Но я не могу в модуле ребенка, изменить родительскую переменную, ведь так?
В частности не получается изменить координаты игрока (написан классом), не возвращая значения из функции второго модуля в главный
Офлайн
58
Я не понимаю Вашу терминологию. Что понимается под родителем, а что под ребенком?
Офлайн
0
Родитель - главный модуль, куда импортируется побочный
Ребенок - импортируемый модуль
В первом посте родитель это test.py, ребенок это test2.py
Офлайн
58
Причем здесь импорт? Мы говорим о классах. Вам же выше уже написали.
Импортировать можно один модуль. Там может быть множество классов.
Классы являются объектами и обладают своими методами и атрибутами. Именно обращаясь к атрибутами и использую методы объектов можно строить логику выполнения программы…
А зачем импортируемому модулю изменять параметра модуля, который его импортирует. Как Вы вообще себе такое поведение представляете. Нужно четко разграничить задачи. Храните данные, которые касаются многих модулей и могут менятся многими модулями в базе. Существует множество параметров для оценки рациональности создания класса. Один из них: связанность (сила связей между отдельными компонентами). Сильная связанность усложняет программу, так как сильно связанные модули сложнее поддерживать и модифицировать. А вы как раз хотите все жестко связать.
Еще есть связность, достаточность, полнота, элементарность.
Отредактировано 4kpt_II (Дек. 19, 2013 23:37:38)
Офлайн
0
Это ВЫ говорите о классах. А я говорю про интеграцию модулей. Вот моя ситуация:
main.py
Class Player(object): # класс героя
def __init__(self,x,y):
self.x = x
self.y = y
hero = Player(5,5) # создаю героя с координатами
загружаю уровень 1, в нем:
collision = ( (1,1), (1,2), (3,3) ) # непроходимые стены
#герой доходит до портала на другой уровень. Необходимо перерисовать карту, “телепортировать” героя (изменить его координаты) и переписать список столкновений. Функция загрузки карты у меня в модуле loadlevel.py
import loadlevel.py
def loadlvl():
x = 10
y = 15
collision = ( (2,1), (1,3) )
эти значения надо передать в файл main.py, чтобы изменить координаты игрока и список столкновений. Как это сделать кроме использования return x,y, collision ?
В процессе написания этого пришло осознание - можно написать класс уровня в дополнительном модуле, создать объект класса в основном и изменять его переменные с помощью методов класса.
Спасибо за помощь
Отредактировано Kongfu (Дек. 20, 2013 02:30:02)
Офлайн
221
Есть такое выражение “Каждый веб-програмист хотя бы раз пытался написать свою CMS”, которое перенося на программистов могла бы звучать так: “Каждый программист хотя бы раз пытался написать свою игру”. У меня было аж 2 опыта забавы ради.
Kongfu. Я об этом вам и намекал, область видимости это лишь повод что бы понять о том что ВСЕ такие вещи делаются на классах из за их возможностей по налаживанию взаимосвязей между объектами. Сделать что то серьезное исключительно на скриптах в стиле функционального программирования могут только прокаченные прогеры, потому что они точно знают что делают. А вы, я предсказываю, десятки раз переделаете код и в итоге он будет ничем не похож на текущий. Причем речь не идет о непосредственно коде (Class как объявление класса уже синтаксическая ошибка), а я говорю об архитектурно-структурной основе проекта.
В процессе написания этого пришло осознание - можно написать класс уровня в дополнительном модуле, создать объект класса в основном и изменять его переменные с помощью методов класса.
Офлайн
Черт возьми, ну если хочется так, то переменные, которые нужны из вне, в теле функции объявляйте global и обращайтесь к ним через имя модуля (из другого модуля).
Офлайн