Я не могу не понять, что я все делаю неправильно (снова Python) - PullRequest
2 голосов
/ 01 января 2009

Все вопросы, которые я недавно задавал о Python, были для этого проекта. Я понял, что причина, по которой я задаю так много вопросов, может быть не в том, что я новичок в Python (но я немного знаю PHP), и, вероятно, не потому, что у Python есть свойственный недостаток.

Таким образом, я сейчас скажу, что это за проект и какова моя текущая идея, и вы можете либо сказать мне, что я все делаю неправильно, что есть некоторые вещи, которые мне нужно изучить, или что Python просто не подходит для решения с этим типом проекта и языком XYZ будет лучше в этом случае, или даже если есть какой-то проект с открытым исходным кодом, в который я мог бы захотеть принять участие.

Проект
Я запускаю бесплатную пошаговую стратегическую игру (подумайте о режиме кампании из серии полных войн, но с еще большей сложностью и глубиной) и создаю для нее боевой симулятор (опять же, думаю, что тотальная война - это идея того, как она будет работать) , Я ни в коем случае не заблуждаюсь настолько, чтобы думать, что когда-нибудь сделаю что-то столь же хорошее, как только игры Total war, но я думаю, что смогу автоматизировать процесс, который я сейчас выполняю вручную.

Что это будет делать
Он должен будет учитывать широкий диапазон переменных для юнитов, оборудования, обучения, погоды, местности и т. Д. И т. Д. Я знаю, что это большая задача, и я планирую делать это по частям в свободное время. У меня нулевой бюджет, но это хобби, в которое я готов потратить время (и уже успел).

Мой нынешний камень преткновения
В PHP все может получить доступ ко всему остальному, «неправильно», хотя некоторые могут подумать, что это действительно очень удобно для этого. Если у меня есть массив оборудования для использования юнитами, я могу получить этот массив из любой точки мира. В Python мне приходится переделывать этот массив каждый раз, когда я импортирую соответствующий файл данных, и это кажется довольно глупым решением для языка, который по моему опыту хорошо продуман. Я включил систему регистрации вызовов функций и создания классов (потому что я знаю из очень простой версии этого, которую я сделал в PHP однажды, что это очень поможет в дальнейшем) и способ, которым я продолжал данные в одном месте должны передать каждый из моих классов по одному экземпляру в мой список журналов, пахнет для меня как хак, но это единственный способ, которым я заставил его работать.

Таким образом, я пришел к выводу, что что-то упустил и был бы очень признателен за понимание каждого, кто готов это дать. Спасибо.

Примеры кода

Это создает список образований, так что пока есть только одно значение (помимо имени), но я ожидаю добавить больше, поэтому они представляют собой список классов, а не просто стандартный список. Это найдено в data.py

formations = []
formationsHash = []
def createFormations(logger):
    """This creates all the formations that will be used"""

    # Standard close quarter formation, maximum number of people per square metre
    formationsHash.append('Tight')
    formations.append(Formation(logger, 'Tight', tightness = 1))

    # Standard ranged combat formation, good people per square metre but not too cramped
    formationsHash.append('Loose')
    formations.append(Formation(logger, 'Loose', tightness = 0.5))

    # Standard skirmishing formation, very good for moving around terrain and avoiding missile fire
    formationsHash.append('Skirmish')
    formations.append(Formation(logger, 'Skirmish', tightness = 0.1))

    # Very unflexible but good for charges
    formationsHash.append('Arrowhead')
    formations.append(Formation(logger, 'Arrowhead', tightness = 1))


def getFormation(searchFor):
    """Returns the fomation object with this name"""
    indexValue = formationsHash.index(searchFor)
    return formations[indexValue]

У меня нет примера кода, когда мне нужно было бы получить к нему доступ, потому что я не успел сделать это, но я ожидаю, что код будет выглядеть примерно так:

Python
tempFormation = data.getFormation(unit.formationType)
tempTerrain = data.getTerrain(unit.currentTerrain)
unit.attackDamage = unit.attackDamage * tempTerrain.tighnessBonus(tempFormation.tightness)

Блок содержит целое число, которое ссылается на индекс / ключ соответствующей местности, формации и еще много чего в основном списке. Временные переменные используются для того, чтобы сделать третью строку короче, но в долгосрочной перспективе, возможно, возникнут проблемы, если я забуду получить такую, и она использует значение, которое было ранее, а затем неверно (вот где регистрация полезна).

PHP
$unit->attackDamage *= $terrain[$unit->currentTerrain]->tighnessBonus($unit->currentTerrain)

Класс юнитов содержит индекс (вероятно, строку) соответствующей местности, на которой он находится, и формацию, в которой он находится.

Может быть, это покажет некоторые серьезные недостатки в моем понимании Python (6 месяцев против 3 лет PHP).

Ответы [ 4 ]

5 голосов
/ 01 января 2009

С Python я должен переделать это массив каждый раз, когда я импортирую соответствующий файл данных

Здесь вам не хватает тонкой точки семантики Python. Когда вы импортируете модуль во второй раз, вы не выполняете повторно код в этом модуле. Имя найдено в списке всех импортированных модулей, и тот же модуль возвращается вам. Таким образом, во второй раз, когда вы импортируете свой модуль, вы получите ссылку на тот же список (в Python, не говорите массив, говорите список).

Вам, вероятно, понадобится опубликовать конкретные примеры кода, чтобы получить больше помощи, кажется, что в это смешано несколько заблуждений Python, и как только они будут прояснены, у вас будет более простое время.

3 голосов
/ 01 января 2009

Пожалуйста, не изобретайте велосипед. Ваш formationsHash как список ключевых значений бесполезен, и он дублирует функции словаря.

def createFormations(logger):
    """This creates all the formations that will be used"""
    formations = {}
    formations['Tight']= Formation(logger, 'Tight', tightness = 1)
    formations['Loose']= Formation(logger, 'Loose', tightness = 0.5)
    formations['Skirmish']= Formation(logger, 'Skirmish', tightness = 0.1)
    formations['Arrowhead']= Formation(logger, 'Arrowhead', tightness = 1)
    return formations

Обратите внимание, вам на самом деле не нужно getFormation, так как это не приносит вам пользы. Вы можете просто использовать что-то вроде этого.

formations = createFormations( whatever )
f= formations[name]
3 голосов
/ 01 января 2009

Я сузил вашу проблему до:

С Python я должен переделать это массив каждый раз, когда я импортирую соответствующий файл данных

Ну, у вас действительно есть два варианта, первый и самый простой - сохранить структуру в памяти. Таким образом (как и в PHP) вы теоретически можете получить к нему доступ из любого места, вы немного ограничены пространством имен, но это для вашего же блага. Это будет переводиться как «где угодно».

Второй вариант - иметь некоторую абстракцию данных (например, базу данных или файл данных, который у вас есть), в котором хранятся и извлекаются данные из этого. Это может быть лучше, чем первый вариант, поскольку у вас может быть слишком много данных, чтобы поместиться в память одновременно. Опять же, способ получения этих данных будет доступен «где угодно», как и PHP.

Вы можете либо явно передавать эти вещи непосредственно экземплярам, ​​либо использовать глобалы уровня модуля и импортировать их в места, где они вам нужны, как вы говорите:

и способ хранения данных в одно место, чтобы передать каждый из моих классифицирует экземпляр в моем списке регистрации

Я могу заверить вас, что это не хак. Это вполне разумно, в зависимости от использования, например, объект конфигурации может использоваться одинаково, так как вы можете захотеть протестировать ваше приложение с одновременными различными конфигурациями. Ведение журнала может лучше подходить для глобального уровня на уровне модуля, который просто импортируется и вызывается, поскольку вам, вероятно, нужен только один способ ведения журнала, но опять же, это зависит от ваших требований.

Полагаю, вы действительно на правильном пути. Старайтесь не поддаваться этому "хакерскому" запаху, особенно когда используете языки, с которыми вы не совсем знакомы. Взлом на одном языке может быть золотым стандартом на другом. И, конечно же, удачи в вашем проекте - это звучит весело.

1 голос
/ 01 января 2009

"data.py создает массив (ну, список), чтобы использовать этот список из другого файла, мне нужно импортировать data.py и переделать указанный список."

Я не могу понять, о чем ты говоришь. Серьезно.

Вот основная программа, которая импортирует данные, и другой модуль.

SomeMainProgram.py

import data
import someOtherModule

print data.formations['Arrowhead']
someOtherModule.function()

someOtherModule.py

import data
def function():
    print data.formations['Tight']

data.py

import theLoggerThing
class Formation( object ):
    pass # details omitted.
def createFormations( logger ):
    pass # details omitted
formations= createFormations( theLoggerThing.logger )

Итак, основная программа работает следующим образом.

  1. import data. Модуль data импортируется.

    а. import theLoggerThing. Что бы это ни было.

    б. class Formation( object ):. Создать класс Formations.

    с. def createFormations( logger ):. Создать функцию createFormations.

    * * +1034 д. formations =. Создайте объект, formations.
  2. import someOtherModule. someOtherModule импортируется.

    а. import data. Ничего не произошло. data уже доступен во всем мире. Это ссылка на то, что, по сути, является Singleton . Все модули Python Singletons .

    б. def function. Создать функцию function.

  3. print data.formations['Arrowhead']. Оцените data.formations, который является объектом словаря. Выполните get('Arrowhead') в словаре, который выполняет магический поиск и возвращает найденный там объект (экземпляр Formation).

  4. someOtherModule.function().

    Что происходит во время оценки этой функции.

    а. print data.formations['Tight']. Оцените data.formations, который является объектом словаря. Выполните get('Tight') в словаре, который выполняет магический поиск и возвращает найденный там объект (экземпляр Formation).

...