将不同大小的对象添加到世界的最佳解决方案是什么?

用户9534568

我正在开发一个游戏,我使用不同大小的对象 - 例如房屋、树木等。我的问题是,我应该通过哪种方式确定我要放置对象的位置是否空闲?每次启动游戏时都会随机生成世界。

(我只使用 x 和 z 坐标)例如,我在一个大小为 10x10 的项目池中有树,在位置 10、0、10,我将添加一个大小为 5x5 的石头。那么我如何告诉石头“嘿,你不能把自己放在 x 轴上的 5 到 15 坐标和 z 轴上的 5 到 15 坐标,放在其他地方”。

是的,一个简单的方法就是写下所有的坐标(5,6,7 ... 14,15),但是如果我有 1000 棵树呢?除了循环遍历坐标列表之外,是否有更好更快的方法来定位该项目的空闲位置,这些坐标列表也已循环写入到插槽中?

Bizhan

哈希表搜索背后的逻辑可以鼓舞人心。

提醒我们哈希表:

当搜索n在哈希表

  • 我们先看看哈希函数h(n)哪里h
  • 如果命中则报告记录,如果未命中则移至 h(n)+1。
  • 如果命中则报告记录,如果未命中则移至 h(n)-1。
  • 如果命中则报告记录,如果未命中则移至 h(n)+2。
  • 如果命中则报告记录,如果未命中则移至 h(n)-2。
  • 如果命中则报告记录,如果未命中则移至 h(n)+4。
  • 如果命中则报告记录,如果未命中则移至 h(n)-4。
  • ...

我们将步长设置为 2^i 序列中的数字及其负数 (0,1,-1,2,-2,4,-4,8,-8,16,...)


现在在你的场景中:

  • 我们先看看目标位置t哪里t
  • 如果有空就报告位置,如果没有就移动到 [tx,t.y+1]。
  • 如果有空就报告位置,如果没有就移动到 [tx,ty-1]。
  • ...
  • 如果有空就报告位置,如果没有就移动到 [tx-1,ty-1]。
  • 如果有空就报告位置,如果没有就移动到 [tx,t.y+2]。
  • ...
  • 如果有空就报告位置,如果没有就移动到 [tx,t.y+4]。
  • ...

现在我们如何判断一个位置是否免费?您可以创建一个实际的哈希表来存储其中的所有对象位置现在,当您需要检查 [x,y] 周围的空闲位置以放置石头时,您将不得不在哈希表中搜索h(x,y)

如果您需要将像一个3x3的圆形喷泉更大的物体在位置[X,Y]你需要检查这些记录也:h(x+1,y), h(x-1,y), h(x,y+1), h(x,y-1)由于它是一个圆形物体,您可以近似该区域以简化并因此h(x+1,y+1), h(x+1,y-1), h(x-1,y+1), h(x-1,y-1)从您的搜索中删除四个相对位置

之后,您应该将所有这些位置添加到哈希表中,以便以后更容易找到被占用的位置。例如,添加一个 3x3 对象需要向哈希表添加 9 条记录。

请注意,哈希函数应反映二维(或三维)世界。例如h(x,y) = x*N + yNy 轴上世界的最大尺寸在哪里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

制作此动画的最佳解决方案是什么

Django OpenID的最佳解决方案是什么?

scrollWidth 问题的最佳解决方案是什么?

更新MARA表的最佳解决方案是什么?

用户注册的最佳解决方案是什么?

添加INDEX以加快查询的最佳解决方案是什么?

Android:存储库模式创建对象的最佳解决方案是什么?

NAS与Microsoft Server:最佳解决方案是什么?[解决了]

python中数据库连接池的最佳解决方案是什么?

避免内联 onClick 函数的最佳解决方案是什么?

用PDFBox压缩PDF的最佳解决方案是什么?

用ASP控件显示明细行的最佳解决方案是什么?

在PHP中填充受限变量的最佳解决方案是什么

在CRM中重新运行失败的插件的最佳解决方案是什么

laravel中的静态身份验证的最佳解决方案是什么?

在这种情况下,字符串存储的最佳解决方案是什么?

对于这种赞成/反对机制,性能方面的最佳解决方案是什么?

在 PHP 后端从多个 API 提供服务的最佳解决方案是什么?

Typescript的类型定义管理系统(如tsd)的最佳解决方案是什么?

使用javascript的Web接口的最佳解决方案是什么?

用仇恨词过滤掉Elasticsearch结果的最佳解决方案是什么?

混淆Angular JS控制器代码的最佳解决方案是什么

我的laravel项目发送“忘记密码”电子邮件的最佳解决方案是什么?

在rails yml文件中存储密码的最佳解决方案是什么?

您处理vue中的组件的最佳解决方案是什么?

开发laravel和vue项目的最佳解决方案是什么?

性能的最佳解决方案是什么:Fedora 的 LXQt 旋转或使用 dnf 安装 @lxqt?

在 Windows 中安装 GNU gettext 的最佳解决方案是什么?

SQL 2不同的注释类型-最佳解决方案?