2010-11-19 132 views
0

我正在用Python编写一个类似流氓的游戏,并且正在定义我的Tile类。瓷砖可以被阻挡,墙壁或地板。我想能够写一些东西沿线Python用户定义的数据类型

self.state = Blocked 

类似于你将如何使用布尔(但有三个值)。

有没有一种很好的方式让我定义一种数据类型,使我能够做到这一点?

感谢

回答

4

对于三个常量,我会用枚举“模式”解包版本:

Blocked, Wall, Floor = range(3) 

如果它变得比这更复杂,虽然,我会看看其他enum types in python

+2

在Python 3中不需要使用元组(范围(3)) - 对生成器的元组赋值工作正常(我刚测试过)。 – 2010-11-19 12:55:43

+0

@克里斯,谢谢。固定。 – aaronasterling 2010-11-19 12:57:38

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

some = State.Blocked 
+0

[第三个答案](http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python/1695250#1695250)的第二个版本是__way__更好IMO。它的结果与此相同,但不易出错。 – aaronasterling 2010-11-19 13:04:29

0

利用位标志。 你可以搜索谷歌了解更多信息,用最简单的术语可以以二进制形式存储布尔值,因为True/False是一位,你可以用4位或1字节来存储4种不同的布尔值。

因此,让说这样的:

Python语法:
a = 0x0#[这是位标记或二进制数<class 'int'>的蟒表示或在python27 <type 'int'>]

二进制表示:
为0x0 = 000 [零为零无关,二进制变量多长]
0x1 = 001 [1]
0x2 = 010 [2]
为0x4 = 100 [4]
所以在这里,我们有3米或更多不同的地方布尔值,我们可以检查,因为000000000001 == == 001 == 01为0x1

,但是比特标志
0x3 = 011 [3 = 2 + 1]
为0x5 = 101 [5 = 4 + 1]
为0x6 = 110 [6 = 4 + 2]
为0x7 = 111 [7 = 4 + 2 + 1]

IN THE最简单的条款 我会给你一个比较语法&这意味着与,这意味着位标志中'1'的位置必须是相同的。所以在实用性方面为0x1 & 0X2 0X2 ==将是假的,因为001 & 010没有“1”在同一个地方

所以如果你要检查两种类型的位标志只是把它们加起来,检查,使用上面的语法。
例如:0x3&(0x1+0x2)==(0x1+0x2)

我希望这有助于。快乐的谷歌搜索。