敵の指定の仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ヒューガ

敵の指定の仕方

#1

投稿記事 by ヒューガ » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 敵の指定の仕方

#2

投稿記事 by softya(ソフト屋) » 14年前

いまいち説明が良くわかりませんがフラグが立っている番号を蓄えるならC++ならvectorなどを使えばどうでしょうか?

[補足]出来るだけグローバル変数は避ける癖を付けないと後で苦労することになりますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

Re: 敵の指定の仕方

#3

投稿記事 by ヒューガ » 14年前

ごめんなさい。c++ではなくてcなのです・・・
もしcにない技術でしたら勉強してみます。
ポインタの使い方がいまいちよくわかってないのです・・・

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 敵の指定の仕方

#4

投稿記事 by beatle » 14年前

一応書いてみました。が、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';
    }
}
実行してどうなるかは、ご自分で確かめてみて下さい。改造して実行する、というのを繰り返せば、理解が深まります。
最後に編集したユーザー beatle on 2012年3月15日(木) 15:25 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 敵の指定の仕方

#5

投稿記事 by softya(ソフト屋) » 14年前

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

[追記]
ん?beatleさんの解釈で合っているのかな?
前の番号を与えると次の番号を返す関数って感じですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る