2010-11-19 39 views
0

Python'da haydut benzeri bir oyun yazıyorum ve benim Tile sınıfımı tanımlarım var. Bir kiremit bloke edilebilir, duvar veya zemin olabilir. Ben (ama üç değerlerle) Eğer bir boolean nasıl kullanacağını benzerPython Kullanıcı Tanımlı Veri Türü

self.state = Blocked 

çizgisinde bir şey yazabilmek istiyorum.

Bunu yapmamı sağlayacak bir veri türü tanımlamanın iyi bir yolu var mı?

Teşekkür

cevap

4

üç sabitleri için, ben enum 'desen' paketinin açılması versiyonunu kullanır: olsa bundan daha karmaşık alırsa

Blocked, Wall, Floor = range(3) 

, başka enum types in python bir göz olurdu .

+2

Python 3'te tuple (aralık (3)) kullanılmasına gerek yoktur, bir jeneratöre ince ayar yapılması (sadece test ettim). –

+0

@Chris, teşekkürler. sabit. – aaronasterling

0
class State: 
    Blocked=1 
    Wall=2 
    Floor=3 

some = State.Blocked 
+0

[Üçüncü cevap] 'ın ikinci versiyonu (http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python/1695250#1695250) __way__ daha iyi IMO. Bu aynı sonuçla biter ama çok daha az hata eğilimli. – aaronasterling

0

Bit bayrakları kullanın. Daha fazla bilgi için, en basit terimlerle, Boolean değerlerini ikili formda saklayabilirsiniz, çünkü True/False, 4 farklı Boolean'ı saklamak için 4 bit veya 1 bayt yapabilirsiniz.

Yani şöyle diyelim:

piton sözdizimi:
a = 0x0 # [Bu biraz bayrağı veya ikili sayı <class 'int'> ait piton temsilidir veya python27 içinde <type 'int'>]

ikili gösterimi:
0x0 = 000 [sıfır sıfır ikili değişkenin ne kadar uzun olduğu önemli değil]
0x1 = 001 [1]
0x2 = 010 [2]
0x4 = 100 [4] işte
biz 000000000001 == 001 == 01 == beri kontrol edebilmemiz 3 veya daha fazla farklı Boole yerleri var

ama biraz bayrakları 0x1
0x3 = 011 [3 = 2 + 1]
0x5 = 101 [5 = 4 + 1]
0x6 = 110 [6 = 4 + 2]
0x7 = 111 [7 = 4 + 2 + 1]

IN EN SIMPLEST TERMS Size bir karşılaştırma sözdizimi verecektir & VEYA anlamına gelir, yani '1' bit bayrağının yeri aynı olmalıdır. 001 & 010 Eğer bit bayrağı iki tip kontrol etmek istiyorsanız bu yüzden sadece onları toplayalım ve kontrol aynı yerde

yılında '1' olmadığı için Yani pratik açıdan 0x1 & 0x2 == 0x2 Yanlış olacak yukarıda sözdizimi ile.
örnek: 0x3&(0x1+0x2)==(0x1+0x2)

Umarım bu yardımcı olur. Mutlu googling.

İlgili konular