はじめに
こんにちは、野村です。
今回は、プログラムを勉強し始めた頃に知ったことを紹介してみます。
全然大したことじゃありません。でも当時は感動したのですよ。
じゃんけんプログラムを何も考えずに書く
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int judgement(int a, int b){
if (a == b) return 2;
if (a == 0 && b == 1) return 0;
if (a == 1 && b == 2) return 0;
if (a == 2 && b == 0) return 0;
return 1;
}
int main(){
int a, b, c;
srand(time(NULL));
printf("guu:0, choki:1, paa:2 ");
scanf("%d", &a);
if (a<0 || a>2) a=0;
b = rand() % 3;
c = judgement(a, b);
if (c == 0) printf("Win\n");
if (c == 1) printf("Lose\n");
if (c == 2) printf("Draw\n");
return 0;
}
その昔、実際こんな感じで組んだもんです。
で、「じゃんけんは作れたけど、ブロック崩しを作るにはどうしたもんだろ?」と途方に暮れました。
いちいちIF文で処理を分岐しなきゃいかんのか?
決定表を使って書き直してみる
そんなとき「決定表」の存在を知ったのですよ。
予測できる事態をすべて表にまとめ、配列として組み込む方法です。
自分\相手 | グー | チョキ | パー |
---|---|---|---|
グー | Draw | Win | Lose |
チョキ | Lose | Draw | Win |
パー | Win | Lose | Draw |
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int judgement(int a, int b){
static const int result[3][3] = {
{2, 0, 1},
{1, 2, 0},
{0, 1, 2}
};
return result[a][b];
}
int main(){
int a, b, c;
srand(time(NULL));
printf("guu:0, choki:1, paa:2 ");
scanf("%d", &a);
if (a<0 || a>2) a=0;
b = rand() % 3;
c = judgement(a, b);
static const char message[3][5] = {"Win", "Lose", "Draw"};
printf("%s\n", message[c]);
return 0;
}
8箇所あったIF文が1つに減った!
最後に
以上、配列(決定表)を利用して冗長なIF文を一気に削減する方法を紹介しました。
こんな感じで、2次元、3次元、4次元と決定表の次元を増やすことで、より複雑な処理を実現できる。
実際にこの方法を駆使してブロック崩しを作りましたよ。いい思い出です。
というわけで、今回はこれにて。