有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
}

它工作得很好,但有时按钮会相互覆盖,这意味着它位于几乎相同的位置。我希望每个按钮都位于一个独特的位置,不要触摸其他按钮

你知道我怎样才能做到这一点吗? 提前谢谢


共 (3) 个答案

  1. # 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轴 因此,您的支票如下:

    For each Button x
      For each button x
         calculate real coordinates of button x and y check intersection 
          if exists recalculate the coordinates and start the loop over 
    

    当谈到运行时间时,这个解决方案有点贵,但是一旦你有了这个想法,你就可以找到更简单的方法

  2. # 2 楼答案

    一种方法是制作一个网格,而不是屏幕上的随机位置,使用网格上的随机点。这样,您可以检查当前网格位置上是否已经有按钮

    如果你想让它们更分散,你可以将每个按钮添加到一个数组中,并检查新的按钮是否不接触其他按钮。无限循环创建随机位置和另一个循环,以检查它们没有击中数组中的其他按钮。一旦找到一个新的位置,添加按钮并打破无限循环

  3. # 3 楼答案

    您需要的是碰撞检测,我的回答将大大简化此过程。我建议搜索碰撞检测算法以了解更多信息

    因此,对于超级简单的开始,我们可以比较两个盒子的位置、长度和高度。对于我的示例,我将假设这些to框的原点是它们的左上角

    if((boxA.xPos + boxA.length ) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length))
    

    这将检查两个框是否沿x轴接触,我们也可以更改y轴的值

    if((boxA.yPos + boxA.height ) < boxB.yPos || boxA.yPos > boxB.yPos + boxB.height)
    

    现在,这不是一个非常有效的方法。有很多更好的方法来简化这个逻辑,节省资源。但是,它又快又脏,对于像您的简单游戏这样只包含6个按钮的小应用程序来说可能已经足够好了

    因此,使用这两个方程,您可以将它们嵌套,然后在其中运行冲突代码,也可以将它们合并到一个方程中,如下所示:

    if(((boxA.yPos + boxA.height) < boxB.yPos || boxA.yPos > (boxB.yPos + boxB.height)) || ((boxA.xPos + boxA.length ) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length)))
    

    对于一行来说,这需要阅读很多内容,如果你刚刚开始,我建议将它们嵌套起来,这样你就可以更好地看到通过方程的逻辑流程。但是,请记住,在将来,如果您需要压缩这些额外的性能,或者将它们合并到一个if语句中,这是一个好的开始