私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

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

私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

#1

投稿記事 by アップルミスト » 14年前

DXライブラリを使用しています。エラーの際、どこが間違っているのかすぐに見つけ出す方法はないですか?ソースが長くなると泣けてきます。
このソースだと、一瞬でてきて消えてしまいます。



コード:

#include "DxLib.h"
#include "math.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);
	if(DxLib_Init()== -1)
		return -1;
		SetDrawScreen(DX_SCREEN_BACK);
		char Key[256];
		int pgh;
		int px,py;
		int bgh;
		int bx[1000],by[1000];
		int bflag[1000];
		int i;
		int cool_time;
		int egh;
		int ex[50],ey[50];
		int eflag[50];
		int e_counter;
		int psizex,psizey;
		int bsizex,bsizey;
		int esizex,esizey;
		int jx[1],jy[1];//3
		int jflag[1];//3
		int j=0;
		int jgh;//3

		int game_state=0;//t
		int white=GetColor(255,255,255);//t
		char OldKey[256];//t

		int titlebgm;//m
		int bgmflag;//m

		int score=0;//s

		int anbgm;//a

		int hadakabgm;//h
		
		
		titlebgm=LoadSoundMem("title.mp3");//m
		bgmflag=0;

		anbgm=LoadSoundMem("an.mp3");//a

		hadakabgm=LoadSoundMem("hadaka.mp3");//h

		jgh=LoadGraph("jyo.jpg");//3


		
		px = 270;
			py = 400;
			pgh=LoadGraph("p.jpg");
			for(i=0;i<1000;i++){
				bx[i]=0;
				by[i]=0;
				bflag[i]=0;
			}

        bgh=LoadGraph("b.jpg");
		cool_time=0;



		for(i=0;i<50;i+=1){
			ex[i]=0;
			ey[i]=0;
			eflag[i]=0;
		}
		e_counter=0;
		egh=LoadGraph("ee.jpg");





		psizex=20;
		psizey=20;
		bsizex=15;
		bsizey=10;
		esizex=45;
		esizey=40;




		for(i=0;i<256;i+=1)//t
		{//t
			Key[i]=0;//t
			OldKey[i]=0;//t
		}//t

         







			for(;;)
			{
				for(i=0;i<256;i+=1)//t
				{//t
					OldKey[i]=Key[i];//t
				}//t
				
				
				
				
				GetHitKeyStateAll(Key);









				switch(game_state){//t
				case 0://t
					
					if(bgmflag==0)//m
					{//m
						PlaySoundMem(titlebgm,DX_PLAYTYPE_LOOP);//m
						bgmflag=1;//m
					}//m
					
					
					
					
					
					
					score=0;
					SetFontSize(32);//t
					DrawString(100,100,"3-1シューティング(試作版)",white);//t
					SetFontSize(10);//t
					DrawString(100,150,"※現段階では、迫ってくる増村を愛をもって延々と打ち落とすor避けるゲームです",white);//t
					SetFontSize(16);//t
					DrawString(100,400,"スペースキー→ゲーム開始and弾発射",white);
					if(Key[KEY_INPUT_SPACE]==1&&OldKey[KEY_INPUT_SPACE]!=1)//t
					{//t
						game_state=1;//t
						StopSoundMem(titlebgm);//m
						bgmflag=0;//m
					}//t
					break;//t
				









				case 1://t

					if(bgmflag==0)//h
					{//h
						PlaySoundMem(hadakabgm,DX_PLAYTYPE_LOOP);//h
						bgmflag=1;//h
					}//h


				//{
					
					if(cool_time<0){
						for(i=0;0<1000;i+=1){
							if (bflag[i]==0){

								break;
							}

						}

						if(i<1000){
							bflag[i]=1;
							bx[i]=px+5;
								by[i]=py;
								cool_time=20;
						}
					}if(Key[KEY_INPUT_LEFT]==1)//左
				{
					px-=3;
				}
				if(Key[KEY_INPUT_RIGHT]==1)//右
				{
				    px+=3;
				}
				if(Key[KEY_INPUT_UP]==1)//上
				{
					py-=3;
				}
				if(Key[KEY_INPUT_DOWN]==1)//下
				{
					py+=3;
				}
				if(Key[KEY_INPUT_SPACE])
				{
				cool_time-=1;

				for(i=0;i<1000;i+=1){
					if(bflag[i]==1){
						by[i]-=20;
							if(by[i]<0){
								bflag[i]=0;
							}
					}
				}
				


				if(e_counter%3==0)
				{
					for(i=0;i<50;i+=1)
					{
						if(eflag[i]==0)
						{
							break;
						}
					}
					if(i<50)
					{
						eflag[i]=1;
						ex[i]=GetRand(640);
						ey[i]=0;
					}
				}
				e_counter+=1;


				for(i=0;i<50;i+=1)
				{
					if(eflag[i]==1)
					{
						ey[i]+=3;
						if(ey[i]>480)
						{
							eflag[i]=0;
						}
					}
				}





				for(i=0;i<20;i+=1)
				{
					for(j=0;j<50;j+=1)
					{
						if(bflag[i]==1&&eflag[j]==1)
						{
							if(bx[i]<ex[j]+esizex && bx[i]+bsizex >ex[j] && by[i]<ey[j]+esizey && by[i]+bsizey>ey[j])
							{
								bflag[i]=0;
								eflag[j]=0;
								score+=10;//s
								PlaySoundMem(anbgm,DX_PLAYTYPE_BACK);//a
							}
						}
					}
				}





				for(i=0;i<50;i+=1)
				{
					if(eflag[i]==1)
					{
						if(ex[i]<px+psizex && ex[i]+esizex>px && ey[i]<py+psizey && ey[i]+esizey>py)
						{
							StopSoundMem(hadakabgm);
							eflag[i]=0;
							game_state=2;//t
							bgmflag=0;
						}
					}
				}


				if(score>=1000)//3
				{//3
					game_state=3;//3
				}//3











			
				








							

				DrawGraph(px-15,py-20,pgh,TRUE);
				for(i=0;i<50;i+=1){
				if(bflag[i]==1)
				{
					DrawGraph(bx[i],by[i],bgh,TRUE);
				}
				}
				


				for(i=0;i<50;i+=1)
				{
					if(eflag[i]==1){
						DrawGraph(ex[i],ey[i],egh,TRUE);
					}
				}
				

				DrawFormatString(0,0,GetColor(255,255,255),"得点☆%d",score);//s

				
				break;//t

				

				case 2://t
					SetFontSize(20);//t
				    DrawString(100,300,"増村の愛を受けたのでゲームオーバーです",white);//t
					DrawFormatString(100,400,GetColor(255,255,255),"得点☆%d",score);//s

					if(Key[KEY_INPUT_SPACE]==1&&OldKey[KEY_INPUT_SPACE]!=1)//t
					{//t
						for(i=0;i<1000;i+=1)//t
						{//t
							bflag[i]=0;
						}//t
						for(i=0;i<50;i+=1)//t
						{//t
							eflag[i]=0;//t
						}//t
						px=270;//t
						py=400;//t

						game_state=0;//t
					}//t

					break;//t
					

				case 3://3
					
					
					








default://t
					break;//t
					}//t
					

					
					
				
					


				ScreenFlip();
				ClearDrawScreen();
				if(Key[KEY_INPUT_ESCAPE]==1)
				{
					break;
				}
				
				if(ProcessMessage()==-1)
				{
					break;
				}
				
				}
				


				
			DxLib_End();
			return 0;
			
	}





}

jay
記事: 314
登録日時: 15年前
住所: 大阪市
連絡を取る:

Re: 私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

#2

投稿記事 by jay » 14年前

これは・・・とてつもなく読みづらいですね(汗)

とりあえずは余計な空白は削除して、読みやすくしてみてはどうでしょうか?
エラーを見つけて修正するにもごちゃごちゃしているよりはスッキリしたコードの方が読みやすいですからね。

ついでにフォーラムルールにも書いてありますが、質問はなるべく具体的に書いてくださった方が(何がしたいのか、その為にどんな事をしたのか、結果どうなったのか等)こちらとしても答えやすいです。
何をしたいのか分からないのにどこを直せばいいか教えることが出来る訳はないですしね(苦笑)


さて、ここからが本題です
ざっとコードを見てみましたが、メインループを書く際には必須のProcessMessage関数が見当たりませんね。

その他プログラムをゲームとして動かす為に最低限必要なモノが根本的に欠如しているように思えます。
まずは新・ゲームプログラミングの館等を参考にして、基礎の基礎から勉強してみてはどうでしょうか?


ちなみにエラーを早く見つける方法としては、Visual Studioのデバッグ機能を使いこなすのが一番だと思います
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: 私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

#3

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

一箇所変な所はありますが、
<!-- m --><a class=\"postlink\" href=\"default://t\">default://t</a><!-- m -->
それ以外はエラーはありません。
弾丸オネエ さんが書きました:DXライブラリを使用しています。エラーの際、どこが間違っているのかすぐに見つけ出す方法はないですか?ソースが長くなると泣けてきます。
このソースだと、一瞬でてきて消えてしまいます。
エラーと言うより動作のことを言っていると思うのですが、これはエラーではなくバグといいます。

兎にも角にも、
・ソースを綺麗に書くこと。
・コメントを書くこと。
・ちゃんとインデントを整理すること。
・機能別に関数に分けすること。
・データを構造体にまとめること。
・DXライブラリの基本を勉強すること。
・変数名を極端に省略しないこと。
・定数はconst intかenumを使う。
をまず実践して下さい。

他人が読み辛いプログラムは自分にも分かり辛いプログラムです。
他人にも自分にも読みやすくを合言葉に。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アップルミスト

Re: 私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

#4

投稿記事 by アップルミスト » 14年前

ソースを見やすく書き直してみたら直りました。まだ僕の技量は及ばないのでなんともいえませんが、後で比較結果を挙げたいと思います。

コード:

#include "DxLib.h"
#include "math.h"
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if(DxLib_Init()==-1)
		return-1;
	SetDrawScreen(DX_SCREEN_BACK);
	char Key[256];
	int pgh;
	int px,py;
	int bgh;
	int bx[1000],by[1000];
	int bflag[1000];
	int i;
	int cool_time;
	int egh;
	int ex[50],ey[50];
	int eflag[50];
	int e_counter;
	int psizex,psizey;
	int bsizex,bsizey;
	int esizex,esizey;
	int j=0;
	int game_state=0;
	int white=GetColor(255,255,255);
	char OldKey[256];
	int titlebgm;
	int bgmflag;
	int score=0;
	int anbgm;
	int hadakabgm;

	titlebgm=LoadSoundMem("title.mp3");
	bgmflag=0;
	anbgm=LoadSoundMem("an.mp3");
	hadakabgm=LoadSoundMem("hadaka.mp3");
	px=270;
	py=400;
	pgh=LoadGraph("p.jpg");
	for(i=0;i<1000;i++)
	{
		bx[i]=0;
		by[i]=0;
		bflag[i]=0;
	}
	bgh=LoadGraph("b.jpg");
	cool_time=0;
	for(i=0;i<50;i+=1)
	{
		ex[i]=0;
		ey[i]=0;
		eflag[i]=0;
	}
	e_counter=0;
	egh=LoadGraph("ee.jpg");
	psizex=20;
	psizey=20;
	bsizex=15;
	bsizey=10;
	esizex=45;
	esizey=40;
	for(i=0;i<256;i+=1)
	{
		Key[i]=0;
		OldKey[i]=0;
	}

	for(;;)
	{
		for(i=0;i<256;i+=1)
		{
			OldKey[i]=Key[i];
		}
		GetHitKeyStateAll(Key);
		switch(game_state)
		{
		case 0:
			if(bgmflag==0)
			{
				PlaySoundMem(titlebgm,DX_PLAYTYPE_LOOP);
				bgmflag=1;
			}
			score=0;
			SetFontSize(32);
			DrawString(100,100,"3-1シューティング(試作版)",white);
			SetFontSize(10);
			DrawString(100,150,"現段階では、迫ってくる増村を愛をもって延々と打ち落とすor避けるゲームです",white);
			SetFontSize(16);
			DrawString(100,400,"スペースキーでゲームスタート!",white);
			if(Key[KEY_INPUT_SPACE]==1&&OldKey[KEY_INPUT_SPACE]!=1)
			{
				game_state=1;
				StopSoundMem(titlebgm);
				bgmflag=0;
			}
			break;

		case 1:
			if(bgmflag==0)
			{
				PlaySoundMem(hadakabgm,DX_PLAYTYPE_LOOP);
				bgmflag=1;
			}

			if(Key[KEY_INPUT_LEFT]==1)
			{
				px-=3;
			}
			if(Key[KEY_INPUT_RIGHT]==1)
			{
				px+=3;
			}
			if(Key[KEY_INPUT_UP]==1)
			{
				py-=5;
			}
			if(Key[KEY_INPUT_DOWN]==1)
			{
				py+=5;
			}
			if(Key[KEY_INPUT_SPACE])
			{
				if(cool_time<0)
				{
					for(i=0;i<1000;i+=1)
					{
						if(bflag[i]==0)
						{
							break;
						}
					}
					if(i<1000)
					{
						bflag[i]=1;
						bx[i]=px+5;
						by[i]=py;
						cool_time=20;
					}
				}
			}
			cool_time-=1;
			for(i=0;i<1000;i+=1)
			{
				if(bflag[i]==1)
				{
					by[i]-=20;
					if(by[i]<0)
					{
						bflag[i]=0;
					}
				}
			}
			if(e_counter%3==0)
			{
				for(i=0;i<50;i+=1)
				{
					if(eflag[i]==0)
					{
						break;
					}
				}
				if(i<50)
				{
					eflag[i]=1;
					ex[i]=GetRand(640);
					ey[i]=0;
				}
			}
			e_counter+=1;
			for(i=0;i<50;i+=1)
			{
				if(eflag[i]==1)
				{
					ey[i]+=3;
					if(ey[i]>480)
					{
						eflag[i]=0;
					}
				}
			}
			for(i=0;i<1000;i+=1)
			{
				for(j=0;j<50;j+=1)
				{
					if(bflag[i]==1&&eflag[j]==1)
					{
						if(bx[i]<ex[j]+esizex&&bx[i]+bsizex>ex[j]&&by[i]<ey[j]+esizey&&by[i]+bsizey>ey[j])
						{
							bflag[i]=0;
							eflag[j]=0;
							score+=10;
							PlaySoundMem(anbgm,DX_PLAYTYPE_BACK);
						}
					}
				}
			}
			for(i=0;i<50;i+=1)
			{
				if(eflag[i]==1)
				{
					if(ex[i]<px+psizex&&ex[i]+esizex>px&&ey[i]<py+psizey&&ey[i]+esizey>py)
					{
						eflag[i]=0;
						StopSoundMem(hadakabgm);
						game_state=2;
						bgmflag=0;
					}
				}
			}
			DrawGraph(px-15,py-20,pgh,TRUE);
			for(i=0;i<1000;i+=1)
			{
				if(bflag[i]==1)
				{
					DrawGraph(bx[i],by[i],bgh,TRUE);
				}
			}
			for(i=0;i<50;i+=1)
			{
				if(eflag[i]==1)
				{
					DrawGraph(ex[i],ey[i],egh,TRUE);
				}
			}
			DrawFormatString(0,0,GetColor(255,255,255),"得点☆%d",score);
			break;
			case 2:
				SetFontSize(20);
				DrawString(100,300,"増村の愛を受けたのでゲームオーバーです",white);
				DrawFormatString(100,400,GetColor(255,255,255),"得点☆%d",score);
				if(Key[KEY_INPUT_SPACE]==1&&OldKey[KEY_INPUT_SPACE]!=1)
				{
					for(i=0;i<1000;i+=1)
					{
						bflag[i]=0;
					}
					for(i=0;i<10;i+=1)
					{
						eflag[i]=0;
					}
					px=200;
					py=400;
					game_state=0;
				}
				break;
			default:
				break;
				}
				ScreenFlip();
				ClearDrawScreen();
				if(Key[KEY_INPUT_ESCAPE]==1)
				{
					break;
				}
				if(ProcessMessage()==-1)
				{
					break;
				}
				}
				DxLib_End();
				return 0;
				}

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

Re: 私はどうしようもない雑魚ですが、どこを直せばいいか教えてください。

#5

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

とりあえずインデントに気をつけるだけでもバグは減りますので心がけてみて下さい。
あとは2012年3月08日(木) 09:39 に書いた注意事項に気を配れると格段に良くなります。
これが出来ないと大きなプログラムを組むことが難しいので地道ですが実践してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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