Ben ama ben bunu yapıyorum fikir edinmenize yardımcı olamaz yanlış (Python, tekrar)

4 Cevap php

Python hakkında son zamanlarda sordunuz tüm sorular bu proje için olmuştur. Ben Python için çok yeniyim (ama PHP iyi biraz biliyorum) çünkü ben bu kadar çok soru soruyorum neden olmayabilir fark ve Python bazı doğal kusur vardır çünkü muhtemelen değildir var.

Böylece ben şimdi projenin ne diyecek ve benim şimdiki fikrim ne olduğunu ve Python sadece bu tür ile ilgili uygun olmadığını öğrenmek gerekir ya da bir kaç şey var ki, ben yanlış yapıyorum bana söyleyebilir ya proje ve dil XYZ bu durumda daha iyi olurdu ya da bazı açık kaynak projesi var, hatta ben içeri yer almak isteyebilirsiniz

The project
I run a free turn based strategy game (think the campaign mode from the total war series but with even more complexity and depth) and am creating a combat simulator for it (again, think total war as an idea of how it'd work). I'm in no way deluded enough to think that I'll ever make anything as good as the Total war games alone but I do think that I can automate a process that I currently do by hand.

What will it do
It will have to take into account a large range of variables for the units, equipment, training, weather, terrain and so on and so forth. I'm aware it's a big task and I plan to do it a piece at a time in my free time. I've zero budget but it's a hobby that I'm prepared to put time into (and have already).

My current stumbling block
In PHP everything can access everything else, "wrong" though some might consider this it's really really handy for this. If I have an array of equipment for use by the units, I can get hold of that array from anywhere. With Python I have to remake that array each time I import the relevant data file and this seems quite a silly solution for a language that from my experience is well thought out. I've put in a system of logging function calls and class creation (because I know from a very basic version of this that I did in PHP once that it'll help a lot down the line) and the way that I've kept the data in one place is to pass each of my classes an instance to my logging list, smells like a hack to me but it's the only way I've gotten it to work.

Dolayısıyla ben bir şey eksik ve onu çok vermek isteyen kimsenin fikir takdir ediyorum sonuçlandırmak. Teşekkür ederim.

Code samples

Bu oluşumlar bir listesini oluşturur kadar (adı yanında) tek değer var ama onlar yerine sadece standart bir liste daha sınıfların bir listesi konum neden daha hangi ekleyerek tahmin. Bu data.py içinde bulunan

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]

Ben kadar yapma gibi kazanılmış ettik ama ben aşağıdaki gibi bir kod görünümlü bir şey bekliyoruz, çünkü ben erişmek gerekir ediyorum ne zaman bir kod örneği yok:

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

Cihaz ana listede ilgili arazi, oluşumu ve etajer endeksi / anahtarına bağlanan bir tamsayı içerir. Geçici değişkenler 3 hat daha kısa yapmak için kullanılır ama ben bir tane almak için unutmak ve (günlük kullanışlı giriyor budur) hatalı olduğunu daha önceki bir değer kullanmak eğer uzun vadede muhtemelen sorunlara neden olur.

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

Birim sınıfı üzerinde bu kadar ilgili arazi endeksi (muhtemelen bir dize) ve içeri bulunuyor oluşumunu içerir

Belki bu (6 ay PHP 3 yıl vs) Python benim anlayış bazı büyük kusur gösterecektir.

4 Cevap

"Data.py listesini ben data.py almak gerekir ve remake dedi başka bir dosyadan Bu listeyi kullanmak için, bir dizi (iyi, liste) yaratır."

Senin bahsettiğini anlamaya olamaz. Cidden.

İşte verileri alır bir ana program, başka bir modül var.

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 )

Yani ana program bu gibi çalışır.

  1. import data. data modülü ithal edilmektedir.

    a. import theLoggerThing. Bu ne olursa olsun.

    b. class Formation( object ):. Bir sınıf oluşturma Formations.

    c. def createFormations( logger ):. Bir işlev oluşturun createFormations.

    d. formations =. Bir nesne oluşturmak, formations.

  2. import someOtherModule. someOtherModule ithal edilmektedir.

    a. import data. Hiçbir şey olmuyor. data küresel zaten mevcuttur. Etkili - - Bu ne için bir referans olan bir Singleton. Tüm Python modülleri Singletons.

    b. def function. Bir işlev oluşturun function.

  3. print data.formations['Arrowhead']. Bir sözlük nesnesi olan data.formations değerlendirin. Bazı sihirli arama yapar ve orada bulunan nesnesini döndürür sözlüğe bir get('Arrowhead') do (bir örneği Formation).

  4. someOtherModule.function().

    Ne bu fonksiyon değerlendirilmesi sırasında olur.

    a. print data.formations['Tight']. Bir sözlük nesnesi olan data.formations değerlendirin. Bazı sihirli arama yapar ve orada bulunan nesnesini döndürür sözlüğe bir get('Tight') do (bir örneği Formation).

With Python I have to remake that array each time I import the relevant data file

Burada Python semantik ince bir noktayı kaçırıyorsun. Eğer ikinci kez bir modülü aldığınızda, bu modülde kod yeniden çalıştırmak değildir. Adı ithal edilen tüm modüllerinin bir listesi bulunur, ve aynı modül size iade edilir. Yani modülü içe ikinci kez, (Python, liste söylemek, dizi söyleme) aynı listede bir başvuru alırsınız.

Muhtemelen bu içine karışık bir kaç Python yanlış var gibi görünüyor, ve bu kadar temizlenir kez basit bir zaman var olacak, daha fazla yardım almak için belirli kod örnekleri göndermek gerekir.

Ben senin sorunu aşağı daralmış var:

With Python I have to remake that array each time I import the relevant data file

Peki, gerçekten bellekte yapısını korumak için ilk ve en kolay iki seçeneğiniz var. Eğer "her yerde" den teorisi erişim bunu yapabilirsiniz (sadece PHP gibi) Bu şekilde, biraz Namespacing ile sınırlı, ancak kendi iyiliği için vardır. Bu "her yerde istiyoruz" olarak tercüme ederdim.

İkinci seçenek (var gibi bir veritabanı gibi, ya da veri dosyası) Bu veri almak hangi mağaza ve bazı veri soyutlama sahip olmaktır. Seferde belleğe sığdırmak için çok fazla veri olabilir bu, ilk tercihi daha iyi olabilir. Yine bu verileri almanın yolu "her yerde" sadece PHP gibi mevcut olacak.

Sen açık bir şekilde örneklerine doğrudan bunları geçebilir, ya söylemek için gitmek gibi, modül düzeyinde küresellerle kullanmak ve bunları gerektiğinde yerlere aktarabilirsiniz:

and the way that I've kept the data in one place is to pass each of my classes an instance to my logging list

Ben bu bir hack olmadığını size temin ederim. Bir yapılandırma nesnesi aynı şekilde kullanılabilir örn. eşzamanlı farklı yapılandırmaları ile uygulamayı test etmek isteyebilirsiniz gibi, kullanıma bağlı olarak, oldukça makul. Muhtemelen sadece hiç günlük bir şekilde istediğiniz gibi Günlüğü, sadece ithal ve denir ki bir modül düzeyi, küresel olarak daha uygun olabilir, ama yine kendi gereksinimlerine bağlıdır.

Ben Özetle sanırım, gerçekten doğru yolda. Eğer tamamen aşina olmayan dilleri kullanırken özellikle o "hackish" koku vermek için çalışın. Bir dilde bir hack başka altın standart olabilir. Ve tabii ki, proje ile iyi şanslar - eğlenceli geliyor.

Tekerleği yeniden icat etmeyin. Sizin formationsHash anahtar değerleri bir liste olarak yararlı değildir ve bir sözlük özelliklerini çoğaltır.

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

Size hiç iyi yapar beri aslında, getFormation gerek yoktur, unutmayın. Sadece böyle bir şey kullanabilirsiniz.

formations = createFormations( whatever )
f= formations[name]