c - 尝试在随机 x 位置创建精灵而不在 c 中重叠
问题描述
所以我正在尝试使用精灵创建一个平台级别,它们中的每一个都是沿着屏幕在相同的 y 位置随机创建的。虽然,我遇到的问题是,当它们随机创建时,它们会不断重叠,我似乎无法找到一种方法来创建它们,以免它们重叠。
我的程序当前在随机 x 位置创建一个精灵,然后一个 for 循环创建指定数量的平台。我的问题是,如果我想阻止它们重叠,我是否需要在随机 x 规范期间或在创建多个精灵的 for 循环期间尝试进行约束。
c 的新手,所以真的坚持这个逻辑,任何帮助将不胜感激。
解决方案
(你把它作为一个数学/算法问题,所以我将提供一个数学答案,而不是一个现成的 C 程序 :),享受编码 - 如果你遇到困难,请在这里提问)
简而言之,您想在 0..N-1 范围内生成 M 个数字(在您的情况下为 M 个平台的 x 个位置)的列表,以便这些数字都是不同的。显然 M < N。
对于第一个你有 N 个可能的选择,对于第二个你有 N-1 个选择(一个被选中),对于第三个 N-2,等等。
有很多方法可以做到这一点,但这里有一个简单的方法:
用数字 0..N-1 填充 N 个整数的数组(这样a[i] == i
对于 的所有值i
)。
现在,设置 n = N-1 并执行 M 次:
- 在 (0..n) 范围内取一个随机数 r,并使用 a[r] 作为下一个选择
- 通过将所有内容从 a[r+1] 到末尾移动一个位置,从数组中删除 a[r]。
- 递减 n (
n--
)
(每次循环都会从一个数字越来越少的列表中进行选择,而这些数字正是在被排除之前被挑选出来的)
推荐阅读
- python - 如何创建一个充满流程输出的字典?
- bootstrap-4 - 为什么 Bootstrap 4 默认使用 A3 页面大小?
- r - 使用 stat="count" 时将 geom_bar 从高到低重新排序
- php - 有没有办法选择最后一条记录然后用关系过滤?
- sql - 用于添加时间到日期的 ssis 表达式
- html - 连续 2 次
- for-loop - 谷歌应用脚本 - 如果满足条件,用静态值替换公式
- c# - 如何在构建表达式的 IQueryable 扩展中使用多个字段选择器
- bioinformatics - 如何使用 Snakemake 处理多个输出文件名约定
- java - 以这种方式从 AsyncTask 获取回调有什么问题吗?