汽車のレールを組み立てるパズルゲームなんですが…

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

汽車のレールを組み立てるパズルゲームなんですが…

#1

投稿記事 by KEYONN_ » 16年前

おはようございます。いつも、お世話になっています。
TKOZです。ネットカフェからの書き込みです。
今、「汽車ポッポ」という、列車のレールを組み立てる
パズルゲームを作っています。

パズルゲームアルゴリズムマニアックスという本を参考に
プログラミングしていたのですが、プログラムが上手く動作しません。

具体的には、汽車がレールの上を上手く走ってくれないんです。

ソースファイルを添付しました。

開発環境は、VisualC++6.0で、WindowsXPです。

どうか、誰か、アドバイスを下さい。よろしくお願いします。

conio

Re:汽車のレールを組み立てるパズルゲームなんですが…

#2

投稿記事 by conio » 16年前

>>具体的には、汽車がレールの上を上手く走ってくれないんです。
もう少し具体的にして欲しかったです。
「上手く走らない」と言っても、
------------------------------------------------------------
【1】初めから汽車が動かない
【2】レールの画像と一致しない方向へすすむ
【3】汽車が、レールの画像の座標から 微妙にズレた場所を走る
【4】次のレールへ移動しようとする際に、汽車がとまる
【5】レールの画像が無い場所を進み始める
【6】汽車の走るスピードが変化したり、意図しないスピードになったりする
------------------------------------------------------------
など、色々と考えられます。

あと、汽車がどう動くかの前に、エラーが出て実行できませんでした。

下記のコードでは、最初 Time = 0、CONNECTED_RAIL_TIME = 1なので
if文が実行されます。(Time++;)

そして、その後DrawFormatStringで、初期化されていないdirを表示しようとするので
エラーが出て止まります。
(cx,cyも初期化されてないです。)
---------------------------------------------------------------------------
int Move()
{
	int dir;
	int cx,cy;
	if (Time<CONNECTED_RAIL_TIME){
		Time++;
	} else {
		cx=CX+CONNECTED_RAIL_VX[Di[/url]; 
		cy=CY_+CONNECTED_RAIL_VY[Di[/url];
		if ( cx>=0 && cx<20 && cy>=0 && cy<15) 
		{
			dir=CONNECTED_RAIL_DIR[Get(cx,cy)][Di[/url];
			if (dir!=4)
			{
					CX=cx;
					CY_=cy;
					Dir=dir;
					Time=0;
			}
		}
	}
		
		DrawFormatString(0 ,0 , GetColor(255,0,0) ,
			 "dir=%d" , dir ) ;
		DrawFormatString(0 ,32 , GetColor(255,0,0) ,
			 "cx=%d:cy=%d" , cx,cy ) ;
		DrawFormatString(0 ,64 , GetColor(255,0,0) ,
			 "Dir=%d" , Dir ) ;
---------------------------------------------------------------------------

KEYONN_

Re:汽車のレールを組み立てるパズルゲームなんですが…

#3

投稿記事 by KEYONN_ » 16年前

>>conioさんへ

>もう少し具体的にして欲しかったです。
分かりました。今後、気をつけます。

あと、指摘された部分を直して、

DrawCar()内の
DrawRectGraph( Car.x*32, Car.y*32,
    (Car.move_angle/30)*32, 0, 32, 32,
    SubGraphicHandle, TRUE, FALSE ) ;
で、Car.xとCar.yを32倍したら、カクカクですが、レールの上をきちんと
移動が出来ました。

しかし、滑らかに動かすにはどうすればいいのでしょうか?

conio

Re:汽車のレールを組み立てるパズルゲームなんですが…

#4

投稿記事 by conio » 16年前

とりあえず、簡単に作ってみました。
また、#if の横にある数字を0か1にしてマップを切り替えられます。

流れとしてはこんな感じです。
【1】現在、列車の居るレールの情報を調べる。
【2】レールに応じて、動く方向のフラグを立てる。
【3】1ドットずつ、フラグに応じて増減させる。(++x,--x,++y,--yなど)
【4】次のマス(レール)に到着した時に、動く方向のフラグを消す。
【5】1へ戻る
--------------------------------------------------------------------------------------
#include "DxLib.h"

int Key[256];
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
} 

#if 0
int Map[5][6] = { {1,1,1,1,1,4},
		{1,1,1,1,4,4},
		{3,1,1,0,4,4},
		{3,3,2,2,2,4},
		{3,2,2,2,2,2}, };
#else

int Map[5][6] = { {4,1,1,1,1,4},
		{4,3,2,4,2,2},
		{4,1,3,4,1,1},
		{4,3,2,4,3,2},
		{1,1,3,1,1,3}, };
#endif

enum MoveID{
	MOVE_NONE,
	MOVE_RIGHT,
	MOVE_LEFT,
	MOVE_UP,
	MOVE_DOWN,
	MOVE_MAX
};

typedef struct{
	MoveID mflag;
	char* c;
}Cell;

const Cell cell[MOVE_MAX] = {	{MOVE_NONE,"×"},
				{MOVE_RIGHT,"→"},
				{MOVE_LEFT,"←"},
				{MOVE_UP,"↑"},
				{MOVE_DOWN,"↓"}
			};
typedef struct{
	int x;
	int y;
	int Exist;
	MoveID mflag;
}Train;

Train train = {0,0,1,MOVE_NONE};
int BaseX = 100;
int BaseY = 100;

void MoveTrain(void)
{
	if(train.mflag == MOVE_NONE){
		if(train.x >= 0 && train.y >= 0 && train.y/20 < (sizeof(Map)/sizeof(Map[0])) && train.x/20 < (sizeof(Map[0])/sizeof(Map[0][0]))){
			switch(cell[Map[train.y/20][train.x/20]].mflag)
			{
				case MOVE_RIGHT:train.mflag = MOVE_RIGHT;break;
				case MOVE_LEFT:	train.mflag = MOVE_LEFT;break;
				case MOVE_UP:	train.mflag = MOVE_UP;break;
				case MOVE_DOWN:	train.mflag = MOVE_DOWN;break;
				default:break;
			}
		}else{
			train.Exist = 0;
		}
	}
	if(train.mflag != MOVE_NONE){
		switch(train.mflag)
		{
			case MOVE_RIGHT:++train.x;break;
			case MOVE_LEFT:	--train.x;break;
			case MOVE_UP:	--train.y;break;
			case MOVE_DOWN:	++train.y;break;
		}
		if((train.x % 20 == 0) && (train.y % 20 == 0))
			train.mflag = MOVE_NONE;
	}
}

void DrawMap(void)
{
	int White = GetColor( 255, 255, 255 );
	
	for(int i = 0, count = sizeof(Map) / sizeof(Map[0]); i < count; i++){
		for(int j = 0, count2 = sizeof(Map[0]) / sizeof(Map[0][0]); j < count2; j++)
		{
			if(Map[j] == 0)
				DrawString(BaseX + j*20, BaseY + i*20, cell[Map[j]].c, White);
			else
				DrawString(BaseX + j*20, BaseY + i*20, cell[Map[j]].c, White);
		}
	}
}
void DrawTrain(void)
{
	int Yellow = GetColor( 255, 255, 0 );
	int Red = GetColor( 255,   0, 0 );

	if(train.Exist == 0)
		DrawString( BaseX + train.x - 35, BaseY + train.y - 20, "\脱線!!/", Red);
	DrawString( BaseX + train.x, BaseY + train.y, "●", Yellow);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode( TRUE );

	if(DxLib_Init() == -1 ) return -1;
	SetDrawScreen( DX_SCREEN_BACK );

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 ){
		MoveTrain();
		DrawMap();
		DrawTrain();
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}
--------------------------------------------------------------------------------------

KEYONN_

Re:汽車のレールを組み立てるパズルゲームなんですが…

#5

投稿記事 by KEYONN_ » 16年前

conioさん、ありがとうございます。
参考になりました。
無事、ゲームは完成しました。
後、もう少し微調整が必要ですが、あとは大丈夫です。
ありがとうございました。

閉鎖

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