int block = CheckMapState( EnemyData[i].NowBlockX, EnemyData[i].NowBlockY );
if( block == 2 ){
// 強制移動地点だったら無条件で上に移動
EnemyData[i].Direction = 2;
EnemyData[i].NextBlockY--;
}else{
// 方向ごとの前方向
int FrontPos[4][2] =
{
{ 0, 1 },{ -1, 0 },{ 0, -1 },{ 1, 0 }
};
// 方向ごとの左方向
int LeftPos[4][2] =
{
{ 1, 0 },{ 0, 1 },{ -1, 0 },{ 0, -1 }
};
// 方向ごとの前方向
int RightPos[4][2] =
{
{ -1, 0 },{ 0, -1 },{ 1, 0 },{ 0, 1 }
};
// 方向ごとの後方向
int BackPos[4][2] =
{
{ 0, -1 },{ 1, 0 },{ 0, 1 },{ -1, 0 }
};
int Direction = EnemyData[i].Direction;
int NextBlockX = EnemyData[i].NextBlockX + FrontPos[Direction][0];
int NextBlockY = EnemyData[i].NextBlockY + FrontPos[Direction][1];
if( CheckMapState( NextBlockX, NextBlockY ) == 0 ){
// 前方向が進入可能ならそのまま前進
EnemyData[i].NextBlockX = NextBlockX;
EnemyData[i].NextBlockY = NextBlockY;
}else{
int LeftX = EnemyData[i].NextBlockX + LeftPos[Direction][0];
int LeftY = EnemyData[i].NextBlockY + LeftPos[Direction][1];
int RightX = EnemyData[i].NextBlockX + RightPos[Direction][0];
int RightY = EnemyData[i].NextBlockY + RightPos[Direction][1];
int BlockLeft = CheckMapState( LeftX, LeftY );
int BlockRight = CheckMapState( RightX, RightY );
if( (BlockLeft == 0) && (BlockRight == 0) ){
// 左右両方とも進入可なら1/2の確立で左右どちらかを選択
int Next = rand() % 2;
if( Next == 0 ){
// 左方向に決定
EnemyData[i].NextBlockX = LeftX;
EnemyData[i].NextBlockY = LeftY;
EnemyData[i].Direction += 3;
EnemyData[i].Direction %= 4;
}else{
// 右方向に決定
EnemyData[i].NextBlockX = RightX;
EnemyData[i].NextBlockY = RightY;
EnemyData[i].Direction++;
EnemyData[i].Direction %= 4;
}
}else if( (BlockLeft == 0) && (BlockRight != 0) ){
// 左方向が進入可で左方向が進入不可の場合は左方向に決定
EnemyData[i].NextBlockX = LeftX;
EnemyData[i].NextBlockY = LeftY;
EnemyData[i].Direction += 3;
EnemyData[i].Direction %= 4;
}else if( (BlockLeft != 0) && (BlockRight == 0) ){
// 右方向が進入可で左方向が進入不可の場合は右方向に決定
EnemyData[i].NextBlockX = RightX;
EnemyData[i].NextBlockY = RightY;
EnemyData[i].Direction++;
EnemyData[i].Direction %= 4;
}else if( (BlockLeft != 0) && (BlockRight != 0) ){
// 左右どちらも進入不可の場合は後ろに移動
EnemyData[i].NextBlockX += BackPos[Direction][0];
EnemyData[i].NextBlockY += BackPos[Direction][1];
EnemyData[i].Direction += 2;
EnemyData[i].Direction %= 4;
}
}
}
|