2010-11-19 11 views
0

私はPythonで不正なゲームを作成していて、私のTileクラスを定義しています。タイルはブロック、壁または床のいずれかにすることができます。私は(が、3つの値を持つ)を使用すると、ブール値を使用する方法に類似しPythonユーザー定義データ型

self.state = Blocked 

の線に沿って何かを書くことができるようにしたいと思います。

私にこれを可能にするためにデータ型を定義する良い方法がありますか?

おかげ

答えて

4

3つの定数については、私は列挙型「パターン」の開梱版使用します。それはしかしそれよりもっと複雑取得した場合

Blocked, Wall, Floor = range(3) 

を、私は他のenum types in pythonを見てしまいます。

+2

Python 3でタプル(range(3))を使う必要はありません - ジェネレータへのタプル割り当てはうまく動作します(私はそれをテストしました)。 –

+0

@Chris、ありがとう。一定。 – aaronasterling

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

some = State.Blocked 
+0

[第3の回答](http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python/1695250#1695250)の2番目のバージョンは__way__が優れていますIMO。それはこの結果と同じ結果に終わりますが、エラーが起こりにくいです。 – aaronasterling

0

ビットフラグを使用します。 True/Falseは4ビットまたは1バイトに4つのブーリアンを格納できる1ビットなので、簡単な言葉でブール値をバイナリ形式で保存することができます。

したがって、このようにそれをしましょう:

のPython構文:
a = 0x0#[これはビットフラグまたはバイナリ数<class 'int'>またはpython27 <type 'int'>でのPythonの表現である]

バイナリ表現:
は0x0 = 000 [0はゼロです。バイナリ変数の長さは関係ありません]
0x1 = 001 [1]
0x2 = 010 [2]
を0x4 = 100 [4]ので、ここ
我々000000000001 == 001 == 01 ==ので、我々は確認することができる3つの以上の異なるブール場所を有する

が、ビット・フラグに0x1の
0x3 = 011 [3 = 2 + 1]
0x5 = 101 [5 = 4 + 1]
0x6に= 110 [6 = 4 + 2]
0x7の= 111 [7 = 4 + 2 + 1]

ほとんどの簡単な用語 私は1つの比較構文&を意味します。これはANDを意味します。つまり、ビットフラグの '1'の場所は同じでなければなりません。 001 & 010を使用して、ビットフラグに2種類をチェックしたい場合は、単にそれらを一緒に追加して、チェックしそう同じ場所に「1」

を持っていないので、だから、実用的な観点からの0x1の&を0x2に== 0x2のは、Falseになります上記の構文で。
例:0x3&(0x1+0x2)==(0x1+0x2)

これが役立ちます。ハッピーグーグル。

関連する問題