ビット演算による状態管理

RPGのキャラクターが「毒を食らった」「火傷を負った」などの状態をどのように管理するのが効率的なのだろうか?

isPoisnとかisBurnなどという倫理型変数を作ってTrue、Flaseで管理してもいいのだが、増えすぎると変数が増えまくって困る気がする。

そういえば、昔ビット演算を習ったときにゲームなどの状態管理に使えると聞いたことを思い出した。

Unityのご時世にC言語的な手法が未だに通用するのか?ネットで調べてみるとQiitaにビット演算の記事がいくつか載っていた。とりあえず実践してみて実用性があるのか確認してみよう。

それにしても地味な実験だ😂

#定数っぽく定義
STAT_POISON = 0b00000001 #毒状態
STAT_BURN = 0b00000010 #火傷状態

#演算
a = 0b00000000 #無フラグ状態
a |= STAT_POISON #フラグ付与
a |= STAT_BURN #フラグ付与
a = a & ~STAT_POISON #フラグ削除
a = a ^ STAT_POISON #フラグ反転
a = a ^ STAT_POISON #フラグ反転

#フラグ判定
if a & STAT_POISON:
    print(u"毒状態")
else:
    print(u"毒状態ではない")
if a & STAT_BURN:
    print(u"火傷状態")
else:
    print(u"火傷状態ではない")

#桁数の実験。Long型の最大値は無限かも?
b = 0b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
print(b)
print(type(b))

コメントする