龍神録11章のプログラムについての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dast
記事: 41
登録日時: 13年前

龍神録11章のプログラムについての質問

#1

投稿記事 by dast » 13年前

龍神録11章を参考にして変数への数値の代入を楽にしようと思ったのですが、11章のプログラムで何を示しているのか分からない所があったので質問しに来ました。

コード:

//敵の出現情報をエクセルから読み込んで格納する関数
void load_story(){
        int n,num,i,fp;
        char fname[32]={"../dat/csv/storyH0.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].cnt      =atoi(inputc);break;
                        case 1: enemy_order[n].pattern  =atoi(inputc);break;
                        case 2: enemy_order[n].knd      =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].sp       =atof(inputc);break;
                        case 6: enemy_order[n].bltime   =atoi(inputc);break;
                        case 7: enemy_order[n].blknd    =atoi(inputc);break;
                        case 8: enemy_order[n].col      =atoi(inputc);break;
                        case 9: enemy_order[n].hp       =atoi(inputc);break;
                        case 10:enemy_order[n].blknd2   =atoi(inputc);break;
                        case 11:enemy_order[n].wait     =atoi(inputc);break;
                        case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
                        case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
                        case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
                        case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
                        case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
                        case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
                }
                num++;
                if(num==18){
                        num=0;
                        n++;
                }
        }
EXFILE:
        FileRead_close(fp);
}


このプログラムの4行目のfname[32]の32、5行目のinput[64]の64、6行目のinputc[64]の64は何の数字なのでしょうか?エクセルデータやプログラムによってこの数値を変える必要はあるのでしょうか?

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

Re: 龍神録11章のプログラムについての質問

#2

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

それは配列の大きさを示します。

「C言語編 第23章 配列」
http://www.geocities.jp/ky_webid/c/023.html
「C言語入門 2.変数・配列」
http://c-production.com/contents/c/sec02.html#06

【追記】
C言語の入門書やサイトは参考にされていないのでしょうか?
ちゃんとした入門書をお読みになることをお勧めします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 龍神録11章のプログラムについての質問

#3

投稿記事 by h2so5 » 13年前

この場合は
32はファイルパスの最大文字数-1を表し、
64はデータファイルの1行あたりの最大文字数-1なので

それらの文字数を多くする場合は変更が必要でしょうね。

dast
記事: 41
登録日時: 13年前

Re: 龍神録11章のプログラムについての質問

#4

投稿記事 by dast » 13年前

このプログラムに対応するCSVをテキストエディタで開いて調べてみたら最初の2行が70文字以上あったのですが、これはこの2行が読み込む文ではないからいいということですか?
また、この2行以外の読み込むように指定されている行は指定している最大文字数よりもだいぶ少なかったのですが、これは指定した最大文字数が実際の最大文字数より大きい値であればいいということですか?

box
記事: 2002
登録日時: 14年前

Re: 龍神録11章のプログラムについての質問

#5

投稿記事 by box » 13年前

dast さんが書きました:

コード:

        char fname[32]={"../dat/csv/storyH0.csv"};
私だったら、この文は

コード:

        char fname[]={"../dat/csv/storyH0.csv"};
と、要素数を指定しないように書きます。こうすることで、
"../dat/csv/storyH0.csv"
の長さに応じた要素数を持つ配列を勝手に確保してくれるからです。

前者の書き方では、

コード:

        char fname[32]={"../dat/csv/hoge/hoge/foo/bar/nantoka/kantoka/storyH0.csv"};
のように、配列の要素数より初期化子の長さが大きいとき、確かコンパイルエラーが出るはずです。
それに対し、後者の書き方では、

コード:

        char fname[]={"../dat/csv/hoge/hoge/foo/bar/nantoka/kantoka/storyH0.csv"};
のように初期化子が長くなったとしても、fname[] の要素数はそれに応じて決まります。
32と決め打ちするより、初期化子の長さを全く気にしなくてすむので、何だか便利な気がしませんか?

まあ、あくまで「私だったらこうする」というだけのことです。
32決め打ちでよいと思われているのでしたら、それを妨げる権利は私にはありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 龍神録11章のプログラムについての質問

#6

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

このプログラムに対応するCSVをテキストエディタで開いて調べてみたら最初の2行が70文字以上あったのですが、これはこの2行が読み込む文ではないからいいということですか?
それは、プログラムにちゃんとコメントして書かれています。

コード:

        for(i=0;i<2;i++)//最初の2行読み飛ばす
                while(FileRead_getc(fp)!='\n');
これで、どうやってコメントの機能を実現しているかは実験して確認してみてください。
途中のFileRead_getc(fp)の内容をprintfしてみるのもよいでしょう。
また、この2行以外の読み込むように指定されている行は指定している最大文字数よりもだいぶ少なかったのですが、これは指定した最大文字数が実際の最大文字数より大きい値であればいいということですか?
これも、このプログラムの意味するところを理解すれば分かってくると思います。多ければどういう問題がおこるでしょう?考えてみてください。

コード:

                for(i=0;i<64;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
ここは、64を直値で指定してあるので行儀は悪いと思います。
defineするのがオススメです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast
記事: 41
登録日時: 13年前

Re: 龍神録11章のプログラムについての質問

#7

投稿記事 by dast » 13年前

11章のファイルを読み込むプログラムの仕組みがやっと理解できました。合っているかどうかは自分だけでは分かりませんが、私はとりあえず

inputとinputcという名の64個の空き箱を用意
    |
ファイルを開いて読み始める
    |
iという箱に0を入れる
    |
改行マークが来るまで箱に入れずに飛ばす。この作業を2回繰り返す。
    |
numの箱に0入れ、enemy_orderの0番のセットを用意する
    |
    ☆
    |
次の文字をinputのi番の箱に入れ、inputcのi番の箱にinputのi番の箱に入れた文字と同じ物を入れる。
    |
入れた文字が/だったら改行マークが来るまで飛ばし、現在の箱の番号を便宜上-1にして次の文字を0番に入れる用意をして続行する
    |
入れた文字が , または改行マークだったら今入れたものをスペースに置き換えて※に飛ぶ
    |
入れた物がファイルの最後を表す記号だったら●に飛ぶ
    |
   ☆に飛ぶ
    |
    ※
    |
enemy_orderの用意されたセットのnumの場所にinputcに入れた文字を入れる
    |
numに1を足す
    |
numが18以上だったらnumを0に戻しenemy_orderの次のセットを用意する
    |
   ☆に飛ぶ
    |
    ●
    |
ファイルを閉じて終わる

という認識をしました。それで、この11章のプログラムを利用して次のようなプログラムを作って実行してみたら予定していた物と違う数値が読み込まれてしまいました。

コード:

#include "DxLib.h"

//ゲーム画面
#define PI 3.141592654
#define enemyMAX 30//敵同時表示最大数
#define enemyorderMAX 500//敵行動パターン最大数
#define GAMESTART 480//操作が出来るようになるまでの時間

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}

//変数の用意
//システム
int mode;//モード切り替え用
int i;//ループ用
//タイトル画面
int SelectNum;//メニュー選択用
//ゲーム画面
int ziki_img[16];//自機画像格納用
int smode;//自機攻撃用
int Back1;//背景画像格納用(タイトル画面共通)
int Waku1;//ゲーム枠画像格納用
int Waku2;//パラメーター枠画像格納用
int ztama;//自機弾画像格納用
int ztamakage;//自機弾影画像格納用
int gcnt;//操作許可判定用
int imgenemy[4][5];//敵画像

//構造体の用意
// タイトル画面
// メニュー用構造体
typedef struct{
	int x, y;       // 座標格納用変数
	char name[128]; // 項目名格納用変数
} MenuElement_t ;
MenuElement_t MenuElement[4]={// メニュー項目要素
	{ 260, 285, "ゲームスタート" }, // タグの中身の順番で格納される。xにが、yにが、nameに"ゲームスタート"が
	{ 280, 335, "おまけ" },
	{ 280, 385, "コンフィグ" },
	{ 280, 435, "ゲーム終了" },
};
// ゲーム画面
// 自機データ構造体
typedef struct{
	int x, y;       // 座標格納用変数
	int maxx;       // 移動範囲右端
	int minx;       // 移動範囲左端
	int cnt;        // 画像ループ用変数
	int no;         // 画像ループ用変数
	int z;          // 残機数
	int b;          // 残りボム数
} ziki_t ;
ziki_t ziki={200,444,609,30,0,0,3,3};// 自機データ
//自機弾用構造体
typedef struct{
	int x, y;       // 自機弾座標
	int flag;       // 発射済みかどうか
} shot_t ;
shot_t tama[10]={
	{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0},{200,444,0}
};
typedef struct{
	int flag,flag2,cnt,pattern,knd,hp,maxhp,img;//存在フラグ、使用フラグ、敵カウント、行動パターン、敵の種類、HP、最大HP、画像
	double x,y,vx,vy,sp,ang;//X座標、Y座標、速度X、速度Y、スピード、角度
} enemy_t;
enemy_t enemy[enemyMAX];
typedef struct{
	int cnt,pattern,knd,maxhp;
	double x,y,sp;
} enemy_order_t;
enemy_order_t enemy_order[enemyorderMAX];
//関数の用意
//タイトル画面
//タイトルメニュー操作
void Tmove(){
	//下方向への移動
	if( Key[ KEY_INPUT_DOWN ] == 1 ){      // 下キーが押された瞬間だけ処理
		SelectNum = ( SelectNum + 1 ) % 4; // 現在の選択項目を一つ下にずらす(ループする)
		for(i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
			if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
				MenuElement[i].x = 260;     // 座標をにする
			} else {// 今処理しているのが、選択番号以外なら
				MenuElement[i].x = 280;    // 座標をにする
			}
		}
	}
	//上方向への移動
	if( Key[ KEY_INPUT_UP ] == 1 ){        // 上キーが押された瞬間だけ処理
		SelectNum = ( SelectNum + 3 ) % 4; // 現在の選択項目を一つ上にずらす(逆ループする)
		for(i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
			if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
				MenuElement[i].x = 260;     // 座標をにする
			} else {// 今処理しているのが、選択番号以外なら
				MenuElement[i].x = 280;    // 座標をにする
			}
		}
	}
	if( Key[ KEY_INPUT_A] == 1 ){
		if(SelectNum == 0){
			mode=20;
		}
		if(SelectNum == 3){
			mode=99999;
		}
	}
}
//ゲーム画面
//敵のパラメータをエクセルデータから読み込んで格納する
void loadEstate(){
	int n,num,fp;
	char fname[]={"Estate.csv"};
	int input[19];
	char inputc[19];

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

	n=0;num=0;
	while(1){
		for(i=0;i<19;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].cnt    =atoi(inputc);break;
			case 1: enemy_order[n].pattern=atoi(inputc);break;
			case 2: enemy_order[n].knd    =atoi(inputc);break;
			case 3: enemy_order[n].maxhp  =atoi(inputc);break;
			case 4: enemy_order[n].x      =atoi(inputc);break;
			case 5: enemy_order[n].y      =atoi(inputc);break;
			case 6: enemy_order[n].sp     =atoi(inputc);break;
		}
		num++;
		if(num==7){
			num=0;
			n++;
		}
	}
EXFILE:
	FileRead_close(fp);
}
//空いている敵番号の検索
int Enumsearch(){
	for(int I=0;I<enemyMAX;I++){//使用フラグが立っていないenemyの部屋を探す
		if(enemy[I].flag2=0){//使用されていない所が見つかったら
			return I;//その部屋の番号を返す
		}
	}
	return -1;//全部埋まっていたらエラー番号の-1を返す
}
//敵のパラメータの登録&存在フラグON
void Eenter(){
	int t;
	if(gcnt==1){//ゲームカウントがになったら
		for(i=0;i<enemyorderMAX;i++){
			if(enemy_order[i].cnt==1){
				if((t=Enumsearch())!=-1){
					enemy[t].pattern=enemy_order[i].pattern;
					enemy[t].knd    =enemy_order[i].knd;
					enemy[t].maxhp  =enemy_order[i].maxhp;
					enemy[t].hp     =enemy[t].maxhp;
					enemy[t].x      =enemy_order[i].x;
					enemy[t].y      =enemy_order[i].y;
					enemy[t].vx     =0;
					enemy[t].vy     =0;
					enemy[t].sp     =enemy_order[i].sp;
					enemy[t].ang    =0;
					enemy[t].flag2  =1;
				}
			}
		}
	}
	if(gcnt==GAMESTART){
		for(i=0;i<enemyMAX;i++){
			if(enemy[i].flag2==1){
				enemy[i].flag=1;
			}
		}
	}
}
//敵1の行動パターン
void E1pattern0(){
	if((enemy[i].cnt%400)/200==0){
		enemy[i].x-=1.0;
	}
	if((enemy[i].cnt%400)/200==1){
		enemy[i].x+=1.0;
	}
}
//敵のパターンの稼働
void Epatterncontrol(){
	for(i=0;i<enemyMAX;i++){
		if(enemy[i].flag==1){
			E1pattern0();
			enemy[i].cnt++;
		}
	}
}
//自機操作関数
void Zmove(){
	ziki.no=(ziki.cnt%48)/12;
	if(gcnt>=GAMESTART){
		ziki.cnt++;
	}
	if(Key[KEY_INPUT_LEFT]>=1 && ziki.x>=ziki.minx && Key[KEY_INPUT_RIGHT]==0 && smode!=1 && ziki.cnt>0){    //右キーが押されている間
		ziki.no += 8;
		ziki.x -=2;
	}
	if(Key[KEY_INPUT_RIGHT]>=1 && ziki.x<=ziki.maxx && Key[KEY_INPUT_LEFT]==0 && smode!=1 && ziki.cnt>0){
		ziki.no += 4;
		ziki.x +=2;
	}
	if(Key[KEY_INPUT_A]==1 && ziki.cnt>0 && smode!=1){
		smode=1;
		ziki.cnt=0;
	}
	if(smode==1){
		ziki.no=(ziki.cnt%16)/4;
		ziki.no += 12;
		if(ziki.cnt==8){//
		}
		if(ziki.cnt==15){
			smode=0;
		}
	}
}
//自機弾計算関数
void zikitama(){
	for(i=0;i<10;i++){
		if(tama[i].flag==0){
			tama[i].x=ziki.x;
		}
	}
	if(smode==1 && ziki.cnt==8){
		for(i=0;i<10;i++){
			if(tama[i].flag==0){
				tama[i].flag=1;
				break;
			}
		}
	}
	for(i=0;i<10;i++){
		if(tama[i].flag==1){
			tama[i].y-=8;
			if(tama[i].y<79){
				tama[i].y=ziki.y-28;
				tama[i].flag=0;
			}
		}
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
		//ウィンドウモードに設定,DXライブラリ初期化処理,描画先を裏画面に設定

//変数
		//変数への数値の代入
		
		mode = 0;
		SelectNum = 0;                   // 現在の選択番号
		ziki.x = (ziki.maxx+ziki.minx)/2;// 自機初期位置
		ziki.no =(ziki.cnt%48)/12;            // 画像ループ用変数設定
		smode = 0;
		gcnt = 0;

		//変数への画像の格納
		Back1 = LoadGraph("画像/システム/神社周辺.png");
		Waku1 = LoadGraph("画像/システム/枠.png");
		Waku2 = LoadGraph("画像/システム/パラメータ表示部分.png");
		LoadDivGraph("画像/キャラ/自機.png",16,4,4,66,66,ziki_img);
		LoadDivGraph("画像/キャラ/一面ザコ.png",4,5,1,40,40,imgenemy[0]);
		ztama = LoadGraph("画像/弾/自機弾.png");
		ztamakage = LoadGraph("画像/弾/自機弾影.png");

//構造体
		//shot tama[10]の設定
		for(i=0;i<10;i++){
			tama[i].x=ziki.x;
			tama[i].y=ziki.y-28;
			tama[i].flag=0;
		}
		memset(enemy,0,sizeof(enemy_t)*enemyMAX);//
		memset(enemy_order,0,sizeof(enemy_order_t)*enemyorderMAX);
		loadEstate();//
		
		for(i=0;i<7;i++){//デバック用CSVから読み込んだ値を表示
			printfDx("%5d %5d %5d %5d %5d %5d %5d\n",enemy_order[i].cnt,enemy_order[i].pattern,enemy_order[i].knd,enemy_order[i].maxhp,enemy_order[i].x,enemy_order[i].y,enemy_order[i].sp);
		}
		//ループ部分
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 & gpUpdateKey()==0 ){//while(裏画面の物を表画面に写す,メッセージ処理,画面を消去,キーの状態の更新)
			if(mode==0){/*
				memset(enemy,0,sizeof(enemy_t)*enemyMAX);
				memset(enemy_order,0,sizeof(enemy_order_t)*enemyorderMAX);
				loadEstate();*/
				mode=10;
			}
//タイトル画面
			else if(mode==10){
				                                     //計算フェーズ
				Tmove();
				                                     //描画フェーズ
				for( int i=0; i<4; i++ ){ // メニュー項目を描画
					DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
				}


			}
//ゲーム画面
            else if(mode==20){
                                                     //計算フェーズ
				gcnt++;
				Zmove();//自機の移動&自機ショットスイッチ
				zikitama();//自機ショットの計算
				/*if(gcnt==1){//敵パラの設定
					enemy[0].hp=100;
					enemy[0].maxhp=enemy[0].hp;
					enemy[0].x=290;
					enemy[0].y=200;
					enemy[0].knd=0;
					enemy[0].pattern=0;
				}//
				if(gcnt==GAMESTART){//敵出現フラグのON
					enemy[0].flag=1;
				}//*/
				Eenter();
				Epatterncontrol();

                                                     //描画フェーズ
                DrawGraph(20,80,Back1,TRUE);
				for(i=0;i<10;i++){
					if(tama[i].flag==1){
						DrawRotaGraph(tama[i].x,tama[i].y,1.0,gcnt*PI/5,ztama,TRUE);
						SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
						DrawRotaGraph(tama[i].x,tama[i].y,1.0,0.0,ztamakage,TRUE);
						SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
					}
				}
                DrawRotaGraph(ziki.x,444,1.0,0.0,ziki_img[ziki.no],TRUE);
				for(i=0;i<enemyMAX;i++){
					if(gcnt<GAMESTART||enemy[i].flag==1){
						DrawRotaGraphF(enemy[i].x,enemy[i].y,1.0,0.0,imgenemy[enemy[i].knd][(enemy[i].cnt%48)/12],TRUE);
					}
				}
				DrawGraph(0,0,Waku1,TRUE);
				DrawGraph(20,15,Waku2,TRUE);
            }

//終了
			else if(mode==99999){
				break;
			}
 
    }
 
        DxLib_End();    // DXライブラリ終了処理
        return 0;
} 
新しく付け足したのは121~209行目、312~318行目、355、356行目、そして付け足す前は344~354はコメントから外していました。
調べたところ、loadEstate関数、つまり122~170行目のファイルの読み込みの時点で既におかしくなっていると分かりました。ちなみに読み込もうとしたファイルはソリューションファイルと同じフォルダに置いています。
読み込もうとしたファイルも一緒に添付します。どうしたら普通に読み込めるようになるのか、このプログラムではどのような問題が起こっているのかを教えてください、お願いします。
添付ファイル
読み込まれた数値.png
読み込まれた数値.png (48.09 KiB) 閲覧数: 4033 回
Estate.csv
(113 バイト) ダウンロード数: 101 回

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

Re: 龍神録11章のプログラムについての質問

#8

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

気になったところだけ、コメントします。
プログラムついては、また後で。

コード:

inputとinputcという名の64個の空き箱を用意
    |
ファイルを開いて読み始める
    |
iという箱に0を入れる	←ここでiを取り上げるなら「この作業を2回繰り返す」との関連を説明してください。
    |
改行マークが来るまで箱に入れずに飛ばす。この作業を2回繰り返す。
    |
numの箱に0入れ、enemy_orderの0番のセットを用意する
    |
    ☆	←ここのiは何処へ?
    |
次の文字をinputのi番の箱に入れ、inputcのi番の箱にinputのi番の箱に入れた文字と同じ物を入れる。
    |
入れた文字が/だったら改行マークが来るまで飛ばし、現在の箱の番号を便宜上-1にして次の文字を0番に入れる用意をして続行する
    |
入れた文字が , または改行マークだったら今入れたものをスペースに置き換えて※に飛ぶ ← スペースではありません。
    |
入れた物がファイルの最後を表す記号だったら●に飛ぶ
    |
   ☆に飛ぶ
    |
    ※
    |
enemy_orderの用意されたセットのnumの場所にinputcに入れた文字を入れる	←	文字ではありません。それと「numの場所」と言う表現があいまいです。
    |
numに1を足す
    |
numが18以上だったらnumを0に戻しenemy_orderの次のセットを用意する
    |
   ☆に飛ぶ
    |
    ●
    |
ファイルを閉じて終わる
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 龍神録11章のプログラムについての質問

#9

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

あと表示が変な件ですが、enemy_order.x,enemy_order.yの表示する型が間違っています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast
記事: 41
登録日時: 13年前

Re: 龍神録11章のプログラムについての質問

#10

投稿記事 by dast » 13年前

返信が遅くなってすみません。大学でテストやらレポートやら色々あったので・・・
それとご指摘ありがとうございました。表示する型を変えてから試したところ174行目の=の数が足りないことに気づいたので

コード:

if(enemy[I].flag2==0)
と直したら上手くいきました。
お手数おかけしてすみませんでした

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

Re: 龍神録11章のプログラムについての質問

#11

投稿記事 by beatle » 13年前

http://dixq.net/forum/viewtopic.php?f=3&t=9640#p77747において、Dixqさんが改良版を示されています。参考になさってください。

閉鎖

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