- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要一些建议来构建一种算法,根据船舶不能重叠或接触(甚至是对角线)的规则在板上放置多艘船。在选择一个随机位置后,我如何确保我仍有足够的空间容纳其余的飞船?
例如,我想在 6x6 板(二维阵列)上放置 5 艘船。船的尺寸为:5、4、3、1、1。有几种排列方式,如下所示:
-------------
| 1 1 1 1 1 . |
| . . . . . . |
| 2 2 2 2 . 4 |
| . . . . . . |
| 3 3 3 . . 5 |
| . . . . . . |
-------------
随机算法看起来像这样:
1. Get next ship
2. Get random cell and orientation
3. Try to fit ship (find any conflicts)
3a. If ship cannot fit, try different
cell and orientation, untill all cells
have been tried (function fails)
3b. If ship fits, get another ship (goto 1)
但如果我使用它,我很可能会像这样结束(编辑:更改以反射(reflect)在步骤 0 中按大小对船舶进行排序):
-------------
| . 3 3 3 . 4 | 5
| . . . . . . |
| . 2 2 2 2 . |
| . . . . . . |
| 1 1 1 1 1 . |
| . . . . . . |
-------------
这意味着 1 格大小的飞船没有位置。我怎样才能避免这样的问题?我将如何实现函数 verifyRestShipsWillFit()
以放置在 3b 中?
最佳答案
使用一些启发式方法对船只进行排序,例如最大的第一。然后通过从一个空板和完整的船舶列表开始,开始递归放置。它本质上是一个树搜索:
请记住,如果您有不可变类,使用递归总是更容易。将一艘船放在板上会创建一个新板,而无需更改板。
Board GetRandomBoard()
{
List<Ship> ships = { .. } // List of all ships.
Board = Board.Empty();
Board result = PlaceShips(ships, board);
return result; // You could have a retry here as well if it fails.
}
private Board PlaceShips(IEnumerable<Ship> shipsRemaining, Board board)
{
Ship shipToPlace = shipsRemaining.FirstOrDefault();
// If all ships were placed, we are done.
if (shipToPlace == null)
return board;
int attempts = 0;
while (attempts++ < MaxAttempts)
{
// Get a position for the new ship that is OK with the current board.
ShipPosition pos = GetRandomShipPosition(board, shipToPlace);
// If it isn't possible to find such a position, this branch is bad.
if (pos == null)
return null;
// Create a new board, including the new ship.
Board newBoard = new board.WithShip(shipToplace, pos);
// Recurse by placing remaining ships on the new board.
board nextBoard = PlaceShips(shipsRemaining.Skip(1).ToList(), newBoard);
if (nextBoard != null)
return nextBoard;
}
return null;
}
关于algorithm - 避免战舰随机放置算法中的死胡同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16337427/
所以,我必须在 10x10 的板上制作一个用户对计算机的 Battleship 游戏来上编程课。我必须让计算机随机放置五艘大小为 5、4、3、3 和 2 的船。 我所做的是,我生成了 0 到 9 之间
我正在学习创建一个java游戏,对java来说还是个新手。现在我想创建一个战舰游戏。但现在我被困在这里了。现在,当我随机放置船作为电脑板时,有时它会与之前的船重叠,因此游戏变得不平衡。其次,在我收到玩
我正在制作战舰游戏,一切正常。但是由于我加入了一个回合系统,游戏无法正常运行。游戏有两个棋盘(一个是隐藏的,另一个是“公开的”,对手可以看到(所以没有船只)。隐藏的有效,但公众每回合都会重置,所以你看
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我正在制作一款战舰游戏。我创建了一个 Ship 类来为船只提供位置。 创建类后,我必须创建所有实例,我想知道是否有一种方法可以自动化它。 大部分程序都是无关紧要的,但我将其保留,以防万一它可能会影响它
我的编译器告诉我有错误,但我已经给我的导师发了电子邮件,他说我的代码非常好。 错误是错误: 1 error C4716: 'ShipPlacement' : must return a value,
我是一个想学习Java的菜鸟。我正在阅读《Head First Java》一书,并且非常喜欢它。我在学习使用 ArrayList<> 时遇到了一个问题而不是常规的array[] 。我在尝试分配 int
我是一名优秀的程序员,十分优秀!