スネークゲームでの当たり判定

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

スネークゲームでの当たり判定

#1

投稿記事 by cupa » 2年前

コード:

#include "../DxLib/DxLib.h"

#define FIELD_SIZE		20

#define CHIP_SIZE		20

byte mField[ FIELD_SIZE + 2 ][ FIELD_SIZE + 2 ] = {
	//1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22
	{ 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, 0, 1 },//2
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//3
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//4
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//5
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//6
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//7
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//8
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//9
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//10
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//11
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//12
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//13
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//14
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//15
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//16
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//17
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//18
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//19
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//20
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//21
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },//22
};

enum {
	eScene_Game,
	eScene_Clear
}eScene = eScene_Game;

int getMinToMaxRand( int min, int max );
int toChipSize( int n );

void Init();
void OnTimer();
void Update();
void Draw();

int mNowClock, mLastClock;
int mPX, mPY, mPMuki, mLastPX, mLastPY;
int mMoveX[ 4 ] = { 0, -1, 0, 1 }, mMoveY[ 4 ] = { -1, 0, 1, 0 };
int mFX, mFY, mFoodFlag;
int mOnKey;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE );
	SetDrawScreen( DX_SCREEN_BACK );
	if ( DxLib_Init() == -1 ) return -1;
	
	Init();
	
	mLastClock = GetNowCount();
	while ( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		ClearDrawScreen();
		
		OnTimer();
		Draw();
		
		ScreenFlip();
	}
	
	DxLib_End();
	return 0;
}

int getMinToMaxRand( int min, int max ) {
	int r;
	r = GetRand( max - min ) + min;
	return r;
}

int toChipSize( int n ) {
	int cs, s = CHIP_SIZE;
	cs = n / s;
	return cs;
}

void Init() {
	mPX = 6, mPY = 10;
}

void Update() {
	mField[ mPY ][ mPX ] = 0;
	
	if ( mFoodFlag != 1 ) {	//もし食べ物がないのなら
		mField[ mFY ][ mFX ] = 0;
		mFX = getMinToMaxRand( 1, 19 );
		mFY = getMinToMaxRand( 1, 19 );
		mField[ mFY ][ mFX ] = 3;
		mFoodFlag = 1;
	}
	
	if ( mFX == mPX && mFY == mPY ) mFoodFlag = 0;
	
	if ( CheckHitKey( KEY_INPUT_UP		) == 1 ) mOnKey = 0;
	if ( CheckHitKey( KEY_INPUT_LEFT	) == 1 ) mOnKey = 1;
	if ( CheckHitKey( KEY_INPUT_DOWN	) == 1 ) mOnKey = 2;
	if ( CheckHitKey( KEY_INPUT_RIGHT	) == 1 ) mOnKey = 3;
	
	if ( 1 < mPX && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPX ) {
		mPX += mMoveX[ mOnKey ];
	} else if ( 1 < mPY && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPY ) {
		mPY += mMoveY[ mOnKey ];
	}
	
	mField[ mPY ][ mPX ] = 2;
}

void OnTimer() {
	mNowClock = GetNowCount();
	if ( mNowClock >= mLastClock + 200 ) {
		mLastClock = mNowClock;
		Update();
	}
}

void Draw() {
	for ( int y = 0; y < FIELD_SIZE + 2; y++ ) {
		for ( int x = 0; x < FIELD_SIZE + 2; x++ ) {
			int chip = mField[ y ][ x ];
			char* chipTex[ 4 ] = { " ", "#", "●", "◯" };
			DrawString( x * CHIP_SIZE, y * CHIP_SIZE, chipTex[ chip ], GetColor( 255, 255, 255 ) );
		}
	}
}

前回の質問に続いて質問です。

現在、プレイヤー(●)を自由に動かすところまでできたのですが、
壁にあたったときの処理がうまくいきません。
はじめに、

コード:

if ( 1 < mPX && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPX &&
		 1 < mPY && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPY ) {
		mPX += mMoveX[ mOnKey ], mPY += mMoveY[ mOnKey ];
	} 
こうしてみたのですが、こうだともし壁に当たったら完全に動けなくなる状態なので、
XとYを分けてやってみたのですが、挙動がおかしいです。
(実際には、上や下には行かず、右や左にも何回もキーを押さないと動きません。止まるときもあります)

やりたいこととしては、壁に突っ込んだら(同じ座標になったら)ゲームオーバー判定で、そうじゃないなら普通に動けるようにしたいです。

またまたよろしくおねがいします。

cupa
記事: 117
登録日時: 2年前

Re: スネークゲームでの当たり判定

#2

投稿記事 by cupa » 2年前

もう一つ、ちょっとした問題なのですが、座標0,0に#が表示されません(表示された後消えます
そのような処理はしてないと思うのですが・・・よろしくおねがいします

参照魚
記事: 109
登録日時: 6年前

Re: スネークゲームでの当たり判定

#3

投稿記事 by 参照魚 » 2年前

①Foodがある場所をクリアするタイミングがおかしいため(0,0)の壁が消えます
②あまり難しくせず、まずはswitch-caseで動くようにするとよいです

コード:

void Update() {
	mField[ mPY ][ mPX ] = 0;
	
	if ( mFoodFlag != 1 ) {	//もし食べ物がないのなら
		//mField[ mFY ][ mFX ] = 0;	// ①ここでクリアすると1回目はmFYとmFXは0なので、(0,0)の壁が消える
		mFX = getMinToMaxRand( 1, 19 );
		mFY = getMinToMaxRand( 1, 19 );
		mField[ mFY ][ mFX ] = 3;
		mFoodFlag = 1;
	}
	
	if ( mFX == mPX && mFY == mPY ) {
		mField[ mFY ][ mFX ] = 0;	// ①当たり判定があったらクリアする
		mFoodFlag = 0;
	}

	if ( CheckHitKey( KEY_INPUT_UP	) == 1 ) mOnKey = 0;
	if ( CheckHitKey( KEY_INPUT_LEFT	) == 1 ) mOnKey = 1;
	if ( CheckHitKey( KEY_INPUT_DOWN	) == 1 ) mOnKey = 2;
	if ( CheckHitKey( KEY_INPUT_RIGHT	) == 1 ) mOnKey = 3;

#if 0 // ②
	if ( 1 < mPX && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPX ) {
		mPX += mMoveX[ mOnKey ];
	} else if ( 1 < mPY && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPY ) {
		mPY += mMoveY[ mOnKey ];
	}
#else
	switch ( mOnKey ) {
	case 0: if ( mPY > 0          		&& mField[ mPY-1 ][ mPX ] != 1 ) { mPY--;		}	break;
	case 2: if ( mPY < FIELD_SIZE	&& mField[ mPY+1 ][ mPX ] != 1 ) { mPY++;	}	break;
	case 1: if ( mPX > 0 			&& mField[ mPY ][ mPX-1 ] != 1 ) { mPX--;		}	break;
	case 3: if ( mPX < FIELD_SIZE	&& mField[ mPY ][ mPX+1 ] != 1 ) { mPX++;	}	break;
	}
#endif
	mField[ mPY ][ mPX ] = 2;
}


cupa
記事: 117
登録日時: 2年前

Re: スネークゲームでの当たり判定

#4

投稿記事 by cupa » 2年前

参照魚さん、わかりやすい回答ありがとうございます!!
予想通りの動きになりました!
ありがとうございました!

返信

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