前回はプロジェクト「0070_inputkey」を新しく作り、ユーザからの入力を受け付ける方法をお話ししました。
今回は、新しくプロジェクト「0075_ronri_enzan」を作り、論理演算についてお話します。 論理演算とは、0 と 1 を使った計算のことです。 論理演算は例として、ゲームではイベントとして「体力が0かつ仲間もいない」など、複数の条件をチェックするときに使ったりもします。
ではではプレイヤーからの文字入力を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「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
こんな結果になりました。
ゲームのシステムとしては、下のようなルールです。
「時間切れ」、どちらかでゲームオーバ
(ブール型)や整数を使うことによって行うことができます。ではでは、bool 型について簡単にみてみましょう。
bool 型の"ブール"は数学者「George Boole」の名前からとられています。 Boolean(ブーリアン)と呼ばれることもあります。どんなケースで使われるでしょうか。
例えば、ゲームのフラグなどで「主人公は生存している 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言語に限らず多くのプログラミング言語で似たような機能として扱うことができます。
ソースコードの 4 行目~6行目を見てみましょう。
bool tairyokuNasiFlag = true; // 体力無しフラグ
bool kaifukuyakuNasiFlag = false; // 回復薬無しフラグ
bool jikangireFlag = false; // 時間切れフラグ
bool 変数名 = true;
で、bool 型の変数(tairyokuNasiFlag)に true を代入しています。true はフラグでいうところの 「フラグが立っている」状態です。スイッチなら「ON」ですし、選択でいうところの「Yes」にあたります。
C言語で 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 を想定しています。
8~10行目では bool型の演算をしています。「論理演算(Boolean Operation)」とよんだりします。
bool gameOverFlag = tairyokuNasiFlag || jikangireFlag;
bool sibouFlag = tairyokuNasiFlag && jikangireFlag;
bool seizonFlag = !sibouFlag;
まず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 となります。
続いて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) の組み合わせと結果を表にしておきます。
今回はここまで。お疲れさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: