csvによる敵の制御

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

csvによる敵の制御

#1

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

ここの講座の通りにcsvで敵を制御しようとしているのですが、
csvで打ち込んだとおりに動いてくれません。
行動パターンが全て同じになったりします。
原因として何が考えられますか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: csvによる敵の制御

#2

投稿記事 by みけCAT » 12年前

プログラムのバグが考えられます。
あなたが書いているソースコードを見せてくれないと、詳しいことはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ヒューガ

Re: csvによる敵の制御

#3

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

csvのロード

コード:

void load_story(){
        int n,num,i,fp;
        char fname[32]={"scinfaxi.csv"};
        int input[64];
        char inputc[64];

        fp = FileRead_open(fname);//ファイル読み込み
        if(fp == NULL){
                printfDx("read error\n");
                return;
        }
        for(i=0;i<2;i++)//最初の2行読み飛ばす
                while(FileRead_getc(fp)!='\n');

        n=0 , num=0;
        while(1){
                for(i=0;i<64;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
                        if(inputc[i]=='/'){//スラッシュがあれば
                                while(FileRead_getc(fp)!='\n');//改行までループ
                                i=-1;//カウンタを最初に戻して
                                continue;
                        }
                        if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
                                inputc[i]='\0';//そこまでを文字列とし
                                break;
                        }
                        if(input[i]==EOF){//ファイルの終わりなら
                                goto EXFILE;//終了
                        }
                }
                switch(num){
                        case 0: enemy_order[n].c      =atoi(inputc);break;
                        case 1: enemy_order[n].p  =atoi(inputc);break;
                        case 2: enemy_order[n].k      =atoi(inputc);break;
                        case 3: enemy_order[n].x        =atof(inputc);break;
                        case 4: enemy_order[n].y        =atof(inputc);break;
                        case 5: enemy_order[n].bt   =atoi(inputc);break;
                        case 6: enemy_order[n].bk    =atoi(inputc);break;
                        case 7: enemy_order[n].hp       =atoi(inputc);break;
                        case 8:enemy_order[n].bk2   =atoi(inputc);break;
                        case 9:enemy_order[n].wait     =atoi(inputc);break;
                       
                }
                num++;
                if(num==10){
                        num=0;
                        n++;
                }
        }
EXFILE:
        FileRead_close(fp);
}
読み込んだデータを敵に割り当てる

コード:

void enemy_enter(){
	int i,t;
	for(t=0;t<ENEMY_ORDER_MAX;t++){
        if(enemy_order[t].c==stage_count){//現在の瞬間がオーダーの瞬間なら
            if((i=enemy_num_search())!=-1){//敵の行動を登録・制御する関数
                enemy[i].f   =1;//フラグ
                enemy[i].c    =0;//カウンタ
				enemy[i].p=enemy_order[i].p;//移動パターン
                enemy[i].k    =enemy_order[t].k;//敵の種類
                enemy[i].x      =enemy_order[t].x;//座標
                enemy[i].y      =enemy_order[t].y;
				enemy[i].s=0;
                enemy[i].bt =enemy_order[t].bt;//弾の発射時間
                enemy[i].bk  =enemy_order[t].bk;//弾幕の種類
                enemy[i].bk2 =enemy_order[t].bk2;//弾の種類
                enemy[i].wait   =enemy_order[t].wait;//停滞時間
                enemy[i].hp     =enemy_order[t].hp;//体力
                enemy[i].hp_max =enemy[i].hp;//体力最大値
                enemy[i].a    =0;//角度
                
            }

		}
	}
}
こんなもんでしょうか。

とっち
記事: 56
登録日時: 12年前
住所: 岡山

Re: csvによる敵の制御

#4

投稿記事 by とっち » 12年前

提示してもらったところは特に動作に問題ないように思えます。

敵の行動を制御しているところも見せてください。
(龍神録だとenemy.cppのenemy_act()関数の中身です)

ヒューガ

Re: csvによる敵の制御

#5

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

コード:

void enemy_act(){
    int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemy[i].f==1){//その敵のフラグがオンになってたら
            if(0<=enemy[i].p && enemy[i].p<ENEMY_PATTERN_MAX){
                enemy_pattern[enemy[i].p](i);
                enemy[i].x+=cos(enemy[i].a)*enemy[i].s;
				enemy[i].y+=sin(enemy[i].a)*enemy[i].s;
                enemy[i].c++;
                //敵が画面から外れたら消す
                if(enemy[i].x<-60 || FIELD_MAX_X+60<enemy[i].x || enemy[i].y<-60 || FIELD_MAX_Y+60<enemy[i].y)
                    enemy[i].f=0;
				if(enemy[i].bt==enemy[i].c)
                    enter_shot(i);
            }
            else
                printfDx("enemy[i].patternの%d値が不正です。",enemy[i].p);
        }
    }
}
こんなんです

とっち
記事: 56
登録日時: 12年前
住所: 岡山

Re: csvによる敵の制御

#6

投稿記事 by とっち » 12年前

ここも問題ないようですね・・・

あと考えられる問題点として3つほどあげてみます。

1.enemy.cppの関数ポインタを使っている void (*enemy_pattern[ENEMY_PATTERN_MAX])(int)のところがおかしい。

2.enemy_pattern0とかenemy_pattern1関数の中身がおかしい。

3.csvファイルのpatternのデータが間違っている。


12章の内容と以上の三点を確認してみてください。

ヒューガ

Re: csvによる敵の制御

#7

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

>enemy.cppの関数ポインタを使っている void (*enemy_pattern[ENEMY_PATTERN_MAX])(int)のところがおかしい。

コード:

extern void enemy_pattern0(int i);
extern void enemy_pattern1(int i);
extern void enemy_pattern2(int i);
extern void enemy_pattern3(int i);
void (*enemy_pattern[ENEMY_PATTERN_MAX])(int) = {
    enemy_pattern0,enemy_pattern1,enemy_pattern2,enemy_pattern3
};
>enemy_pattern0とかenemy_pattern1関数の中身がおかしい。

コード:

double rang(double ang){
    return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}


 void enemy_pattern0(int i){
	if(enemy[i].c<500){
		enemy[i].s=2;
		enemy[i].a=PI/2;
	}
 }

void enemy_pattern1(int i){
	if(enemy[i].c<100){
		enemy[i].s=2;
		enemy[i].a=PI/2;
	}
	if(100<=enemy[i].c&&enemy[i].c<160){
		enemy[i].a-=PI*(1.5/180);
	}
	if(160<=enemy[i].c&&enemy[i].c<220){
		enemy[i].a+=PI*(1.5/180);
	}
	if(220<=enemy[i].c){
		enemy[i].a=PI/2;
	}
}

void enemy_pattern2(int i){
	if(enemy[i].c<600){
		enemy[i].s=2;
		enemy[i].a=-PI;
	}
}

void enemy_pattern3(int i){
	if(enemy[i].c<10000){
		enemy[i].s=1;
		enemy[i].a=PI/2;
	}
}
>csvファイルのpatternのデータが間違っている。
ここにCSVファイルの全文を載せておきます

/カウンタ,移動パターン,敵の種類,x座標,y座標,発射時間,弾幕種類,体力,弾種類,待機時間
/cnt,pattern,knd,x座標,y座標,bltime,blknd,hp,blknd2,wait
100,0,0,100,-30,80,1,100,0,120
200,0,0,190,-30,80,1,100,0,120
300,0,0,540,-30,80,1,100,0,120
400,0,0,430,-30,80,1,100,0,120
500,0,0,160,-30,80,1,100,0,120
500,0,0,480,-30,80,1,100,0,120
700,0,0,150,-30,80,1,100,0,120
740,0,0,100,-30,80,1,100,0,120
740,0,0,200,-30,80,1,100,0,120
830,0,0,490,-30,80,1,100,0,120
870,0,0,540,-30,80,1,100,0,120
870,0,0,440,-30,80,1,100,0,120
960,0,0,320,-30,80,1,100,0,120
1020,0,0,380,-30,80,1,100,0,120
1020,0,0,260,-30,80,1,100,0,120
1080,0,0,200,-30,80,1,100,0,120
1080,0,0,440,-30,80,1,100,0,120
1200,2,0,670,100,80,1,100,0,120
1240,2,0,670,130,80,1,100,0,120
1280,2,0,670,160,80,1,100,0,120
1340,2,0,-30,120,80,1,100,0,120
1380,2,0,-30,150,80,1,100,0,120
1420,2,0,-30,180,80,1,100,0,120
1480,2,0,670,240,80,1,100,0,120
1540,2,0,670,290,80,1,100,0,120
1540,2,0,670,190,80,1,100,0,120
1600,3,0,-30,200,80,1,100,0,120
1660,3,0,-30,240,80,1,100,0,120
1660,3,0,-30,160,80,1,100,0,120
1780,3,0,-30,200,80,1,100,0,120
1800,3,0,320,-30,80,1,100,0,120
1920,3,0,160,-30,80,1,100,0,120
2010,3,0,480,-30,80,1,100,0,120
2130,3,0,200,-30,80,1,100,0,120
2130,3,0,400,-30,80,1,100,0,120
2160,3,0,50,-30,80,1,100,0,120
2240,3,0,600,-30,80,1,100,0,120
2360,3,0,520,-30,80,1,100,0,120

ヒューガ

Re: csvによる敵の制御

#8

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

どこが間違ってるのでしょうか?

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

Re: csvによる敵の制御

#9

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

龍神録はソースコードがダウンロードできるのでダウンロードして比較して見ることをおすすめします。
まぁ、安易に比較するよりも自分で直した方が勉強になるんですが、ここで他の人に任せっきりにするならソースコードを比較したほうが早いです。
※ ちゃんとソースコードの理解とデバッグすれば原因は判明するんですが、それがお望みならデバッグ方法をレクチャーします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

Re: csvによる敵の制御

#10

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

比較しましたがどこを間違えているのかわかりません。
先に言っておいた方がよかったのしれませんが
csvの内容を上記のとおりにするとpatternの値が全て0になったかのような動きをします。
このpatternの列をすべて0(直線運動)にして10行目までを1(蛇行する動き)にすると
ほとんどが1の動きをします。(0の動きをするのもある)

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

Re: csvによる敵の制御

#11

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

見つけらないとしたら、ここはちゃんとしたデバッグ方法を身につけましょう。
デバッガで enemy_enter()関数でちゃんと狙った時に狙った移動パターンが代入されているか確認して下さい。
どうなれば正しいかは、ソースコードを理解していれば想像できると思います。

「デバッガの使い方」 ※ ブレークポイントを使います。
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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