第2章10 論理演算(BOOL演算)@イチからゲーム作りで覚えるC言語

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章11 比較演算を使えるようになる
NEXT : 2章11 比較演算を使えるようになる
2章09 ユーザからの入力を受け付ける : PREV

この記事でやること

前回はプロジェクト「0070_inputkey」を新しく作り、ユーザからの入力を受け付ける方法をお話ししました。
今回は、新しくプロジェクト「0075_ronri_enzan」を作り、論理演算についてお話します。論理演算とは、0 と 1 を使った計算のことです。論理演算は例として、ゲームではイベントとして「体力が0かつ仲間もいない」など、複数の条件をチェックするときに使ったりもします。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

論理演算をするプログラム

ではではプレイヤーからの文字入力を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0075_ronri_enzan」を新しく用意し、プロジェクトに空の「OperateBool.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>
#include <stdbool.h>
int main() {
  bool tairyokuNasiFlag = true;     // 体力無しフラグ
  bool kaifukuyakuNasiFlag = false; // 回復薬無しフラグ
  bool jikangireFlag = false;       // 時間切れフラグ

  bool gameOverFlag = tairyokuNasiFlag || jikangireFlag;
  bool sibouFlag = tairyokuNasiFlag && kaifukuyakuNasiFlag;
  bool seizonFlag = !sibouFlag;

  printf("体力無しフラグ:%d\n", tairyokuNasiFlag);
  printf("回復薬無しフラグ:%d\n", kaifukuyakuNasiFlag);
  printf("時間切れフラグ:%d\n", jikangireFlag);
  printf("ゲームオーバーフラグ:%d\n", gameOverFlag);
  printf("死亡フラグ:%d\n", sibouFlag);
  printf("生存フラグ:%d\n", seizonFlag);

  bool a = 150;
  printf("bool型に整数150を代入した結果:%d\n", a);
}

コピペなりして、実行してみて下さい。

体力無しフラグ:1
回復薬無しフラグ:0
ゲームオーバーフラグ:1
死亡フラグ:0
生存フラグ:1
bool型に整数150を代入した結果:1

こんな結果になりました。
ゲームのシステムとしては、下のようなルールです。

  • 「体力無し」もしくは「時間切れ」、どちらかでゲームオーバ
  • 「体力無し」かつ「回復薬なし」ならプレイヤー死亡と判定

こういった「もしくは」や「かつ」といった計算は、論理演算で計算することができます。C言語上では論理演算は bool型(ブール型)や整数を使うことによって行うことができます。ではでは、bool 型について簡単にみてみましょう。

bool 型とは

bool 型の”ブール”は数学者「George Boole」の名前からとられています。Boolean(ブーリアン)と呼ばれることもあります。どんなケースで使われるでしょうか。

スイッチのON/OFFイメージ

スイッチのON/OFFイメージ

例えば、ゲームのフラグなどで「主人公は生存している or 死んでいる」などの、 Yes か No か、On か Off か、などの 2 つの可能性を管理したいとき、数値に置き換えて 1 か 0 かで管理されていることがよくあります。

こいった 0 と 1 を取り扱うための型が bool型 です。この型はC言語の C99 (1999 年に制定)という仕様から使えるようになっています。最近のC言語開発環境であれば問題なく使えると思います。
実際にソースコード上で bool型を使うには、2行目にあるような1文を加える必要があります。

 #include <stdbool.h>

include文については後ほどお話しようと思いますが、簡単にかくと、ソースコードの冒頭に書くことであらかじめ用意されている関数など使用できるようになる文のことです。これで bool 関連の機能を使用できるようになります。

こういった 0 と 1 を取り扱うための bool 型は 、非常に使える箇所が多いためC言語に限らず多くのプログラミング言語で似たような機能として扱うことができます。

bool型と true と false

ソースコードの 4 行目~6行目を見てみましょう。

 bool tairyokuNasiFlag = true;     // 体力無しフラグ
 bool kaifukuyakuNasiFlag = false; // 回復薬無しフラグ
 bool jikangireFlag = false;       // 時間切れフラグ

bool 変数名 = true;
で、bool 型の変数(tairyokuNasiFlag)に true を代入しています。true はフラグでいうところの「フラグが立っている」状態です。スイッチなら「ON」ですし、選択でいうところの「Yes」にあたります。

true は実際には整数の 1 そのものです。
例えばこの 4 行目は「true」のかわりに、下のように書いても同じ結果を得られます。

 bool tairyokuNasiFlag = 1;        // 体力無しフラグ
なお4行目の右側に書いてある「// 体力無しフラグ」はコメントを表しています。コメントはコンパイルするときには無視されますので、書いても書かなくても結果は変わりません。
「//」の記号の右側は、コメントで自由な説明などを書いておくことができます。
あとで自分でソースコードを見直したりするときにわかりやすくするため、ここでは変数の使い方について補足情報を書いています。コメントについての書き方はこちらでお話していますので、振り返りによければどうぞ。

5行目も同じように、
bool 変数名 = false;
で、bool 型の変数(kaifukuyakuNasiFlag)に false を代入しています。false は true の逆で、「フラグは立ってない」し、スイッチなら「OFF」、選択でいうところの「No」にあたります。

「false」は実際には整数の 0 ですので、例えば5行目は下のように書いても同じ結果を得られます。

 bool kaifukuyakuNasiFlag = 0;     // 回復薬無しフラグ

6行目は4行目とおなじですね。変数 jikangireFlag はゲームの「残り時間」がなくなっていたら  true、まだあれば false を想定しています。

論理演算(Bool演算)を行う

8~10行目では bool型の演算をしています。「論理演算(Boolean Operation)」とよんだりします。

 bool gameOverFlag = tairyokuNasiFlag || jikangireFlag;
 bool sibouFlag = tairyokuNasiFlag && jikangireFlag;
 bool seizonFlag = !sibouFlag;

OR演算子「||」を使う

まず8行目ですが、右辺の「tairyokuNasiFlag || jikangireFlag」を演算し、その結果を左辺の bool 型変数 gameOverFlag に代入しています。
右辺の「tairyokuNasiFlag || jikangireFlag」がどのような演算を行っているか確認していきましょう。

記号「||」は bool 型の演算をする機能を持つ演算子で、「論理演算子」と呼ばれるものの1つです。
式「 a || b 」は 「a または b のどちらかが true なら、結果は true、それ以外は false」という意味になります。とちらかが true なら true なので、OR演算子 とよばれていたりもします。

さて、「tairyokuNasiFlag || jikangireFlag」の中身は「true || false」ですので、右辺の結果は「true」となります。変数 gameOverFlag には true が代入されます。
※体力が無し、または、時間切れ なら、ゲームオーバーのフラグが立つことになります。

例として、tairyokuNasiFlag、jikangireFlag について 1 (true) と 0 (false) の組み合わせと結果を表にしておきます。

OR 論理演算子の組み合わせと結果
tairyokuNasiFlag
体力無しフラグ
jikangireFlag
時間切れフラグ
結果 gameOverFlag
ゲームオーバーかのフラグ
0 ( false ) 0 ( false ) 0 ( false )
1 ( true ) 0 ( false ) 1 ( true )
0 ( false ) 1 ( true ) 1 ( true )
1 ( true ) 1 ( true ) 1 ( true )

たとえば表の1行目は tairyokuNasiFlag も jikangireFlag も false です。OR 論理演算ではどちらかが true であれば true ですが、当てはまらないので、結果は false となります。

AND演算子「&&」を使う

続いて9行目についてです。右辺の「tairyokuNasiFlag && kaifukuyakuNasiFlag」を演算子「&&」で計算し、bool 型の変数 sibouFlag に代入しています。
&&」も論理演算子の一つで、AND演算子と呼ばれています。
式「a && b」で説明すると、「a かつ b が true なら、結果は true 、それ以外は false」です。つまり、a と b の両方が true でなければ、結果は false となります。

さて、右辺の「tairyokuNasiFlag && kaifukuyakuNasiFlag」の変数を中身で置き換えて考えると、「true && false」となります。この結果は false となります。

例として、tairyokuNasiFlag、jikangireFlag について 1 (true) と 0 (false) の組み合わせと結果を表にしておきます。

あとがき

今回はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章11 比較演算を使えるようになる
NEXT : 2章11 比較演算を使えるようになる
2章09 ユーザからの入力を受け付ける : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし