首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当随机数字与其他数字不同时,才将其添加到列表中

仅当随机数字与其他数字不同时,才将其添加到列表中
EN

Stack Overflow用户
提问于 2020-06-28 15:59:41
回答 2查看 55关注 0票数 0

我正在设计一个Scratch游戏。这款游戏被认为是一艘宇宙飞船在太空中旅行,避开小行星。这些小行星从屏幕右侧固定的X位置开始,然后水平地向左移动,直到它们撞上固定的X位置,它们就会消失。小行星将在2-6之间分组开始(这是一个随机生成的数字),每组间隔约1秒。

假设游戏一次抛出最多6颗小行星,我想确保每颗小行星都离下一颗很远。我尝试使用两个变量并比较距离,但这不起作用。我可以把一组小行星Y产卵的位置放到一个列表中。例如,在我的列表中,我有:

代码语言:javascript
复制
0, 100, 5, 30, -20

正如您所看到的,该列表中有两个相邻的项目。我要做的是防止发生这种情况,所以第三项应该是其他值,比如-50,如果生成了一个六项,确保它也很远。

有人能用伪代码来实现这样的事情吗?不管它是用哪种编程语言编写的,我大概都能把它的大意转换成Scratch。

EN

回答 2

Stack Overflow用户

发布于 2020-07-02 02:51:59

有一种方法可以在没有试错循环的情况下做到这一点。不是选择随机位置,而是选择随机距离,然后缩放它们以适合屏幕。

粗略地说,方法如下。下面的列表表示相邻小行星之间的距离(按Y坐标排序),以及最外面的小行星与屏幕边缘之间的距离。例如,如果一组包含6个小行星,那么您需要每个元素包含7个元素的列表。

  1. 创建最小距离的列表L1。显然,这些都是固定值。
  2. 创建了一个随机数列表L2。从某个具有正下限的任意固定范围中获取它们,例如,1..100.
  3. Calculate总‘松弛’=屏幕高度减去sum(L1).
  4. Calculate乘法因子=松弛除以sum(L2).
  5. Multiply具有乘法因子的L2的每个元素。
  6. 将L1中的每个值与L2中的值在同一索引中相加。

L2现在包含距离列表,这些距离包括:

屏幕高度遵循L1

  • 中指定的最小距离加起来等于

的高度

最后一步是根据L2中的距离定位每颗小行星相对于其邻居的位置。

注意:如果步骤3给出一个负数,那么很明显屏幕上没有足够的空间来容纳所有的小行星。更糟糕的是,一个天真的“试错”算法会导致无限循环。当然,解决方案是修改参数;您不能在最小距离为100的情况下将6颗小行星拟合到360像素。

票数 1
EN

Stack Overflow用户

发布于 2020-06-28 16:23:41

为此,您需要遍历数组中以前的每个条目,将该值与新值进行比较,如果有任何元素太接近,则更改该值。此过程需要重复,直到找到合适的数字。如果该数字小于某个最小距离,则将变量tooClose设置为yes,并重置该值。在循环开始时,将tooClose设置为yes,以便至少生成一个随机数。然后,在循环开始时,将该值随机化,并将tooClose设置为no,然后,我使用值i遍历前面的所有条目,比较每个元素,如果太接近,则将tooClose设置为yes。数字之间的比较是通过减法,然后是绝对值来完成的,这将确保结果是正的,给出两个数字之间的差值作为正值。

以下是代码的截图:

这是一个项目:https://scratch.mit.edu/projects/408196031/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62619800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档