課題でゲーム作成をしていますが複数の弾をうまく出すことができません。

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

課題でゲーム作成をしていますが複数の弾をうまく出すことができません。

#1

投稿記事 by ろっさむ » 12年前

お初にお目にかかります、ろっさむと申します。
今回こちらの掲示板にて質問させて頂こうと思ったものは
学校の課題として作っているゲームのシステムの一部です。

ゲーム内容としては中央に教室の画像を出し、その上で
プレイヤーを動かして四方八方から現れる、鉛筆などのアイテムを避けて
三分間耐久するゲームです。

言語はCで、今仮完成しているのはプレイヤーの移動とマップや他キャラのみです。
鉛筆やカバンなどの飛んでくる物体を
ランダムに複数出すようにしてそれぞれが画面端までちゃんと動くようにしたいです。
以下のコードでは複数は出るのですがバグが多く、
途中で左折したりアイテム表示が移動中に別のアイテムの画像に差し替わったりしてしまいます…。
どのようにコードを書き換えれば良いのか、アドバイスを頂きたいです。
よろしくお願いいたします。

NEW_ITEM.cpp

コード:

#include "tool/DxLib.h"
#include "etc1.h"

static int count=0;
static int x[6],y[6];                     //座標を区間に分けている
static int randflag=1,Item_flag[8]={};
static int item[CHIP_ITEM];
static int xrand,yrand,itemrand_flag=0;
static int speed=3;
static int i=0;
static int syokix[6]={},syokiy[6]={},item_rand[6]={};
static int Draw_flag[6];


void ITEM_SET(){

	for(int i=0;i<6;i++){
		x[i]=165+syokix[i]*58;			//165は範囲。x座標を5個の箱にそれぞれ入れておく
		y[i]=80+syokiy[i]*58;			//y座標も同じく
	}
	



	item[0]=LoadGraph("アイテム/スクバ.png");
	item[1]=LoadGraph("アイテム/バスケ.png");
	item[2]=LoadGraph("アイテム/鉛筆.png");
	item[3]=LoadGraph("アイテム/教科書.png"); 
	item[4]=LoadGraph("アイテム/空き缶.png");

}

void ITEM_FLAG(){

	//フラグ生成
	
			if(count%1000==0){//最初の0.5sでフラグ1、5sごとにランダムフラグを立てる
			randflag=1;
			
		}
	

	if(count%100==0){			//0.5sと0.5sごとに実行
		int i =0;
		while(Item_flag[i]!=0)i++;		//0に当たるまでwhile文で実行し続けることによって箱の中を確認し続ける
		Item_flag[i]=1;
	}

}



void ITEM_RAND(){

	//ランダム生成

	if(randflag==1){					//ランダムフラグが立っているのならば実行

		if(itemrand_flag==1){			//更に別のランダムフラグが立っているのならば実行

			xrand=GetRand(5);
			yrand=GetRand(5);
			syokix[i]=xrand;			//syokixの中にはxrandで出た値を格納
			syokiy[i]=yrand;			//shokiyも同様
			item_rand[i]=GetRand(4);	//アイテムの種類を表す数字を格納

		}
		randflag=0;						//ランダムフラグを最後に0にする
	}
	

	count++;

	//デバッグ用

	int Cr=GetColor(255,255,255);
	DrawFormatString(0,0+i*20,Cr,"%d,%d,%d",syokix[i],syokiy[i],item_rand[i]);

	DrawFormatString(400,0,Cr,"%d,%d,%d,time---%d",x[xrand],y[yrand],item[item_rand[i]],count);

}

void ITEM_MOVE(){

	if((syokix[i]==1||syokix[i]==2||syokix[i]==3||syokix[i]==4)&&syokiy[i]==0){				//現れる場所確定
		if(y[i]<=370){
			DrawGraph(x[i],y[i],item[item_rand[i]],TRUE);
			y[i]+=speed;
			itemrand_flag=0;
			Draw_flag[i]=0;
		}else{
			y[i]=80;
			Item_flag[ i ]=0;
			itemrand_flag=1;
			Draw_flag[i]=1;
		}
	}else if((syokix[i]==1||syokix[i]==2||syokix[i]==3||syokix[i]==4)&&syokiy[i]==5){
		if(y[i]>=80){
			DrawGraph(x[i],y[i],item[item_rand[i]],TRUE);
			y[i]-=speed;
			itemrand_flag=0;
			Draw_flag[i]=0;
		}else{
			y[i]=370;
			Item_flag[i]=0;
			itemrand_flag=1;
			Draw_flag[i]=1;
		}
	}else if((syokiy[i]==1||syokiy[i]==2||syokiy[i]==3||syokiy[i]==4)&&syokix[i]==0){
		if(x[i]<=455){
			DrawGraph(x[i],y[i],item[item_rand[i]],TRUE);
			x[i]+=speed;
			itemrand_flag=0;
			Draw_flag[i]=0;
		}else{
			x[i]=165;
			Item_flag[i]=0;
			itemrand_flag=1;
			Draw_flag[i]=1;
		}
	}else if((syokiy[i]==1||syokiy[i]==2||syokiy[i]==3||syokiy[i]==4)&&syokix[i]==5){
		if(x[i]>=165){
			DrawGraph(x[i],y[i],item[item_rand[i]],TRUE);
			x[i]-=speed;
			itemrand_flag=0;
			Draw_flag[i]=0;
		}else{
			x[i]=455;
			Item_flag[i]=0;
			itemrand_flag=1;
			Draw_flag[i]=1;
		}
	}else{
		randflag=1;
	}



}

void ITEM_MAIN(){

	ITEM_FLAG();

	for(i = 0;i<6;i++ ){

		ITEM_RAND();

		if(Item_flag[ i ]==1){

			ITEM_MOVE();
		}

	}
	if(count%100000==0)
		speed+=3;


	
}

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

Re: 課題でゲーム作成をしていますが複数の弾をうまく出すことができません。

#2

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

ちょっとすぐ答えるには難しいので、お待ちください。時間が取れたら見ます。
とりあえずインデントを直したので、それだけ貼っときます。

コードをざっと見てわかったのは何をしているか把握しづらいコードってことですのでバグが出るのも頷けます。

コード:

#include "tool/DxLib.h"
#include "etc1.h"

static int count = 0;
static int x[6], y[6];                    //座標を区間に分けている
static int randflag = 1, Item_flag[8] = {};
static int item[CHIP_ITEM];
static int xrand, yrand, itemrand_flag = 0;
static int speed = 3;
static int i = 0;
static int syokix[6] = {}, syokiy[6] = {}, item_rand[6] = {};
static int Draw_flag[6];


void ITEM_SET() {

	for( int i = 0; i < 6; i++ ) {
		x[i] = 165 + syokix[i] * 58;    //165は範囲。x座標を5個の箱にそれぞれ入れておく
		y[i] = 80 + syokiy[i] * 58;     //y座標も同じく
	}




	item[0] = LoadGraph( "アイテム/スクバ.png" );
	item[1] = LoadGraph( "アイテム/バスケ.png" );
	item[2] = LoadGraph( "アイテム/鉛筆.png" );
	item[3] = LoadGraph( "アイテム/教科書.png" );
	item[4] = LoadGraph( "アイテム/空き缶.png" );

}

void ITEM_FLAG() {

	//フラグ生成

	if( count % 1000 == 0 ) { //最初の0.5sでフラグ1、5sごとにランダムフラグを立てる
		randflag = 1;

	}


	if( count % 100 == 0 ) {    //0.5sと0.5sごとに実行
		int i = 0;
		while( Item_flag[i] != 0 )i++;  //0に当たるまでwhile文で実行し続けることによって箱の中を確認し続ける
		Item_flag[i] = 1;
	}

}



void ITEM_RAND() {

	//ランダム生成

	if( randflag == 1 ) {               //ランダムフラグが立っているのならば実行

		if( itemrand_flag == 1 ) {      //更に別のランダムフラグが立っているのならば実行

			xrand = GetRand( 5 );
			yrand = GetRand( 5 );
			syokix[i] = xrand;          //syokixの中にはxrandで出た値を格納
			syokiy[i] = yrand;          //shokiyも同様
			item_rand[i] = GetRand( 4 ); //アイテムの種類を表す数字を格納

		}
		randflag = 0;                   //ランダムフラグを最後に0にする
	}


	count++;

	//デバッグ用

	int Cr = GetColor( 255, 255, 255 );
	DrawFormatString( 0, 0 + i * 20, Cr, "%d,%d,%d", syokix[i], syokiy[i], item_rand[i] );

	DrawFormatString( 400, 0, Cr, "%d,%d,%d,time---%d", x[xrand], y[yrand], item[item_rand[i]], count );

}

void ITEM_MOVE() {

	if( ( syokix[i] == 1 || syokix[i] == 2 || syokix[i] == 3 || syokix[i] == 4 ) && syokiy[i] == 0 ) { //現れる場所確定
		if( y[i] <= 370 ) {
			DrawGraph( x[i], y[i], item[item_rand[i]], TRUE );
			y[i] += speed;
			itemrand_flag = 0;
			Draw_flag[i] = 0;
		} else {
			y[i] = 80;
			Item_flag[ i ] = 0;
			itemrand_flag = 1;
			Draw_flag[i] = 1;
		}
	} else if( ( syokix[i] == 1 || syokix[i] == 2 || syokix[i] == 3 || syokix[i] == 4 ) && syokiy[i] == 5 ) {
		if( y[i] >= 80 ) {
			DrawGraph( x[i], y[i], item[item_rand[i]], TRUE );
			y[i] -= speed;
			itemrand_flag = 0;
			Draw_flag[i] = 0;
		} else {
			y[i] = 370;
			Item_flag[i] = 0;
			itemrand_flag = 1;
			Draw_flag[i] = 1;
		}
	} else if( ( syokiy[i] == 1 || syokiy[i] == 2 || syokiy[i] == 3 || syokiy[i] == 4 ) && syokix[i] == 0 ) {
		if( x[i] <= 455 ) {
			DrawGraph( x[i], y[i], item[item_rand[i]], TRUE );
			x[i] += speed;
			itemrand_flag = 0;
			Draw_flag[i] = 0;
		} else {
			x[i] = 165;
			Item_flag[i] = 0;
			itemrand_flag = 1;
			Draw_flag[i] = 1;
		}
	} else if( ( syokiy[i] == 1 || syokiy[i] == 2 || syokiy[i] == 3 || syokiy[i] == 4 ) && syokix[i] == 5 ) {
		if( x[i] >= 165 ) {
			DrawGraph( x[i], y[i], item[item_rand[i]], TRUE );
			x[i] -= speed;
			itemrand_flag = 0;
			Draw_flag[i] = 0;
		} else {
			x[i] = 455;
			Item_flag[i] = 0;
			itemrand_flag = 1;
			Draw_flag[i] = 1;
		}
	} else {
		randflag = 1;
	}



}

void ITEM_MAIN() {

	ITEM_FLAG();

	for( i = 0; i < 6; i++ ) {

		ITEM_RAND();

		if( Item_flag[ i ] == 1 ) {

			ITEM_MOVE();
		}

	}
	if( count % 100000 == 0 )
		speed += 3;



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

ろっさむ
記事: 2
登録日時: 12年前
住所: 北海道

Re: 課題でゲーム作成をしていますが複数の弾をうまく出すことができません。

#3

投稿記事 by ろっさむ » 12年前

返信有難うございます。

やりたいことを書いてみますが、わかりづらかったら申し訳ありません。

・x、yをそれぞれ座標を5つ設定し、5区間としています。
 小さい順から shokix[1],shokix[2],shokix[3],shokix[4],shokix[5]; shokiy[1],shokiy[2],shokiy[3],shokiy[4],shokiy[5];
 とすると shokix[1]の時、shokiy[2]又はshokiy[3]又はshokiy[4]のいずれかから弾を発射し右端まで到着後
  shokix[1]を初期化…(これがshokix[5]の時もshokiyのいずれかから弾を発射、左端まで到着後初期化)
shokiy[1]の時、shokix[2]又はshokix[3]又はshokix[4]のいずれかから弾を発射し下端まで到着後
      shokiy[1]を初期化…(これがshokiy[5]の時もshokixのいずれかから弾を発射、上端まで到着後初期化)
 という形にしたいです。

・友人に知恵を借りた結果whileでフラグの中身が0に当たるまでループして確認し続ける部分が追加されましたが
 説明を聞いても理解できませんでした…。

・speedを足していって端まで到着した後、すぐにランダムフラグを立てて次の弾がどこからか出るようにしたいです。

・左折や右折、途中でアイテム表示が変わるなどはなくて、一度表示されたアイテムがそのままの表示でまっすぐ端まで飛ばさせたいです。

・できれば同じ場所に連続して表示されるのではなくすべての弾がバラバラの区間から発射されるようにしたいのですがやり方がイマイチわからないです…。

上記のようなプログラムを打ち込みたいのですが書き方が思いつきません…。
いろいろ調べたり一ヶ月は悩んでいるのですが…助けていただきたく思います。
よろしくお願いします…。

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

Re: 課題でゲーム作成をしていますが複数の弾をうまく出すことができません。

#4

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

すいません。日本語での仕様説明がよく分かりません。
これを整理できたらプログラムも整理できてくると思います。

5つのポイント(区間? 区間の意味がよく分かりません)から弾(アイテム)が発射されることは分かりました。
では、次のことをできるだけ簡単に説明してみてください。
(1)発射条件
(2)発射方向
(3)消滅する条件

5つのポイント(区間)の具体例もお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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