ページ 11

ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 11:42
by mi_l
ボードゲームを作ろうとしているのですが以下の事ができません(わかりません)
コードのどこがおかしいかわかりません・・・

コード:

#include "DxLib.h"
 
#define XX = 16;
#define YY = 16;


typedef struct//自分
{
		//X座標、Y座標、画像、移動向き移動フラグ、ヒットポイント
		int posX , posY , img , muki , flag , hp;
}ch_t;

typedef struct //味方
{
	//X座標、Y座標、画像、、移動向き移動フラグ、ヒットポイント
	int posX , posY , img ,muki , flag , hp;
}mate_t;

typedef struct//障害物
{	
	//X座標、Y座標、画像
	int posX , posY ,img ;
}bar_t;

typedef struct//敵
{
	//X座標、Y座標、画像、移動フラグ、移動向き,
	int posX , posY , img , flag , muki;
}enem_t;


 
int stage[40][30] =
{
	//           ↓       15           ↓
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//10
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//20
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//30
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//40
};

/*void CBcalc(int flag)
{ 

}*/
 
int AbleToGo(int x,int y,int muki)
{
	//進めるかを判定する
        if(muki==0)//上向きなら
                if(stage[y/16-1][x/16] == 1)//進めるか判定(0ならすすめる、0以上は障害物など)
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(stage[y/16][x/16-1] == 1)
                        return 1;
        if(muki==2)//下向きなら
                if(stage[y/16+1][x/16] == 1)
                        return 1;
        if(muki==3)//右向きなら
                if(stage[y/16][x/16+1] == 1)
                        return 1;
        return 0;//正常
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    char Key[256];//キー
	int image[9];//画像配列
	int Simg;//ステージ画像(今回は草原)

	int bX = GetRand(29);//障害物で使う
	int bY = GetRand(39);//障害物で使う



	//各構造体
	  ch_t ch[4];	
	  mate_t mate[2];
	  enem_t enem;           
	  bar_t bar[2];
  

 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	
 
    SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定


	LoadDivGraph("obj.png" , 9 , 3 , 3 , 16 , 16 , image);//画像を分割してimage配列に保存


	//Simgにステージ画像の保存
	Simg = LoadGraph("stage.png");

	//自分画像(4体は面倒なのでとりあえず1体でデモ)
	ch[0].img = image[0];
	ch[1].img = image[1];
	ch[2].img = image[2];
	ch[3].img = image[3];
	
	//敵画像
	mate[0].img = image[5];
	mate[1].img = image[6];

	//敵画像
	enem.img = image[7];

	//障害物画像
	bar[0].img = image[8];
	bar[1].img = image[9];



	
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
	
		DrawGraph(0 , 0 , Simg , TRUE);//背景画像描画

		int cr = GetColor(0 , 0 , 0);//色取得

		//線の描画
			for(int v = 0 ; v <= 640 ; v+=16)
			{
				DrawLine(0 , v , 480 , v , cr);
			}

			for(int v = 0 ; v <= 480 ; v+=16)
			{
				DrawLine(v , 0 , v , 640 , cr);
			}


	//自分たち初期位置
	for(int i = 1 ; i<=4 ; i++)
	{
	ch[i-1].posX = 80*i;         
	ch[i-1].posY = 400;
	DrawGraph(ch[i-1].posX , ch[i-1].posY , ch[i-1].img , TRUE);
	stage[ch[i-1].posY/16][ch[i-1].posX/16] = 1;//配置された位置を「1」にする。
	}

		
	//障害物初期位置
	for(int s = 0 ; s <= 3 ; s++)
	{
		/*if(stage[bY][bX] == 0)
		{*/
		//障害物をランダムで置く(計算的に必ずすべてがstage上に置かれるわけではないので注意)
		DrawGraph(bX*16 , bY*16 , bar[0].img , TRUE);
		DrawGraph(bX*16 , bY*16 , bar[1].img , TRUE);
		stage[bY][bY] = 1;//その部分を「1」にする
		//}
		s++;
	}


	
	//自分移動
	if(ch[0].posX % 16 == 0 && ch[0].posY % 16 == 0 )//座標を16で割り切れたら入力可能
	{
		ch[0].flag = 1;//移動できるフラグを立てる

		if(Key[KEY_INPUT_UP] == 1)
		{
			//上向きフラグを立てる
			ch[0].muki =0;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_LEFT] == 1)
		{
			//左向きフラグを立てる
			ch[0].muki =1;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_DOWN] == 1)
		{
			//下向きフラグを立てる
			ch[0].muki =2;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_RIGHT] == 1)
		{
			//右向きフラグを立てる
			ch[0].muki =3;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else
			ch[0].flag = 0;//上記以外なら歩かないフラグ

		if(ch[0].flag == 1)//移動フラグが立っているけど・・
			if(AbleToGo(ch[0].posX , ch[0].posY , ch[0].muki) == 1)//行き先が無理なら・・・
				ch[0].flag = 0;//歩かないフラグを立てる!!
	}

	//移動フラグが立っていたら
	if(ch[0].flag == 1)
	{
		
		if(ch[0].muki == 0)//上向きならY座標を16減らす(1つ上にする)(画像が16x16だから)
		{
			ch[0].posY = ch[0].posY - 16; 
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 1)//左向きならX座標を16減らす(1つ左にする)
		{
			ch[0].posX = ch[0].posX - 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 2)//下向きならY座標を16増やす(1つ下にする)
		{
			ch[0].posY = ch[0].posY + 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 3)//右向きならX座標を16増やす(1つ右にする)
		{
			ch[0].posX = ch[0].posX + 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}
	}


        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
現段階でできていること
自キャラ4体の表示
背景の表示
ラインを引いて16x16のマスを作成

現段階でやりたいけどできてないこと
障害物の配置(木と岩の二つをランダムに配置x3回のループで計6個(各3個ずつ)配置したいのですが現段階では0x0(左上)に1つ木(画像)が置いてあるだけです)
また、障害物初期位置のif文をコメントアウトからはずすと描画されなくなります。

自キャラの移動、4体描画していますが対象は今のところ1体です→ch[0]
コードのどこがおかしいかわかりません・・・・

ご指摘お願いします。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 11:58
by h2so5
障害物を1つ設置するたびにbX, bY を更新しないと同じ位置に障害物が設置されてしまいますよ。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 13:03
by mi_l
回答ありがとうございます。

私的になおして

コード:

//障害物初期位置
	for(int s = 0 ; s <= 3 ; s++)
	{
		int bX = GetRand(29);
		int bY = GetRand(39);
		/*if(stage[bY][bX] == 0)
		{*/
		//障害物をランダムで置く(計算的に必ずすべてがstage上に置かれるわけではないので注意)
		DrawGraph(bX*16 , bY*16 , bar[0].img , TRUE);
		DrawGraph(bX*16 , bY*16 , bar[1].img , TRUE);
		stage[bY][bX] = 1;//その部分を「1」にする
		//}
		s++;
	}
しましたが、そうするとすごいことになってしまいました・・・
(ランダムな位置に)描画→消えるの繰り返しで「配置」がされません・・・

どこがおかしいのでしょうか?
また、画像は二つ用意してあるのに片方しか出てきません・・
ご指摘お願いします

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 13:10
by h2so5
メインループの中で座標を更新してしまっているので、毎フレーム障害物の位置が変化してしまいます。
障害物の座標を記憶しておく配列を用意しておいて、座標を決定するのはメインループの外に出す必要があります。

2つの画像をおなじ座標に表示していますから、片方しか表示されません。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 15:03
by softya(ソフト屋)
ざっと見で、無駄に長い(関数化や共通化可能)のとインデントの乱れが気になりますね。
そこを考えてみてください。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 15:42
by mi_l
一応配列を宣言してみました↓がうまくできません

コード:

	int BposX[3];
	int BposY[3];

	//障害物初期位置(岩)
	for(int s = 0 ; s < 3 ; s++)
	{
		
		int bX = GetRand(29);
		int bY = GetRand(39);

		BposX[s] = bX;
		BposY[s] = bY;

	}
	for(int v = 0 ; v < 3; v++)
	{
		DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
	}
また、for文では3回までと書いているのですが、この場合は(例、1回目、bX=21,bY=34、2回目,bX=14,bY=12、3回目,bX=4,bY=24)となるのではないのでしょうか?
しかも上のコードだとfor文にまとめた方が・・とも思ってしまします・・・・・
ご指摘お願いします

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 15:44
by softya(ソフト屋)
mi_l さんが書きました:一応配列を宣言してみました↓がうまくできません

コード:

	int BposX[3];
	int BposY[3];

	//障害物初期位置(岩)
	for(int s = 0 ; s < 3 ; s++)
	{
		
		int bX = GetRand(29);
		int bY = GetRand(39);

		BposX[s] = bX;
		BposY[s] = bY;

	}
	for(int v = 0 ; v < 3; v++)
	{
		DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
	}
また、for文では3回までと書いているのですが、この場合は(例、1回目、bX=21,bY=34、2回目,bX=14,bY=12、3回目,bX=4,bY=24)となるのではないのでしょうか?
しかも上のコードだとfor文にまとめた方が・・とも思ってしまします・・・・・
ご指摘お願いします
このコードを何処に入れたのでしょうか? ソースコード全体をお願いします。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 15:45
by h2so5
「座標を決定するのはメインループの外に出す必要があります」という部分を読まれましたか?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 15:46
by box
mi_l さんが書きました:

コード:

#define XX = 16;
#define YY = 16;
これは何をしたいんでしょうか。
mi_l さんが書きました:

コード:

int stage[40][30] =
外部変数を0で初期化するだけなら、以下の40行ほどは不要だと思います。
mi_l さんが書きました:

コード:

	int image[9];//画像配列
この定義と
mi_l さんが書きました:

コード:

	bar[1].img = image[9];
この参照は矛盾しているように見えます。image[9]で定義した配列で
正しく参照できるのはimage[8]までではないでしょうか。
mi_l さんが書きました:

コード:

	for(int s = 0 ; s <= 3 ; s++)
		s++;
後の方のs++の意味は何でしょうか。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 16:15
by mi_l
皆様親切にありがとうございます。

一応・・できました!!

コード:

#include "DxLib.h"
 
#define XX = 16;
#define YY = 16;


typedef struct//自分
{
		//X座標、Y座標、画像、移動向き移動フラグ、ヒットポイント
		int posX , posY , img , muki , flag , hp;
}ch_t;

typedef struct //味方
{
	//X座標、Y座標、画像、、移動向き移動フラグ、ヒットポイント
	int posX , posY , img ,muki , flag , hp;
}mate_t;

typedef struct//障害物
{	
	//X座標、Y座標、画像
	int posX , posY ,img ;
}bar_t;

typedef struct//敵
{
	//X座標、Y座標、画像、移動フラグ、移動向き,
	int posX , posY , img , flag , muki;
}enem_t;


 
int stage[40][30] =
{
	//           ↓       15           ↓
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//10
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//20
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//30
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//40
};

/*void CBcalc(int flag)
{ 

}*/
 
int AbleToGo(int x,int y,int muki)
{
	//進めるかを判定する
        if(muki==0)//上向きなら
                if(stage[y/16-1][x/16] == 1)//進めるか判定(0ならすすめる、0以上は障害物など)
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(stage[y/16][x/16-1] == 1)
                        return 1;
        if(muki==2)//下向きなら
                if(stage[y/16+1][x/16] == 1)
                        return 1;
        if(muki==3)//右向きなら
                if(stage[y/16][x/16+1] == 1)
                        return 1;
        return 0;//正常
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    char Key[256];//キー
	int image[9];//画像配列
	int Simg;//ステージ画像(今回は草原)

	int cr = GetColor(0 , 0 , 0);//色取得


	//各構造体
	  ch_t ch[4];	
	  mate_t mate[2];
	  enem_t enem;  
	  bar_t bar[2];
	  

 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	
 
    SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定


	LoadDivGraph("obj.png" , 9 , 3 , 3 , 16 , 16 , image);//画像を分割してimage配列に保存


	//Simgにステージ画像の保存
	Simg = LoadGraph("stage.png");

	//自分画像(4体は面倒なのでとりあえず1体でデモ)
	ch[0].img = image[0];
	ch[1].img = image[1];
	ch[2].img = image[2];
	ch[3].img = image[3];
	
	//敵画像
	mate[0].img = image[4];
	mate[1].img = image[5];

	//敵画像
	enem.img = image[6];

	//障害物画像
	bar[0].img = image[7];
	bar[1].img = image[8];

	int BposX[3];
	int BposY[3];

	//障害物初期位置(岩)
	for(int s = 0 ; s < 3 ; s++)
	{
		int bX = GetRand(29);
		int bY = GetRand(39);

		BposX[s] = bX;
		BposY[s] = bY;
	}
	


	
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
	
		DrawGraph(0 , 0 , Simg , TRUE);//背景画像描画


		//線の描画
			for(int v = 0 ; v <= 640 ; v+=16)
			{
				DrawLine(0 , v , 480 , v , cr);
			}

			for(int v = 0 ; v <= 480 ; v+=16)
			{
				DrawLine(v , 0 , v , 640 , cr);
			}


	//自分たち初期位置
	for(int i = 1 ; i<=4 ; i++)
	{
	ch[i-1].posX = 80*i;         
	ch[i-1].posY = 400;
	DrawGraph(ch[i-1].posX , ch[i-1].posY , ch[i-1].img , TRUE);
	stage[ch[i-1].posY/16][ch[i-1].posX/16] = 1;//配置された位置を「1」にする。
	}
		

	//障害物初期位置(木)
	/*for(int s = 0 ; s < 3 ; s++)
	{
		int bX = GetRand(29);
		int bY = GetRand(39);
		
		//↓やり方①(後で聞く)
		if(stage[bY][bX] == 0)
		{
		//障害物をランダムで置く(計算的に必ずすべてがstage上に置かれるわけではないので注意)
		DrawGraph(bX*16 , bY*16 , barA[s].img , TRUE);
		stage[bY][bX] = 1;//その部分を「1」にする
		}
		s++;
	}
	*/

	//岩
	for(int v = 0 ; v < 3; v++)
	{
		
			DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
			stage[BposY[v]][BposX[v]] = 1;
		
	}

	
	//自分移動
	if(ch[0].posX % 16 == 0 && ch[0].posY % 16 == 0 )//座標を16で割り切れたら入力可能
	{
		ch[0].flag = 1;//移動できるフラグを立てる

		if(Key[KEY_INPUT_UP] == 1)
		{
			//上向きフラグを立てる
			ch[0].muki =0;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_LEFT] == 1)
		{
			//左向きフラグを立てる
			ch[0].muki =1;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_DOWN] == 1)
		{
			//下向きフラグを立てる
			ch[0].muki =2;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else if(Key[KEY_INPUT_RIGHT] == 1)
		{
			//右向きフラグを立てる
			ch[0].muki =3;
			//自分の居る場所の値を「0」(何もない)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 0;
		}

		else
			ch[0].flag = 0;//上記以外なら歩かないフラグ

		if(ch[0].flag == 1)//移動フラグが立っているけど・・
			if(AbleToGo(ch[0].posX , ch[0].posY , ch[0].muki) == 1)//行き先が無理なら・・・
				ch[0].flag = 0;//歩かないフラグを立てる!!
	}

	//移動フラグが立っていたら
	if(ch[0].flag == 1)
	{
		
		if(ch[0].muki == 0)//上向きならY座標を16減らす(1つ上にする)(画像が16x16だから)
		{
			ch[0].posY = ch[0].posY - 16; 
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 1)//左向きならX座標を16減らす(1つ左にする)
		{
			ch[0].posX = ch[0].posX - 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 2)//下向きならY座標を16増やす(1つ下にする)
		{
			ch[0].posY = ch[0].posY + 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}

		else if(ch[0].muki == 3)//右向きならX座標を16増やす(1つ右にする)
		{
			ch[0].posX = ch[0].posX + 16;
			//進んだ位置を「1」(何かある)にする
			stage[ch[0].posY/16][ch[0].posX/16] = 1;
		}
	}


        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
やりたいこと・・・岩の画像を3つ、ランダムな場所に置くこと
(最初の質問では岩と木の画像でしたが、同様にやって木も描画したいと思います。)

ご指摘頂いたことに関する回答
最初にある長ったらしい配列は、マス数は決まっているので、これから使うかもしれないのでとっておいてるだけです。(defineも同様)
まだ、これから設定を追加していくのでまだ途中であります。。

ここからは描画ができた後にでてきた疑問なのですが、

コード:

//岩
	for(int v = 0 ; v < 3; v++)
	{
		if(stage[BposY[v]][BposX[v]] == 0)
		{
			DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
		}
			stage[BposY[v]][BposX[v]] = 1;//配置したところを「1」(何かある)にする。
		
	}
とすると画像が表示されません・・・
ご指摘お願いします

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 16:20
by h2so5
その処理が1回だけ実行されるのかループで何度も実行されるのかをちゃんと把握してください。
描画関数はなんども実行するはずですが、それに stage[BposY[v]][BposX[v]] == 0 という最初しか真でない条件を指定するのはおかしいと思いませんか?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 16:43
by mi_l
h2so5 さんが書きました:その処理が1回だけ実行されるのかループで何度も実行されるのかをちゃんと把握してください。
描画関数はなんども実行するはずですが、それに stage[BposY[v]][BposX[v]] == 0 という最初しか真でない条件を指定するのはおかしいと思いませんか?
何度も実行されるのでfor文の中にいれたつもりのですが・・・・

ご指摘されたことが私に通じてないと思われますので・・・・・申し訳ありませんが表現方法を変えてお願いしたいです・・・・

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 16:55
by h2so5
文章の最初だけじゃなくて最後も読んでください。
「 stage[BposY[v]][BposX[v]] == 0 という最初しか真でない条件を指定するのはおかしいと思いませんか」
という指摘です。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:04
by mi_l
h2so5 さんが書きました:文章の最初だけじゃなくて最後も読んでください。
「 stage[BposY[v]][BposX[v]] == 0 という最初しか真でない条件を指定するのはおかしいと思いませんか」
という指摘です。
「最初しか真でない条件」というのがわかりません(まだ理解できていません・・・)

どうして「最初しか真でない条件」なのか解説お願いしたいです・・・・・・・・・・

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:07
by softya(ソフト屋)
かならず1を入れているので以後はずっと1ですよね?
ということは0の所はループ後は存在しなくなると言うことです。

【追記】
上にも書きましたが、条件などプログラムの流れが混乱するので必ずインデントは正確に行いましょう。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:15
by box
ていうか、インデントがグチャグチャなので、その部分がwhile文の中にあるかどうかが
正確にわからなくなっているのでは?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:29
by mi_l
softya(ソフト屋) さんが書きました:かならず1を入れているので以後はずっと1ですよね?
ということは0の所はループ後は存在しなくなると言うことです。
ずっと1です。。。

1になるのは岩を置いた三つのところだけですよね・・・(そのつもりなのですが・・)
木やキャラは除いて・・・

なんで0の場所が消えるんですか?

0であるかを確認して、そうであれば岩の画像を配置して、その場所を0から1にする・・・を3回繰り返す・・っていうことではないのですか?配置されなかった場所は0のままですよね?
それとループというのはメインループのことですか・・・?

根本的に何か勘違いをしているのでしょうか?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:36
by softya(ソフト屋)
質問は岩が表示されないと言うことではないですか? 他にも表示されなくなるものが?

コード:

if(stage[BposY[v]][BposX[v]] == 0)
        {
            DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
        }
この条件なら0の時にしか岩が表示されませんので、2フレーム目から岩は表示されません。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:41
by mi_l
softya(ソフト屋) さんが書きました:質問は岩が表示されないと言うことではないですか? 他にも表示されなくなるものが?

コード:

if(stage[BposY[v]][BposX[v]] == 0)
        {
            DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
        }
この条件なら0の時にしか岩が表示されませんので、2フレーム目から岩は表示されません。
ということは、else文で置かれなかった場所はそのままの値(0なら0のまま)を代入するという文を書かなければならないということですか?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:47
by softya(ソフト屋)
すいません。そちらで情報を整理してもらえますか。

1.どういう問題が出ているか詳細(岩だけなのか岩以外にも影響あり?)
2.「ここからは描画ができた後にでてきた疑問なのですが、」で出てきた表示処理でやりたかった事は何なのか?
0の値の意味と1の値の意味を説明してください。

mi_lさん自身では意図がある事かもしれませんが、他の人には意図不明な数値や処理なんです。その意図が分からないと「変ですよ」としか言えません。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月13日(日) 17:57
by へにっくす
最初に示されたコードと、一応できた、というコードでは、両方ともインデントがそろっていないです。
まずはインデントをそろえたソースを貼ってください。#インデントをそろえるのは基本です。
また、直した部分だけを載せるのではなくて、その都度全体のソースを貼ってください。
その方が説明不足や誤解を生まずに済ませますよ。

あと、boxさんも指摘してますが
0で初期化するだけなら

コード:

int stage[40][30] = {0};
これだけで済みますよ。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 03:06
by mi_l
softya(ソフト屋) さんが書きました:すいません。そちらで情報を整理してもらえますか。

1.どういう問題が出ているか詳細(岩だけなのか岩以外にも影響あり?)
2.「ここからは描画ができた後にでてきた疑問なのですが、」で出てきた表示処理でやりたかった事は何なのか?
0の値の意味と1の値の意味を説明してください。

mi_lさん自身では意図がある事かもしれませんが、他の人には意図不明な数値や処理なんです。その意図が分からないと「変ですよ」としか言えません。
整理いたします

1、岩にしか影響はありません、背景も描画されてますし、キャラクターも描画されています。

2、当初の質問は、40x30の中のランダムな三つの位置に岩の画像を描画させたいというものでした。
そして、助言をいただき、「40x30の中のランダムな三つの位置に岩の画像を描画させたい」という課題はクリアできました。
しかし、自分の作ろうとしているボードゲームでは、「岩のマスにはいけない」つまり、進めない場所をつくりたかたのです(新・プログラミングの館では最初に通れない場所を0と1で設定していたので参考までに見ました)
初期で配列全てに「0」を代入しました。(「0」とは、「なにもない」、「進める(移動できる)」を表しています)

そこで、岩を3つ配置(描画)ところまではできましたが、その配置された位置を「0」から「1」(何かある、通れない、進めない、の意)にしなくては、岩の場所に進めてしまい、障害物の意味がなくなっていしまいます。

そこで、自分なりに考えたコードを書いてうまくいかないので、皆様に訊いて今もご指摘を頂いている訳です。

コード:

if(stage[BposY[v]][BposX[v]] == 0)
        {
            DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
        }
        stage[BposY[v]][BposX[v]] = 1;
と書いたのですがおかしいと言われ、助言をしてもらっているのが現段階です

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 03:55
by へにっくす
まずはインデントをそろえましょうか。
しつこいようですが、インデントをそろえることは基本です。
これを疎かにしたソースを掲示しても、イイことありませんよ。

以下のコードもインデントが変です。

コード:

if(stage[BposY[v]][BposX[v]] == 0)
        {
            DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
        }
        stage[BposY[v]][BposX[v]] = 1;
個人的にはこうならないとおかしい。

コード:

if(stage[BposY[v]][BposX[v]] == 0)
{
    DrawGraph(BposX[v]*16 , BposY[v]*16 , bar[0].img , TRUE);
}
stage[BposY[v]][BposX[v]] = 1;
それと0が「なにもない」のに、
0のときに岩(bar[0].img)を描画するのですか?
違うでしょ?
(少なくとも上のコードはそうなってます)

とりあえず、まずはインデントを直したソースを全部、貼ってください。
参考)インデントについて考える 前編|悪態のプログラマ

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 09:35
by mi_l
へにっくす さんが書きました: それと0が「なにもない」のに、
0のときに岩(bar[0].img)を描画するのですか?
違うでしょ?
(少なくとも上のコードはそうなってます)

とりあえず、まずはインデントを直したソースを全部、貼ってください。
参考)インデントについて考える 前編|悪態のプログラマ
まずは全て「0」(なにもない)です;
そこで適当に乱数をとります。(岩を置く位置、40x30なので0~39と0~29)これを3回やります(岩は3つ置きたいので)

そこがあらかじめ他の障害物が置かれてない状態、つまり「0」であればそこに置いて(描画して)その位置を「1」にします。(障害物は岩だけではありません)

これは、キャラ移動の時に1には進めないと記述しますので・・・・

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 09:52
by high
状態の遷移を説明して欲しいわけではないのですよ。あなたのそのコードが何をしたいのかはっきりしていないのです。
ループ外などで一度だけ初期化、ループの中で更新、描画 それぞれ独立して行うべきでしょう。
初期化段階で岩を配置する処理なのになぜDrawGraphを行なっているのですか?
初期化で0で埋めてランダムに1を配置しましょう。
その後ループ内で1のあるところに岩を描画しましょう。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 11:09
by へにっくす
まずはインデントを直したソースを貼ってください。
貼らない限りは進まないですよ。
何度も言われてるのに直したソースを貼らないのはなぜですか?

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 11:12
by softya(ソフト屋)
必要だからみなさん書いているので、出来るだけ回答者のリクエストには応えるようにしてください。
出来ないなら出来ない理由を書いて説明をお願いします。

根本的な問題については、その後お答えすることにしたいと思います。

Re: ボードゲームを作ろうとしているのですが・・・

Posted: 2013年1月14日(月) 18:59
by ISLe
プログラムで描画したものは、基本的にその場限りです。
ですから、何もない場所を岩に変更したときに岩を描画するというのは、岩の場所に岩を描画しているのではありません。
「何もない場所を岩に変更した」場所を岩で描画しているということになりますから、岩になってしまって変化しない場所には描画されません。

まず、問題になっているコードは、「何もない場所を岩に変更した」場所を岩で描画するという内容になっている、ということを理解してください。

岩になった場所に岩を描画するには、ずっと描画し続ける(毎フレーム描画する)必要があります。
そのためにはどうしたら良いか考えてみてください。