Java中实现无重复坐标对的随机生成算法(适用于战舰游戏布局)

梦雪酱_4315

梦雪酱_4315

2026-10-25

145人浏览

原创

Java中实现无重复坐标对的随机生成算法(适用于战舰游戏布局)

本文介绍一种高效、可扩展的无重复二维坐标对(x, y)随机生成方案,避免传统“重试法”性能退化问题,适用于战舰类游戏中船体自动布放场景。

本文介绍一种高效、可扩展的无重复二维坐标对(x, y)随机生成方案,避免传统“重试法”性能退化问题,适用于战舰类游戏中船体自动布放场景。

在开发类似《BattleShip》的网格类游戏时,一个核心挑战是:如何在有限棋盘(如10×10)上,批量、高效、无冲突地生成多个不重叠的船体位置? 每艘船由连续的单元格组成(如长度为3的横向或纵向序列),而所有船的单元格坐标(x, y)全局唯一——即任意两个单元格不能拥有完全相同的坐标对。

直接使用 Random.nextInt() 配合循环重试(“generate-then-check-if-used-else-retry”)看似简单,但在棋盘填充率升高时,碰撞概率急剧上升,最坏情况下可能陷入长时阻塞或无限循环,不符合生产级游戏逻辑的确定性与响应性要求。

更优解是采用确定性伪随机映射 + 全局状态管理策略。其核心思想不是“随机选点再验证”,而是将所有合法坐标对线性编号 → 通过可逆/遍历式伪随机置换 → 映射回二维坐标,从而保证:

  • 每次调用获取新坐标对,天然不重复;
  • 时间复杂度 O(1) 均摊,无重试开销;
  • 支持提前预分配全部位置,便于碰撞预检。

以下是一个轻量、实用的实现方案(不依赖外部库,兼容 Java 8+):

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
import java.util.*;

public class NonRepeatingCoordinateGenerator {
    private final int width;
    private final int height;
    private final int totalCells;
    private final Random globalRandom;
    private final Set<string> used = new HashSet(); // 用于快速查重(可选,仅调试/兜底)

    // 使用线性同余生成器(LCG)模拟独立随机流 —— 关键优化点
    private static final long A = 25214903917L; // JDK Random 的 multiplier
    private static final long C = 11L;          // JDK Random 的 addend
    private static final long M = 1L  nextUniqueCells(int n) {
        List<cell> result = new ArrayList(n);
        for (int i = 0; i <p>⚠️ <strong>关键注意事项:</strong>  </p>
<ul>
<li>
<strong>不要在每艘船内单独调用 <code>nextUniqueCell()</code> 生成首格后“沿方向延伸”</strong>——这仍可能导致船体之间重叠(例如船A占(2,3)-(2,4)-(2,5),船B首格恰好生成(2,4))。正确做法是:<strong>对整艘船所需的所有单元格(如3个连续坐标),统一从 <code>nextUniqueCells(3)</code> 获取,再校验是否共线且方向一致</strong>;或更稳妥地——先随机选首格和方向,再检查该整条路径是否全部未被占用(使用 <code>Set<cell></cell></code> 快速判断)。  </li>
<li>上述 LCG 实现虽非密码学安全,但对游戏逻辑已足够:周期极长、分布均匀、无明显模式。若需更强随机性,可替换为 <code>ThreadLocalRandom.current().nextLong()</code> 驱动的 Fisher-Yates 洗牌(需预先构建全坐标列表,内存 O(W×H))。  </li>
<li>实际部署时,建议将所有已放置的 <code>Cell</code> 存入 <code>HashSet<cell></cell></code>(需确保 <code>Cell</code> 正确重写 <code>equals()</code> 和 <code>hashCode()</code>),每次生成新船前执行 <code>Collections.disjoint(newShipCells, occupiedCells)</code> 快速校验。</li>
</ul>
<p>总结:解决“无重复随机坐标对”问题,本质是<strong>将随机采样转化为确定性遍历</strong>。通过 LCG 映射或预洗牌,我们摆脱了不可控的重试循环,使布船逻辑兼具高性能、可预测性与可维护性——这才是面向真实游戏场景的工程化答案。</p></cell></string>

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11197

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8302

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7172

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1204

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

968

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1436

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2949

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20211

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1295

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习