★マジックナンバー★


プログラムにはマジックナンバーと呼ばれる数値があります。

これは、プログラム中に直接書かれた数値などを指します。

これまでに多くのプログラムを書きましたが、中には随分とマジックナンバーを書いてきました。

例えば、前に作った模擬戦闘のプログラムでは「赤」で示している個所はマジックナンバーです。

<sample program 049-07>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int player_hp;
    int player_atk;

    int enemy_hp;
    int enemy_atk;

    srand((unsigned int)time(NULL));

    player_hp = rand() % 101 + 50;

    enemy_hp = rand() % 101 + 50;

    while (1) {

        printf("現在のステータス\n");

        printf("player HP %d\n", player_hp);

        printf("enemy  HP %d\n", enemy_hp);

        getchar();

        printf("playerの攻撃!\n");

        getchar();

        player_atk = rand() % 11 + 20;

        printf("%dのダメージを与えた!\n", player_atk);

        getchar();

        enemy_hp -= player_atk;

        if (enemy_hp <= 0) {
            printf("playerの勝利!\n");
            break;
        }
 
        printf("enemyの攻撃!\n");

        getchar();

        enemy_atk = rand() % 11 + 20;

        printf("%dのダメージを与えた!\n", enemy_atk);

        getchar();

        player_hp -= enemy_atk;

        if (player_hp <= 0) {
            printf("enemyの勝利!\n");
            break;
        }
    }

    return 0;
}

※文字列の個所も問題がありますが、今回は数値に限定して説明します。


player_hp = rand() % 101 + 50;

この「101」や「50」は、プログラムを見ると、

 101 HPの補正値(0〜100の乱数を発生させるための数値)

  50 ベースとなるHP(最低でもHPは50ある)

とイメージ出来ます。

しかし、#defineのところでも説明したように、数値に名前を付けておけば、より分かりやすくなります。

さらに、ゲームバランスを調整する際に、定数が1箇所に集まっていれば変更しやすいという利点もあります。

もっと言うと、ゲームバランスに直結するような数値はプログラム中に直接書かず、ファイルから読み込むなどした方が良いと思います。

#defineなどで定義したとしても、値を変更すればプログラムをコンパイルし直さなければなりません。

巨大なプロジェクトになると、ビルド(他のファイルとのリンク作業など)だけで数時間かかります。

ファイルから読み込めるようにしておけば、プログラマー以外のプランナー(ゲームデザイナー)などでも調整可能です。


自分だけが使う、短いプログラムであれば特に大きな問題にならないかも知れません。

ちょっとした試作品などで使うこともあるでしょう。

ただ、実際の仕事やどこかに提出するプログラムであればきちんと対処しておきたいですね。


もう1つ、上のプログラムを見ると、

if (enemy_hp <= 0) {
    printf("playerの勝利!\n");
    break;
}

この「0」は赤くなっていません。

見てすぐに理解できる数値については、無理やり定義する必要は無いと思います。


ブラウザの戻るボタンで戻ってください。