java为按钮生成随机位置
我正在做一个简单的游戏。 我有6个按钮,每次我都想在不同的位置上移动它们
因此,我提出了一个简单的方法来实现这一点
private void changeButtonPlace(ImageView button) {
Random r = new Random();
int newXloc = r.nextInt(getScreenWidth() - (2 * button.getLayoutParams().width));
int newYloc = r.nextInt(getScreenHeight() - (3 * button.getLayoutParams().height));
button.setX(newXloc);
button.setY(newYloc);
}
它工作得很好,但有时按钮会相互覆盖,这意味着它位于几乎相同的位置。我希望每个按钮都位于一个独特的位置,不要触摸其他按钮
你知道我怎样才能做到这一点吗? 提前谢谢
# 1 楼答案
您应该考虑按钮的宽度,在设置按钮的位置之前,确保没有按钮与简单的if相交,如果它们只是随机化相交的按钮,则应易于编程
编辑:
让我们简单一点,假设有3个按钮,假设它们位于具有这些坐标的二维轴上 A:1,0 B:2,0 C:5,0 按钮宽度:X=2 Y=2
正如您在本例中第一眼看到的,如果您将宽度添加到B中,则似乎没有按钮彼此相交,您知道实际位置是B[1,3],-1,1]与实际位置C[4,6],-1,1]相交,假设坐标是按钮的中心
第一个[,]表示X轴第二个[,]表示Y轴 因此,您的支票如下:
当谈到运行时间时,这个解决方案有点贵,但是一旦你有了这个想法,你就可以找到更简单的方法
# 2 楼答案
一种方法是制作一个网格,而不是屏幕上的随机位置,使用网格上的随机点。这样,您可以检查当前网格位置上是否已经有按钮
如果你想让它们更分散,你可以将每个按钮添加到一个数组中,并检查新的按钮是否不接触其他按钮。无限循环创建随机位置和另一个循环,以检查它们没有击中数组中的其他按钮。一旦找到一个新的位置,添加按钮并打破无限循环
# 3 楼答案
您需要的是碰撞检测,我的回答将大大简化此过程。我建议搜索碰撞检测算法以了解更多信息
因此,对于超级简单的开始,我们可以比较两个盒子的位置、长度和高度。对于我的示例,我将假设这些to框的原点是它们的左上角
这将检查两个框是否沿x轴接触,我们也可以更改y轴的值
现在,这不是一个非常有效的方法。有很多更好的方法来简化这个逻辑,节省资源。但是,它又快又脏,对于像您的简单游戏这样只包含6个按钮的小应用程序来说可能已经足够好了
因此,使用这两个方程,您可以将它们嵌套,然后在其中运行冲突代码,也可以将它们合并到一个方程中,如下所示:
对于一行来说,这需要阅读很多内容,如果你刚刚开始,我建议将它们嵌套起来,这样你就可以更好地看到通过方程的逻辑流程。但是,请记住,在将来,如果您需要压缩这些额外的性能,或者将它们合并到一个if语句中,这是一个好的开始