2

私が最近Pythonについて尋ねた質問はすべて、このプロジェクトに関するものです。私がこれほど多くの質問をしている理由は、私がPythonに慣れていないためではなく(ただし、PHPについてはかなり知っています)、Pythonに固有の欠陥があるためではない可能性があることに気付きました。

したがって、プロジェクトとは何か、現在のアイデアは何かを説明します。すべて間違っているか、学ぶ必要のあることがいくつかあるか、Pythonはこのタイプの処理には適していないことを教えてください。この場合、プロジェクトと言語のXYZの方が優れているか、または私が関与したいと思うオープンソースプロジェクトがある場合でもそうです。

私がフリーターンベースの戦略ゲームを実行しているプロジェクト
(総力戦シリーズのキャンペーンモードを考えてみてくださいが、さらに複雑で深みがあります)、そのための戦闘シミュレーターを作成しています(繰り返しますが、総力戦はそれがどのようになるかについてのアイデアとして考えてください)仕事)。Total Warゲームだけで何でも作れると思うほど、私は決して惑わされていませんが、現在手作業で行っているプロセスを自動化できると思います。

何をする
のか ユニット、装備、トレーニング、天気、地形などのさまざまな変数を考慮に入れる必要があります。私はそれが大きな仕事であることを認識しており、私は自分の自由な時間に一度にそれを行うことを計画しています。予算はゼロですが、時間をかける準備ができている(そしてすでに持っている)のが趣味です。

私の現在のつまずき
PHPでは、すべてが他のすべてにアクセスできます。「間違っている」と考える人もいるかもしれませんが、これは本当に便利です。ユニットで使用する機器の配列があれば、どこからでもその配列を手に入れることができます。Pythonでは、関連するデータファイルをインポートするたびにその配列を再作成する必要があります。これは、私の経験からよく考えられている言語の非常にばかげた解決策のようです。ロギング関数呼び出しとクラス作成のシステムを導入しました(これの非常に基本的なバージョンから、PHPで一度行ったことは、将来的に非常に役立つことがわかっているためです)。 1つの場所のデータは、各クラスにインスタンスをログリストに渡すことです。これは、ハックのような匂いがしますが、それを機能させる唯一の方法です。

したがって、私は何かが欠けていると結論付け、それを喜んで提供してくれる人の洞察を非常に高く評価します。ありがとうございました。

コードサンプル

これにより、フォーメーションのリストが作成されます。これまでのところ、値は1つだけです(名前以外)が、さらに追加することを期待しています。これが、標準のリストではなく、クラスのリストである理由です。これは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)

ユニットには、関連する地形、フォーメーション、およびマスターリストにないもののインデックス/キーにリンクする整数が含まれています。一時変数は3行目を短くするために使用されますが、長期的には、取得するのを忘れて以前の値を使用すると問題が発生する可能性がありますが、これは正しくありません(ここでロギングが役立ちます)。

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

ユニットクラスには、それが存在する関連する地形とそれが存在するフォーメーションのインデックス(おそらく文字列)が含まれています。

たぶん、これは私のPythonの理解にいくつかの大きな欠陥を示すでしょう(6か月対PHPの3年)。

4

4 に答える 4

5

Python では、関連するデータ ファイルをインポートするたびにその配列を作り直す必要があります。

ここでは、Python セマンティクスの微妙な点が欠けています。モジュールを 2 回目にインポートするとき、そのモジュールのコードを再実行することはありません。名前は、インポートされたすべてのモジュールのリストにあり、同じモジュールが返されます。したがって、モジュールを 2 回目にインポートすると、同じリストへの参照が取得されます (Python では、配列とは言わず、リストと言ってください)。

より多くのヘルプを得るには、おそらく特定のコード サンプルを投稿する必要があります。これには、いくつかの Python の誤解が混在しているように思われます。

于 2009-01-01T17:03:41.027 に答える
3

私はあなたの問題を以下に絞り込みました:

Pythonでは、関連するデータファイルをインポートするたびにその配列を再作成する必要があります

実際には2つの選択肢があります。最初の最も簡単な方法は、構造をメモリに保持することです。そうすれば(PHPと同じように)理論的には「どこからでも」アクセスでき、名前空間によってわずかに制限されますが、それはあなた自身の利益のためです。それは「あなたがしたいところならどこでも」と訳されます。

2番目の選択肢は、データを格納してそこからデータを取得するデータ抽象化(データベースやデータファイルなど)を用意することです。一度にメモリに収めるにはデータが多すぎる可能性があるため、これは最初の選択肢よりも優れている場合があります。この場合も、このデータを取得する方法は、PHPと同じように「どこでも」利用できます。

これらを明示的にインスタンスに直接渡すか、モジュールレベルのグローバルを使用して、次のように必要な場所にインポートすることができます。

データを1つの場所に保持する方法は、各クラスにインスタンスをログリストに渡すことです。

これはハックではないことを保証できます。用途にもよりますが、非常に合理的です。たとえば、異なる構成を同時に使用してアプリケーションをテストしたい場合は、構成オブジェクトを同じように使用できます。ロギングは、インポートされて呼び出されるモジュールレベルのグローバルとして適している可能性があります。おそらく、ロギングの方法は1つしか必要ないためですが、これも要件によって異なります。

要約すると、あなたは本当に正しい方向に進んでいると思います。特に、まったく慣れていない言語を使用する場合は、その「ハックっぽい」匂いに屈しないようにしてください。ある言語でのハッキングは、別の言語ではゴールドスタンダードになる可能性があります。そしてもちろん、あなたのプロジェクトの幸運を祈ります-それは楽しそうですね。

于 2009-01-01T16:43:47.993 に答える
3

車輪を再発明しないでください。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]
于 2009-01-01T19:12:45.447 に答える
1

「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. これが何であれ。

    b. class Formation( object ):. クラスを作成しますFormations

    c. def createFormations( logger ):. 関数を作成しますcreateFormations

    d. formations =. オブジェクトを作成しますformations

  2. import someOtherModule. someOtherModuleがインポートされます。

    を。 import data. 何も起こりません。 dataすでに世界中で利用可能です。これは、実質的にSingletonとは何かへの参照です。すべての Python モジュールはSingletonです。

    b. def function. 関数を作成しますfunction

  3. print data.formations['Arrowhead']. data.formations辞書オブジェクトであるEvaluate 。ディクショナリに対してaget('Arrowhead')を実行して、魔法のようなルックアップを行い、そこにあるオブジェクト ( のインスタンスFormation) を返します。

  4. someOtherModule.function().

    この関数評価中に何が起こるか。

    を。print data.formations['Tight']. data.formations辞書オブジェクトであるEvaluate 。ディクショナリに対してaget('Tight')を実行して、魔法のようなルックアップを行い、そこにあるオブジェクト ( のインスタンスFormation) を返します。

于 2009-01-01T19:35:40.533 に答える