
本文详细介绍了在战舰游戏中,如何在20个位置中随机且不重复地放置5艘战舰(编号1-5),并用0标记空位。核心策略是利用一个临时列表来管理可用位置,通过随机选取并移除位置来确保唯一性,从而避免直接在目标数组中进行重复的随机赋值,最终生成一个符合游戏规则的战舰布局。
在开发战舰类游戏时,一个常见的需求是在有限的棋盘格中随机放置多艘船只,同时确保这些船只的位置不重复,且未放置船只的格子用特定标识符(例如0)填充。直接通过循环和随机数向目标数组赋值,往往会导致位置重复或逻辑复杂。本文将介绍一种高效且可靠的方法来解决此问题。
假设我们需要在20个位置(索引0到19)中放置5艘编号为1到5的战舰。一个直观但错误的尝试可能是遍历20个位置,然后随机决定是否放置船只,并随机分配船只编号。然而,这种方法很难保证:
例如,原始问题中提供的代码片段尝试直接向 barcosComputadora 数组的随机索引赋值,这会导致位置重复和船只编号重复的问题。
// 原始问题中不正确的尝试示例
for (int i = 0; i < barcosComputadora.length; i++) {
if (i > 0) { // 这个条件也比较奇怪
barcosComputadora[i] = rnd.nextInt(6); // 可能生成重复的船只编号,且没有控制位置唯一性
}
}为了解决上述问题,我们采用一种“先选位置,再放置船只”的策略。其核心思想是维护一个所有可用位置的列表,然后从中随机抽取N个不重复的位置,最后将船只放置到这些选定的位置上。
以下是一个完整的Java代码示例,演示了如何在20个位置中随机放置5艘编号为1到5的战舰:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class BattleshipPlacement {
/**
* 在指定大小的游戏板上随机放置指定数量的船只。
*
* @param boardSize 游戏板的总位置数。
* @param numShips 要放置的船只数量。
* @return 包含船只布局的整型数组,0表示空位,1-numShips表示船只。
*/
public static int[] placeShipsRandomly(int boardSize, int numShips) {
if (numShips > boardSize) {
throw new IllegalArgumentException("船只数量不能超过游戏板大小。");
}
// 1. 初始化游戏板,所有位置默认为0(空)
int[] gameBoard = new int[boardSize];
// 2. 创建可用位置列表,包含所有棋盘索引
List<Integer> availablePositions = new ArrayList<>();
for (int i = 0; i < boardSize; i++) {
availablePositions.add(i);
}
Random random = new Random();
// 3. 随机选择并放置船只
for (int shipId = 1; shipId <= numShips; shipId++) {
// 生成一个随机索引,范围是当前可用位置列表的大小
int randomIndex = random.nextInt(availablePositions.size());
// 从列表中移除并获取选定的位置
int chosenPosition = availablePositions.remove(randomIndex);
// 将船只放置到游戏板的选定位置
gameBoard[chosenPosition] = shipId;
}
return gameBoard;
}
/**
* 打印游戏板的当前状态。
*
* @param board 游戏板数组。
*/
public static void printBoard(int[] board) {
for (int i = 0; i < board.length; i++) {
System.out.print(board[i] + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int boardSize = 20; // 游戏板总位置数
int numShips = 5; // 要放置的船只数量
System.out.println("生成战舰布局:");
int[] computerShips = placeShipsRandomly(boardSize, numShips);
printBoard(computerShips);
// 可以多次运行以观察不同的随机布局
System.out.println("\n再次生成战舰布局:");
computerShips = placeShipsRandomly(boardSize, numShips);
printBoard(computerShips);
}
}生成战舰布局: 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 3 0 0 5 4 再次生成战舰布局: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 5 3 4
从示例输出可以看出,5艘船(编号1-5)被随机放置在了20个位置中的5个不重复的位置上,其余位置均为0。
通过采用“先确定位置,再放置物品”的策略,并结合 ArrayList 的 remove 方法,我们可以高效且准确地在指定数量的位置中随机、不重复地放置多艘船只。这种方法不仅逻辑清晰,而且易于实现和扩展,是战舰类游戏或其他类似随机布局场景的理想解决方案。
以上就是如何在20个位置中随机且不重复地放置5艘战舰的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号