public Action NextMove(InternalMapData map) { logger.Debug("*** NextMove start *************"); var result = new Action(); var p = map.Players.Find(player => player.Name.Contains(Consts.MyName)); var allMoves = new MOVE[] { MOVE.UP, MOVE.DOWN, MOVE.LEFT, MOVE.RIGHT, MOVE.STAY }.ToList(); var availableMoves = allMoves .Where(move => { return(!map.IsWallOrBlock(p.pos.PositionAfterMove(move))); }) ; if (availableMoves.Count() == 0) { // 閉じ込められた? logger.Debug("No Choice."); availableMoves = allMoves; result.Move = ChooseRandomMove(availableMoves.ToList()); result.Bomb = false; return(result); } if (map.IsInDanger(p.pos)) { // in danger logger.Debug("in danger"); Position nearestSafePos = map.FindNearestSafePlace(); if (nearestSafePos == null) { // 死んだ。やけくそ移動 logger.Debug("I am dying."); result.Move = ChooseRandomMove(availableMoves.ToList()); result.Bomb = false; return(result); } var pathToSafePlace = map.PathToPosition(nearestSafePos); if (pathToSafePlace.Count() == 0) { result.Move = ChooseRandomMove(availableMoves.ToList()); result.Bomb = false; return(result); } result.Move = pathToSafePlace.FirstOrDefault(); result.Bomb = false; return(result); } else { // not in danger logger.Debug("not in danger"); var placeToSetBombs = map.PlaceToSetBomb().ToList(); foreach (var placeToSetBomb in placeToSetBombs) { if (placeToSetBomb == p.pos) { var tempBomb = new Bomb(p); map.AddBomb(tempBomb); Position nearestSafePos = map.FindNearestSafePlace(); map.RemoveBomb(tempBomb); if (nearestSafePos == null) { // 置くと安全な場所がない continue; } var pathToSafePlace = map.PathToPosition(nearestSafePos); result.Move = pathToSafePlace.FirstOrDefault(); result.Bomb = true; return(result); } else { var pathToPlaceBomb = map.PathToPosition(placeToSetBomb); var move = pathToPlaceBomb.FirstOrDefault(); if (map.IsInDanger(p.pos.PositionAfterMove(move))) { // 次の場所へ continue; } result.Move = move; result.Bomb = false; return(result); } } var safeMoves = availableMoves.Where(move => { return(!map.IsInDanger(p.pos.PositionAfterMove(move))); }); if (safeMoves.Count() == 0) { // やけくそ logger.Debug("I am dying 2."); result.Move = availableMoves.First(); result.Bomb = false; return(result); } if (TryRandomPlaceBomb()) { var tempBomb = new Bomb(p); map.AddBomb(tempBomb); Position nearestSafePos = map.FindNearestSafePlace(); map.RemoveBomb(tempBomb); if (nearestSafePos == null) { // 置くと安全な場所がない } else { var pathToSafePlace = map.PathToPosition(nearestSafePos); result.Move = pathToSafePlace.FirstOrDefault(); result.Bomb = true; return(result); } } result.Move = ChooseRandomMove(safeMoves.ToList()); result.Bomb = false; return(result); } }