ページ 11

DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 01:34
by naponapo
自分で画面スクロール型で記号*が動いて見えるような迷路ゲームを試しに作ってみたくて
コードを書いたのですが、初心者すぎてどこが間違っているのかわからなくて困っています。
ちょっと長いですが、いろいろ間違っている予感がしますが、よろしければ間違いをおしえてくださいm(_ _)m

コード:

#include <DxLib.h>
 char key[256];   // ↓ 迷路の全体図で、0が通れて1が通れないようにしたい
 int map[53][43]={ 1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	                1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	
	                     1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	                    1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
				                     
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
				 
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
			      1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
			      1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
		   	      1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				   
				  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
				  
	              1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

                  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
				  
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	              1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
				 
				  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
				  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1
 };


 int chara[5][5]; //1マス128*128サイズで ウィンドウ画面にはおよそ25マス分が映るようにしたい *が中央に位置する
        int X=50,Y=2; // 記号*のmap[53][43]上での初期位置  ちなみにゴールはまだ設定していない
		
		
void gpKeyStateAll(){ //全キー入力情報             関数①
	   char a[256];
	   GetHitKeyStateAll(a);
	   for(int i=0;i<256;i++){
	     if(a[i]==1)
			 key[i]++;
		 else
			 key[i]=0;
	   
	   };


}

void def(int chara[][5]){ // 中央の記号*の周りの25マスをmapから定義する     関数②
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			*(chara[i]+j)=map[X-i-2][Y-j-2];


}


int MovableJudge(){  //各方向に進もうとするとき直後のマスが0になっているかを判断したい    関数③
	
	if(key[KEY_INPUT_UP]==1 && chara[1][2]==0)
		return 0;
    if(key[KEY_INPUT_DOWN]==1&&chara[3][2]==0)
		return 1;
	
    if(key[KEY_INPUT_RIGHT]==1&&chara[2][3]==0)
		return 2;
    if(key[KEY_INPUT_LEFT]==1&&chara[2][1]==0)
		return 3;
	else
		return-1;
}

void SetScreen(int *p,int *q){ //関数③の戻り値を受けて 記号の周り25マスを再定義      関数④
	
	switch( MovableJudge()){
case 0:
		*q-=1;
	    def(chara);
		break;
case 1:
		*q+=1;
		def(chara);
		break;
case 2:
		*p+=1;
		def(chara);
		break;
case 3:
		*p-=1;
		def(chara);
		break;
case -1:
		def(chara);
		break;
	};




}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){             //main関数
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
		
		int color=GetColor(255,255,255);
		
		SetFontSize(128);
		
		
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
		//計算フェイズ
			def(chara);
			
			gpKeyStateAll();
			
			int MovableJudge();
			
			void SetScreen(int &X,int &Y);

			
			
			
		//描画フェイズ	
			for(int i=0;i<5;i++)
				for(int j=0;j<5;j++)
					if(chara[i][j]==1)
					DrawBox(i*128,j*128,(i+1)*128,(j+1)*128,color,TRUE);  // 画面で1の通れないところを白で塗る
		   DrawFormatString(256,256,color,"*");  //記号は画面中央で固定
		    
		   
		    
		   
		
		};


		
        DxLib_End();
        return 0;

 }

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 01:41
by naponapo
エラーコードは
.exeを開いて書き込むことができません。
でした

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 10:11
by softya(ソフト屋)
それは、ビルド時の最後でexeファイルの書き換えに失敗した時に出るエラーです。
原因はexeが実行中ってことで何らかの原因でexeが終了していません。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 11:55
by naponapo
そうでした
別のexeが実行中のままでした
よってエラーは全て消えて、このファイルを実行できるようにはなったのですが、やはり思ったようにスクロールしてくれません
あともう一回コードを載せます
こっちは、vc++2010のエディタから直接写したので、変なエラーは出てないと思います

コード:

#include <DxLib.h>
 char key[256];// ↓ 迷路の全体図で、0が通れて1が通れないようにしたい
 int map[53][43]={1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
                  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
    
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
                                     
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
                 
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                   
                  1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
                  
                  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
 
                  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,
                  
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                  1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
                 
                  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
                  1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1
 };
 
 
 int chara[5][5];//1マス128*128サイズで ウィンドウ画面にはおよそ25マス分が映るようにしたい *が中央に位置する
        int X=50,Y=2;// 記号*のmap[53][43]上での初期位置  ちなみにゴールはまだ設定していない
        
        
void gpKeyStateAll(){//全キー入力情報             関数①
       char a[256];
       GetHitKeyStateAll(a);
       for(int i=0;i<256;i++){
         if(a[i]==1)
             key[i]++;
         else
             key[i]=0;
       
       };
 
 
}
 
void def(int chara[][5]){// 中央の記号*の周りの25マスをmapから定義する     関数②
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            *(chara[i]+j)=map[X-i-2][Y-j-2];
 
 
}
 
 
int MovableJudge(){//各方向に進もうとするとき直後のマスが0になっているかを判断したい    関数③
    
    if(key[KEY_INPUT_UP]==1 && chara[1][2]==0)
        return 0;
    if(key[KEY_INPUT_DOWN]==1&&chara[3][2]==0)
        return 1;
    
    if(key[KEY_INPUT_RIGHT]==1&&chara[2][3]==0)
        return 2;
    if(key[KEY_INPUT_LEFT]==1&&chara[2][1]==0)
        return 3;
    else
        return-1;
}
 
void SetScreen(int *p,int *q){//関数③の戻り値を受けて 記号の周り25マスを再定義      関数④
    
    switch( MovableJudge()){
case 0:
        *q-=1;
        def(chara);
        break;
case 1:
        *q+=1;
        def(chara);
        break;
case 2:
        *p+=1;
        def(chara);
        break;
case 3:
        *p-=1;
        def(chara);
        break;
case -1:
        def(chara);
        break;
    };
 
 
 
 
}
 
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){//main関数
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
        
        int color=GetColor(255,255,255);
        
        SetFontSize(128);
        
        
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
        //計算フェイズ
            def(chara);
            
            gpKeyStateAll();
            
            int MovableJudge();
            
            void SetScreen(int &X,int &Y);
 
            
            
            
        //描画フェイズ    
            for(int i=0;i<5;i++)
                for(int j=0;j<5;j++)
                    if(chara[i][j]==1)
                    DrawBox(i*128,j*128,(i+1)*128,(j+1)*128,color,TRUE);// 画面で1の通れないところを白で塗る
           DrawFormatString(256,256,color,"*");  //記号は画面中央で固定
            
           
            
           
        
        };
 
 
        
        DxLib_End();
        return 0;
 
 }

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 12:10
by usao
ちらっと見た感じですが 100行目の
> *(chara+j)=map[X-i-2][Y-j-2];
が不自然に見えますね.

*(chara+j)=map[X+i-2][Y+j-2];
だったりしませんか?
オフトピック
Xが縦方向で,Yが横方向なんでしょうか.
自分がいつも使ってる方向と違うだけですごい読みにくいものですね.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 12:26
by naponapo
そうでした!
おかげさまで、スタート位置は自分が思っていたところに来た気がします
100行目を*(chara+j)=map[Y+i-2][X+j-2];に変更してみました
でも、スクロールしてくれません
これは関数③や関数④あたりがまちがっているのでしょうか
それともなにか必要な関数が抜けていますか?

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:10
by softya(ソフト屋)
スクロールは自分でするものですから、画面に対してマップの表示位置をずらしてやらないといけません。自キャラは表示位置は固定位置ですよね?

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:15
by usao
>スクロールしてくれません

もっと具体的に説明しないとわかりません.どういう状態なのでしょう.
・キー操作で何かしら動くのだけれども,明らかに意図した動作ではない(…と見えるなら,なぜそう判断できるのか,という情報もあれば)
・キーをいくら押そうが何の変化もない.
・その他

あと,うまくいかないときは自分でデバッグするべきです.
「初期状態から,あるキーを押した後では,ある変数の値はこうあるべき」
「…なんだけど,動作を見た感じではそうなってないっぽい」
みたいなことがあるでしょうから,そこらへんの動作に関係する
変数の値等をprintf()とかで表示してみて何が起こっているのかを確認するとかしましょう.
(デバッガでステップ実行とかできるならもっと楽です.)


>100行目を*(chara+j)=map[Y+i-2][X+j-2];に変更してみました

ん? 何か XとYが入れ替わりましたか?
少なくともあなたの決めたルールの上で XとYが何を表すのかをコード上で統一すべきだと思いますよ.

あと,
>//計算フェイズ
>def(chara);
>gpKeyStateAll();
>int MovableJudge();
>void SetScreen(int &X,int &Y);
↑ここのintとかvoidとかは要らぬのでは.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:18
by usao
>スクロールは自分でするものですから、画面に対してマップの表示位置をずらしてやらないといけません。自キャラは表示位置は固定位置ですよね?

多分,自分の周囲の領域だけが見えてるタイプ(DQ1のたいまつ状態みたいな)で,
移動に合わせて,その見えている範囲分の地形データを毎回 chara に持ってきていて
表示は常にその chara を見て行っているのだと思いますから,
うまく動作してれば,まぁ「勝手に」スクロールする感じ,というかだと思います.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:22
by softya(ソフト屋)
usao さんが書きました:>スクロールは自分でするものですから、画面に対してマップの表示位置をずらしてやらないといけません。自キャラは表示位置は固定位置ですよね?

多分,自分の周囲の領域だけが見えてるタイプ(DQ1のたいまつ状態みたいな)で,
移動に合わせて,その見えている範囲分の地形データを毎回 chara に持ってきていて
表示は常にその chara を見て行っているのだと思いますから,
うまく動作してれば,まぁ「勝手に」スクロールする感じ,というかだと思います.
あっ、コピーしてますね。
問題の有る最新コードを提示してもらわないと分からないですね。
あと出来ればインデントを直して欲しいです。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:41
by naponapo
はいXYは入れ替えました
そこだけ、統一されてなかったので、、(自分もこの方向のほうがわかりやすいです)
方向キーを押しても画面が動かないのです
自キャラの位置は固定です
デバッグをいままであまり使ったことなかったので勉強します(初歩的なコードしかつくってなかったので、デバッグのありがたみがわかってないです汗)
インデント

コード:

#include <DxLib.h>
char key[256];// ↓ 迷路の全体図で、0が通れて1が通れないようにしたい
int map[53][43]={1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1
};


int chara[5][5];//1マス128*128サイズで ウィンドウ画面にはおよそ25マス分が映るようにしたい *が中央に位置する
int X=50,Y=2;// 記号*のmap[53][43]上での初期位置  ちなみにゴールはまだ設定していない


void gpKeyStateAll(){//全キー入力情報             関数①
	char a[256];
	GetHitKeyStateAll(a);
	for(int i=0;i<256;i++){
		if(a[i]==1)
			key[i]++;
		else
			key[i]=0;

	};


}

void def(int chara[][5]){// 中央の記号*の周りの25マスをmapから定義する     関数②
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			*(chara[i]+j)=map[Y+i-2][X+j-2];


}


int MovableJudge(){//各方向に進もうとするとき直後のマスが0になっているかを判断したい    関数③

	if(key[KEY_INPUT_UP]==1 && chara[1][2]==0)
		return 0;
	if(key[KEY_INPUT_DOWN]==1&&chara[3][2]==0)
		return 1;

	if(key[KEY_INPUT_RIGHT]==1&&chara[2][3]==0)
		return 2;
	if(key[KEY_INPUT_LEFT]==1&&chara[2][1]==0)
		return 3;
	else
		return-1;
}

void SetScreen(int *p,int *q){//関数③の戻り値を受けて 記号の周り25マスを再定義      関数④

	switch( MovableJudge()){
	case 0:
		*q-=1;
		def(chara);
		break;
	case 1:
		*q+=1;
		def(chara);
		break;
	case 2:
		*p+=1;
		def(chara);
		break;
	case 3:
		*p-=1;
		def(chara);
		break;
	case -1:
		def(chara);
		break;
	};




}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){//main関数
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	int color=GetColor(255,255,255);

	SetFontSize(128);


	while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
		//計算フェイズ
		def(chara);

		gpKeyStateAll();

		int MovableJudge();

		void SetScreen(int &X,int &Y);




		//描画フェイズ    
		for(int i=0;i<5;i++)
			for(int j=0;j<5;j++)
				if(chara[i][j]==1)
					DrawBox(i*128,j*128,(i+1)*128,(j+1)*128,color,TRUE);// 画面で1の通れないところを白で塗る
		DrawFormatString(256,256,color,"*");  //記号は画面中央で固定





	};



	DxLib_End();
	return 0;

}

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 13:45
by softya(ソフト屋)
そういえば、WinMainにあるこれですが

コード:

        int MovableJudge();
 
        void SetScreen(int &X,int &Y);
関数の宣言であって関数を呼び出しているわけではありません。デバッガを使えば分かりますよ。
MovableJudgeの戻り値を使っている所も見当たりません。

【追記】
失礼しました。 SetScreenでMovableJudgeを呼び出してますね。
ただ、SetScreenが呼び出されていないので、このままだと動きません。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 14:15
by usao
キーを押しても変化がないのであれば,疑うべき事柄は,例えば

(1)そもそもキーの押下状態を判定している箇所に処理が来ているか
(2) (1)がOKでも,キーの押下が正しく判定できているのか
(3) (2)までOKなら押下した先の処理に問題がある

といった感じでいろいろとあるハズ.

例えば,最も根本的な(1)を調べるには,キー判定処理を行っている関数の先頭あたりに
 printf( "ここに処理がきたよー" ); //printf()が使えないのだとしても何らかの代替手段で.
みたいなのを追加して実行してみることです.
これが表示されなければそもそも処理が来ていないことがわかります.
(2)であれば,キーの種類に応じたswitchのcaseの箇所とかに同様のことを仕込めばいいわけです.

そうやって 根本的なことが大丈夫か?→詳細処理内容の妥当性 という方向に調べていけば
問題箇所のありかを追い詰めていくことができるわけですね.

デバッガは便利な道具でしかないので,使い方がどうの という話が現状で足かせになるようであれば
現状のコードは規模が小さいですから,このような原始的な(?)方法によるデバッグ作業でも十分でしょう.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 14:17
by softya(ソフト屋)
usaoさんの書いたことに関連して私の書いたデバッグ技法の日記を貼っておきます。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 14:19
by naponapo
いま softyaさんとusaoさんに指摘していただいた
main関数の中の関数の前にある不要なint voidを除いたら、キーに応じて画面が動くようになりました!
でも、上キーを押しても上に行ってないような気がするので、ちょっと考えてみます

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 14:23
by softya(ソフト屋)
コードの全体的な特徴として、
・x,yの区別が混乱がちな所がバグを助長しています。
余り考えなくてもx,yを使えるようを工夫して下さい。 配列ならx,yの順番を名前に入れると間違えづらくなります。 ← map_y_xとかの名前ですね。
case 0:とかも、case MOVE_Y_MINUS:なら間違えないはずです。 ← enumを使います。 [修正]

・データの流れが、引数だったりグロバール変数を直接使ったりと入り乱れているのでデータの変化が掴みづらいです。これもバグの原因となります。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 17:58
by naponapo
自分でいろいろと試した結果、うまく動かすことができるようになりました!
①初期位置のXとYが
   X=50、Y=2ではなくX=2、Y=50でした
②DrawBox関数の二点の座標の引数にある i と j が逆でした

softyaさんのご指摘通り、自分は座標XYと行列 map の行と列の対応関係に混乱していたようです
これからは注意したいと思います!
もう一つのご指摘は、グローバル変数名と関数の仮引数が同じ名前でデータの流れが掴みづらいということでしょうか
これはmain関数内で他の関数を使うときに、入れるべき引数が何かということを後で混乱しないように仮引数名にグローバル変数と同じ名前をつけたのですが、たしかに分かりづらいですね

みなさんのアドバイスのおかげで、スクロールに成功しました
本当にありがとうございました!

おかげさまで解決したのですが、これでは動けている感がすこし欠けているので、動ける0のマスをまだら模様に色をつけたいのですが
その場合は、map[53][43]の色をつけたい部分の要素を0から例えば2に変えて区別化して、他の関数をそれに合わせて修正して、2の部分にDrawBox関数を使うというのが一番効率的な方法なのでしょうか
要素を書き換えるのは手間がかかるので他に方法があれば紹介して欲しいのですが、、、

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 18:06
by usao
>要素を書き換えるのは手間がかかるので

いやいや,
そういった方法で実現するのであれば,その書き換える作業は人手でやらなくてもいいですよね.

例えば,mainの最初あたりで
map[][]の0の要素を2に書き換える処理を書けばいいのでは.

コード:

for( int y=0; y<53; y++ )
{
  for( int x=0; x<43; x++ )
  {
    if( map[y][x]==0  &&  (x+y)が偶数 )
    {  map[y][x] = 2;  }
  }
}
みたいな感じでてきとーに…

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 18:20
by naponapo
たしかに、そうすれば簡単でしたね  危なかったです
それでやってみます
他の装飾も自分で頑張ってみます!
デバッグは貼っていただいたリンクをありがたく活用させていただきます
どうもありがとうございました

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 18:30
by usao
オフトピック
>これでは動けている感がすこし欠けているので

このことについてですが,わざと極端に視界を狭く制限しているゲームなのであれば
わざとそのままにしておいた方がいい,という話もあるかもしれませんよ.
例えば,床に何の変化もなければ,
大広間みたいな箇所で,今空間のどこらへんにいるのか?といった感覚をより狂わせることができるかも.
(まぁプレイヤがキーを押した回数を数えることはできるけれども)
なので,個人的な好みで言えば,パターンを設けるのだとすれば床よりも壁側の方かな,とか.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 21:14
by softya(ソフト屋)
うまく行ったみたいで良かったです。
できれば最終ソースコードを貼って頂けると助かります。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 23:48
by naponapo
これから、まだ少し機能を加えたいと思っていますが一応、今はこんな感じになりました!

コード:

#include <DxLib.h>

char key[256];// ↓ 迷路の全体図で、0が通れて1が通れないようにしたい

int map[53][43]={1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1, 0,0,0,0, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 0,0,0,0, 1,1,

	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,
	1,1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 0, 0,0,0,0, 1,1,

	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1,
	1,1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1, 1,1,1,1, 1,1
};


int chara[5][5];//1マス128*128サイズで ウィンドウ画面にはおよそ25マス分が映るようにしたい *が中央に位置する
int X=2,Y=50;

void gpKeyStateAll(){//全キー入力情報             関数①
	char a[256];
	GetHitKeyStateAll(a);
	for(int i=0;i<256;i++){
		if(a[i]==1)
			key[i]++;
		else
			key[i]=0;

	};


}

void def(int chara[][5]){// 中央の記号*の周りの25マスをmapから定義する     関数②
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			*(chara[i]+j)=map[Y+i-2][X+j-2];


}


int MovableJudge(){//各方向に進もうとするとき直後のマスが0になっているかを判断したい    関数③

	if(key[KEY_INPUT_UP]>1 && (chara[1][2]==0|| chara[1][2]==2))
		return 0;
	if(key[KEY_INPUT_DOWN]>1&&(chara[3][2]==0||chara[3][2]==2))
		return 1;

	if(key[KEY_INPUT_RIGHT]>1&&(chara[2][3]==0||chara[2][3]==2))
		return 2;
	if(key[KEY_INPUT_LEFT]>1&&(chara[2][1]==0||chara[2][1]==2))
		return 3;
	else
		return-1;
}

void SetScreen(int *p,int *q){//関数③の戻り値を受けて 記号の周り25マスを再定義      関数④

	switch( MovableJudge()){
	case 0:
		*q-=1;
		Sleep(200);
		def(chara);
		break;
	case 1:
		*q+=1;
		Sleep(200);
		def(chara);
		break;
	case 2:
		*p+=1;
		Sleep(200);
		def(chara);
		break;
	case 3:
		*p-=1;
		Sleep(200);
		def(chara);
		break;
	case -1:
		def(chara);
		break;
	};




}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){//main関数
	ChangeWindowMode(FALSE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	int color=GetColor(255,255,255);
	int i,j;
	SetFontSize(128);
	for( i=0;i<53;i++)
		for( j=0;j<43;j++)
			if(map[i][j]==0&&(i+j)%2==0)
				map[i][j]=2;
	while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
		//計算フェイズ
		def(chara);

		gpKeyStateAll();

		MovableJudge();

		SetScreen( &X, &Y);




		//描画フェイズ    
		for( i=0;i<5;i++)
			for( j=0;j<5;j++)
			{if(chara[i][j]==1)
			DrawBox(j*128,i*128,(j+1)*128,(i+1)*128,color,TRUE);// 画面で1の通れないところを白で塗る
		if(chara[i][j]==2)
			DrawBox(j*128,i*128,(j+1)*128,(i+1)*128,GetColor(100,0,0),TRUE);};




		DrawFormatString(256,256,color,"*");  //記号は画面中央で固定

		if(key[KEY_INPUT_RETURN]==1)
			break;



	};



	DxLib_End();
	return 0;

}

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月19日(水) 23:59
by softya(ソフト屋)
投稿有難うございます。
気になるところだけ書いておきますね。
●インデントを整えましょう。
「mixcpp/投稿前チェックリスト - PukiWiki」 チェック3に説明されています。
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
●defにもX,Yを引数で渡したほうが良いと思います。
●MovableJudgeとSetScreenで使っている数値を前にも書いた通りenumで定義したほうが分かりやすくなります。
●SetScreenでint *p,int *qが分かり辛いの名前の工夫を。
●SetScreenでSleep(200);は使わずにフレームカウントでn回に一回に動かすにしたほうが良いでしょう。スムーズスクロールにするのが一番ですけどね。
●172行目のMovableJudge();は意味が無いです。
あと関数名と実際の機能にあちこちにズレを感じます。そこも工夫された方が良いと思います。
例えば、SetScreenのメインのお仕事は移動なんじゃないかとか思います。移動の結果としてのSetScreenですよね。だと違う名前が良いと思います。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 00:52
by naponapo
>>defにもX,Yを引数で渡したほうが良いと思います。
def関数を広く使えるようにするためということでしょうか
>>SetScreenでSleep(200);は使わずにフレームカウントでn回に一回に動かすにしたほうが良いでしょう。
こうするとどういうメリットがあるのか知りたいです!
今、enumについて勉強してきて、MovableJudgeとSetScreenを変えてみました

コード:

enum direction{up,down,left,right,dis};
int MovableJudge(){//各方向に進もうとするとき直後のマスが0になっているかを判断したい    関数③

	if(key[KEY_INPUT_UP]>1 && (chara[1][2]==0|| chara[1][2]==2))
		return up;
	if(key[KEY_INPUT_DOWN]>1&&(chara[3][2]==0||chara[3][2]==2))
		return down;

	if(key[KEY_INPUT_RIGHT]>1&&(chara[2][3]==0||chara[2][3]==2))
		return right;
	if(key[KEY_INPUT_LEFT]>1&&(chara[2][1]==0||chara[2][1]==2))
		return left;
	else
		return dis;
}

void SetScreen(int *p,int *q){//関数③の戻り値を受けて 記号の周り25マスを再定義      関数④

	switch( MovableJudge()){
	case up:
		*q-=1;
		Sleep(200);
		def(chara);
		break;
	case down:
		*q+=1;
		Sleep(200);
		def(chara);
		break;
	case right:
		*p+=1;
		Sleep(200);
		def(chara);
		break;
	case left:
		*p-=1;
		Sleep(200);
		def(chara);
		break;
	case dis:
		def(chara);
		break;
	};
小さいコードしか作ってなかったので、今まであまり変数や関数の名前を気にしていなかったのですが、
これからは意識するようにします
そのうちパックマン的な機能もつけてみたいと今思ってます

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 09:36
by softya(ソフト屋)
>>>defにもX,Yを引数で渡したほうが良いと思います。
>def関数を広く使えるようにするためということでしょうか

わかやすくしてバグを減らすためです。

>>>SetScreenでSleep(200);は使わずにフレームカウントでn回に一回に動かすにしたほうが良いでしょう。
>こうするとどういうメリットがあるのか知りたいです!

効用は
・キーを一瞬押された時に対応できるプログラムを組み込めます。
・スムーズスクロールへのステップです
・今はプログラムが短いので何とかなりますが、あちこちにSleepがあるとタイミングが自分で制御不能になります。

>今、enumについて勉強してきて、MovableJudgeとSetScreenを変えてみました

はい。分かりやすくなったと思います。
変数と区別するため、慣習として定数は大文字を使うので大文字を使ってみてください。
up → UP
DXLIBもそうなっているはずです。

>小さいコードしか作ってなかったので、今まであまり変数や関数の名前を気にしていなかったのですが、
>これからは意識するようにします

自分自身のためですね。
バグを減らす効果がありますから。

>そのうちパックマン的な機能もつけてみたいと今思ってます

がんばってください。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 10:00
by usao
本題と関係ない話ですが,
5*5の表示範囲の「5」の部分をdefineか何かで変えれるようにするといいかもしれませんね.

コード:

//例えばこんな感じでdefineを書いて
#define VIEW_SIZE 5  //※ここの値を例えば7に書き換えれば,コード全体がそれに追従して動くようにする

int chara[ VIEW_SIZE ][ VIEW_SIZE ];  //VIEW_SIZEを使って書く
//他の箇所も全て VIEW_SIZE の値に即して正しく動くように改造.
//※多分そうすると「map[][]データの外周を幅2の壁で埋める」という簡単な方法が使えなくなったりするだろうけど
…というのは,
視野を狭く限定しているのは「プレイヤに少ない情報を与えるため」だと思うのですが,
これって,動作確認時の状況把握も困難だろうなー,と.
実際のゲームプレイ時にはサイズ5がちょうどいいとしても,
開発中のデバッグ時に何かをチェックするときには例えば11とか13とかにそのサイズを一時的に広げて見れたほうが
確認しやすいこともあるんじゃないかな?
(もちろん最後はちゃんと5の状態にして動作確認するとしても)
オフトピック
特にそういうった効能がないとしても,
直値で書いてる部分をdefineとかに置き換えるのは良い練習(?)になると思う.

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 10:09
by softya(ソフト屋)
そういえば、ガードしていないのでマップの端に行くとバグりますね。
見える範囲を広げると、そう言う問題も確認しやすいです。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 12:58
by naponapo
softyaさんひとつひとつの疑問に丁寧に回答していただきありがとうございました
usaoさん>5*5の表示範囲の「5」の部分をdefineか何かで変えれるようにするといいかもしれませんね
  これもやりたいなと思っていました 何かキーに対応してズームとかやってみたいです

>>※多分そうすると「map[][]データの外周を幅2の壁で埋める」という簡単な方法が使えなくなったりするだろうけど
   最大のズームアウト時に合わせて外壁を厚くするしか自分には思い浮かびませんね笑

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月20日(木) 15:32
by usao
>>※多分そうすると「map[][]データの外周を幅2の壁で埋める」という簡単な方法が使えなくなったりするだろうけど
   最大のズームアウト時に合わせて外壁を厚くするしか自分には思い浮かびませんね笑
さすがに超厚い壁を外周に持つようにデータ用意するのはしんどいですし,
「やっぱもうちょっとだけ最大視野を広くしたいぜ!」とかなったらまたまたしんどいですw
つまり,
「処理側がおかしなことにならないように,データ側に余分なデータを加えて辻褄合わせをしておく」
という方法(こういうのを番兵とか言うんでしたっけか)は,ちょっとそぐわなくなるんじゃないかと思います.

なので,例えば,関数def()の中で,
[ X+i-K ] や [ Y+j-K ]  (※ここでKは,視野サイズ5のときの2に相当する値.視野サイズ値/2かな.)
という場所が,配列map[][]の領域外かどうかをしらべて,領域外であるなら例えばそこは
「(本当はデータが無いんだけど) '1' だったと見なす」 みたいな処理を行うことで対処することになると思います.


あとは,
「chara[][]にmap[][]の一部を都度コピーしてくる」という処理自体が本当に必要なのかどうか,という話もありますね.
map[][]からコピーしてくる領域がわかっているなら,
コピーせずとも,map[][]のその領域を直接参照して判定とか描画とかすればいいんじゃないか?っていう.
(現状ではそう見えるけども,後々やりたいことの実現にはchara[][]が必要だ,という話なのかもしれませんが.)

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月21日(金) 17:53
by naponapo
たびたび、質問して申し訳ございません
ズームアウトについて
いま、defineで画面サイズを変えて、関数もそれに合わせて修正したのですが
usaoさんの前回の返信で
>>例えば,関数def()の中で,
[ X+i-K ] や [ Y+j-K ]  (※ここでKは,視野サイズ5のときの2に相当する値.視野サイズ値/2かな.)
という場所が,配列map[][]の領域外かどうかをしらべて,領域外であるなら例えばそこは
「(本当はデータが無いんだけど) '1' だったと見なす」 みたいな処理を行うことで対処することになると思います.

とありますが、この「(本当はデータが無いんだけど) '1' だったと見なす」 みたいな処理  ってif 文で表しますか?
どうやって表すのでしょうか

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月21日(金) 17:57
by softya(ソフト屋)
if文です。配列の範囲外か添字を配列参照前に事前チェックします。

Re: DxLibで迷路ゲームを作ってみたかったのですが、、

Posted: 2014年2月21日(金) 18:02
by naponapo
ありがとうございます
配列の添字を評価するんですね
配列の要素のことばかり考えてました