ページ 11

敵の指定の仕方

Posted: 2012年3月15日(木) 14:55
by ヒューガ
まずフラグが立っている敵の番号を探し
命令によって次の番号を指定してグローバル変数に代入する
例(2番、3番、5番の敵がフラグをたてていてコマンドで2→3→5→2→・・・と変数に代入する)
という関数を作りたいのですがやり方が思い浮かびません・・・
どなたか教えていただけないでしょうか・・・

Re: 敵の指定の仕方

Posted: 2012年3月15日(木) 15:06
by softya(ソフト屋)
いまいち説明が良くわかりませんがフラグが立っている番号を蓄えるならC++ならvectorなどを使えばどうでしょうか?

[補足]出来るだけグローバル変数は避ける癖を付けないと後で苦労することになりますよ。

Re: 敵の指定の仕方

Posted: 2012年3月15日(木) 15:14
by ヒューガ
ごめんなさい。c++ではなくてcなのです・・・
もしcにない技術でしたら勉強してみます。
ポインタの使い方がいまいちよくわかってないのです・・・

Re: 敵の指定の仕方

Posted: 2012年3月15日(木) 15:22
by beatle
一応書いてみました。が、softyaさんがいうように、グローバル変数は使わない方が、関数の汎用性が高まりますし、いいことが多いと思います。

コード:

#include <stdio.h>
#include <string.h>

#define MAX_ENEMY_NAME_LENGTH 16
#define MAX_ENEMY_LIST_LENGTH 8

struct Enemy
{
    char name[MAX_ENEMY_NAME_LENGTH];
};

struct EnemyListItem
{
    int using_flag;
    struct Enemy data;
};

void SearchNextEnemy();
void InitEnemyList();
void CreateEnemy(int index, const char* name);

int current_enemy_index = 0;
struct EnemyListItem enemy_list[MAX_ENEMY_LIST_LENGTH];

int main(void)
{
    int i;
    InitEnemyList();

    CreateEnemy(1, "foo");
    CreateEnemy(3, "bar");

    for (i = 0; i < MAX_ENEMY_LIST_LENGTH; ++i)
    {
        printf("enemy %02d: ", i);
        if (enemy_list[i].using_flag == 0)
        {
            printf("is not used");
        }
        else
        {
            printf("name = '%s'", enemy_list[i].data.name);
        }
        printf("\n");
    }

    for (i = 0; i < 5; ++i)
    {
        SearchNextEnemy();
        printf("enemy %02d is using, name = '%s'\n", current_enemy_index,
                enemy_list[current_enemy_index].data.name);
    }

    return 0;
}

void SearchNextEnemy()
{
    int i, cnt;
    for (cnt = 0, i = current_enemy_index + 1; cnt < MAX_ENEMY_LIST_LENGTH; ++cnt)
    {
        if (enemy_list[i].using_flag)
        {
            current_enemy_index = i;
            break;
        }

        ++i;
        if (i == MAX_ENEMY_LIST_LENGTH)
        {
            i = 0;
        }
    }
}

void InitEnemyList()
{
    int i;
    for (i = 0; i < MAX_ENEMY_LIST_LENGTH; ++i)
    {
        enemy_list[i].using_flag = 0;
        enemy_list[i].data.name[0] = '\0';
    }
}

void CreateEnemy(int index, const char* name)
{
    if (0 <= index && index < MAX_ENEMY_LIST_LENGTH)
    {
        enemy_list[index].using_flag = 1;
        strncpy(enemy_list[index].data.name, name, MAX_ENEMY_NAME_LENGTH);
        enemy_list[index].data.name[MAX_ENEMY_NAME_LENGTH - 1] = '\0';
    }
}
実行してどうなるかは、ご自分で確かめてみて下さい。改造して実行する、というのを繰り返せば、理解が深まります。

Re: 敵の指定の仕方

Posted: 2012年3月15日(木) 15:25
by softya(ソフト屋)
ヒューガ さんが書きました:ごめんなさい。c++ではなくてcなのです・・・
もしcにない技術でしたら勉強してみます。
ポインタの使い方がいまいちよくわかってないのです・・・
複数の敵の番号を返すのが目的なら、敵の番号を入れる配列にフラグが立っている敵の番号を入れて、その時に数を数えておいてこれも保存します(こうしないと有効数が分かりません)。
最終的に参照渡しで渡した方が分かりやすいので、この機会にポインタを勉強されることをお勧めします。

[追記]
ん?beatleさんの解釈で合っているのかな?
前の番号を与えると次の番号を返す関数って感じですね。