function ThinkDirect(id: number) {
let monster = monsters[id];
let pacX = pacman.Position.CenterX;
let pacY = pacman.Position.CenterY;
// イジケ状態でないならパックパンに接近させる。そうでないなら離れさせる
monster.Direct = GetMonsterDirect(monster, pacX, pacY, !monster.IsIjike);
}
function GetMonsterDirect(monster: Monster, pacX: number, pacY: number, approach: boolean): number {
let directs = monster.GetDirectsMonsterMove();
if (directs.length == 1) {
// 移動できる方向がひとつしかないならそれを選択するしかない
return directs[0];
}
let monX = monster.Position.CenterX;
let monY = monster.Position.CenterY;
let dx = monX - pacX;
let dy = monY - pacY;
let nextDirect = Direct.None;
// X座標のほうが大きく離れているならX座標をあわせる方向に移動する
if (Math.abs(dx) > Math.abs(dy)) {
if (dx > 0) {
if (approach && directs.find(direct => direct == Direct.West))
nextDirect = Direct.West;
if (!approach && directs.find(direct => direct == Direct.East))
nextDirect = Direct.East;
}
if (dx < 0) {
if (approach && directs.find(direct => direct == Direct.East))
nextDirect = Direct.East;
if (!approach && directs.find(direct => direct == Direct.West))
nextDirect = Direct.West;
}
// X座標を合わせられないならY座標で評価する
if (nextDirect == Direct.None) {
if (dy > 0) {
if (approach && directs.find(direct => direct == Direct.North))
nextDirect = Direct.North;
if (!approach && directs.find(direct => direct == Direct.South))
nextDirect = Direct.South;
}
if (dy < 0) {
if (approach && directs.find(direct => direct == Direct.South))
nextDirect = Direct.South;
if (!approach && directs.find(direct => direct == Direct.North))
nextDirect = Direct.North;
}
}
}
else {
if (dy > 0) {
if (approach && directs.find(direct => direct == Direct.North))
nextDirect = Direct.North;
if (!approach && directs.find(direct => direct == Direct.South))
nextDirect = Direct.South;
}
if (dy < 0) {
if (approach && directs.find(direct => direct == Direct.South))
nextDirect = Direct.South;
if (!approach && directs.find(direct => direct == Direct.North))
nextDirect = Direct.North;
}
if (nextDirect == Direct.None) {
if (dx > 0) {
if (approach && directs.find(direct => direct == Direct.West))
nextDirect = Direct.West;
if (!approach && directs.find(direct => direct == Direct.East))
nextDirect = Direct.East;
}
if (dx < 0) {
if (approach && directs.find(direct => direct == Direct.East))
nextDirect = Direct.East;
if (!approach && directs.find(direct => direct == Direct.West))
nextDirect = Direct.West;
}
}
}
// この方法で決まらないなら適当に選ぶしかない
if (nextDirect == Direct.None) {
let index = Math.floor((Math.random() * directs.length));
nextDirect = directs[index];
}
return nextDirect;
}