gpt4 book ai didi

java - java中的台球游戏如何放入15个球

转载 作者:行者123 更新时间:2023-12-01 19:32:02 27 4
gpt4 key购买 nike

我想用java制作台球游戏,我想在 table 中央形成15个金字塔形状的球,面朝上,但我不知道该怎么做。我必须找到正确的 (x,y) 坐标才能将球放在 table 中央

enter image description here

我看到有人编码,并找到了这个解决方案。

  public class cek {

public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<16;i++) {
int row = (int) Math.floor((Math.sqrt(1+8*i)/ 2)); // Using quadratic equation formula

int x = (- (10 * (5- row)));
System.out.println(i);
System.out.println(Math.sqrt(1 + 8 * i));
System.out.println(x);
}
}

}

结果:

0
1.0
-50
1
3.0
-40
2
4.123105625617661
-30
3
5.0
-30
4
5.744562646538029
-20
5
6.4031242374328485
-20
6
7.0
-20
7
7.54983443527075
-10
8
8.06225774829855
-10
9
8.54400374531753
-10
10
9.0
-10
11
9.433981132056603
0
12
9.848857801796104
0
13
10.246950765959598
0
14
10.63014581273465
0
15
11.0
0

first ball [0]: -50

ball 1-15:
-40,-30,-30,-20,-20,-20,-10,-10,-10,-10,0,0,0,0

正如你所看到的,这可以产生球 1-15 的 x 坐标,就像第一排 1 球、第二排 2 球、第三排 3 球、第四排 4 球、第五排 5 球一样,但他怎么能出现呢与该解决方案和方程?即使在我看到解决方案之后,我认为我也需要 1 天的时间才能弄清楚该代码我想我永远不会想出这个解决方案尤其int row = (int) Math.floor((Math.sqrt(1+8*i)/2));

我正在尝试生成上面的代码,这就是我能想到的..

for(int i=0;i<5;i++){
k=2*i+1-i;//10 20 30 40 50
int x=-(n*10)+k*10;
System.out.println(k);
System.out.println(x);
for(int r=1;r<k;r++) {
System.out.println(x);
}

}

但是如果我想使用参数 1-15 调用球类,并从另一个类中从中创建新球的对象,并且球类将为构造函数中的每个 1-15 个球设置 (x,y) 坐标。这行不通..

int row = (int) Math.floor((Math.sqrt(1+8*i)/ 2)); // Using quadratic equation formula

这项工作..

更新:利用三角学来排列金字塔球我设法做到

enter image description here

     private double rowx(int rowNumber) {
return rowNumber * (Math.sqrt(5) * r);
}

private void generateBalls(){
balls=new ArrayList<Ball2>();
int ballid=0;
indexOfWhiteBall=0;
if (balls.size()==0)
{
int x= Helper.BX + Helper.SW / 4 - r;
int y = Helper.BY + Helper.SH / 2 - r;
Ball2 balle=new Ball2(pinball,ballid,(Helper.BX + Helper.SW / 4 - r),Helper.BY + Helper.SH / 2 - r,r);
balls.add(balle);
balls.get(0).iswhiteball=true;
ballid++;

}
for(int i=0;i<5;i++) {
double y= rowx(i);
for(double x:rowY(i)) {

Ball2 balle=new Ball2(pinball,ballid,(Helper.BX + (2.5*Helper.SW)/4 ) +y,(Helper.BY + Helper.SH / 2) +x,r);
balls.add(balle);
ballid++;
System.out.print(balle + " ");

}
}
}
private double[] rowY(int rownum) {

switch(rownum) {
case 0: return new double[] {0};
case 1:return new double[] {-r,r};
case 2:return new double[] {-2*r,0,2*r};
case 3: return new double[] {-3*r, -r, r, 3*r};
case 4: return new double[] {-4*r, -2*r, 0, 2*r, 4*r};
case 5:return new double[] {Helper.BX + Helper.SW / 4 - r};
default:throw new IllegalArgumentException("no more than 5");
}
}

最佳答案

enter image description here

正如您所看到的,如果连接圆心,就会得到等边三角形。

考虑到上面的小一个。它的边长为 2*r,其高度 h 可以使用毕达哥拉斯定理计算:h^2 = r^2 + (2*r )^2。所以 h = sqrt(5) * r,这就是第二行的 y 坐标。

此外,球在 x 轴上移动了 r

因此,如果第一个球的中心是(0, 0),则第二行2个球的中心是(-r, sqrt(5)*r)(r, sqrt(5)*r)

您现在可以应用相同的原理并计算其他球的中心。

现在,请提供一些代码来实现这一点(通过编辑您的问题)。如果您付出努力,我们可以帮助您进一步获得正确的代码。

实现

假设您有一个 Ball 类,如下所示:

class Ball {
private final int id;
private final double x, y;

public Ball(int id, double x, double y) {
this.id = id;
this.x = x;
this.y = y;
}

@Override
public String toString() {
return "Ball{ id=" + id +"(x=" + x +", y=" + y + ") }";
}
}

您可以在 Pool 类上有一个 setupBalls ,其内容如下:(我添加了 printlns 来帮助理解它是如何进行的,所有球都添加到 balls 列表中)

public class Pool {

private static double r = 20;

private void setupBalls() {
List<Ball> balls = new ArrayList<>();
int ballId = 0;

// for each row
for(int rowNumber = 0; rowNumber<5; rowNumber++) {
System.out.print("Row "+rowNumber + ": ");

// get the Xs of the balls in that row,
// and create a ball for each
double y = rowY(rowNumber);
for(double x : rowXs(rowNumber)) {
Ball ball = new Ball(ballId, x, y);
balls.add(ball);
System.out.print(ball + " ");
ballId++;
}

System.out.println();
}
}

// Returns the Y of a given row
private double rowY(int rowNumber) {
return rowNumber * (Math.sqrt(5) * r);
}

// Returns the list of the Xs for the balls on the given row
private double[] rowXs(int rowNumber) {
switch (rowNumber) {
case 0: return new double[] {0};
case 1: return new double[] {-r, r};
case 2: return new double[] {-2*r, 0, 2*r};
case 3: return new double[] {-3*r, -r, r, 3*r};
case 4: return new double[] {-4*r, -2*r, 0, 2*r, 4*r};
default: throw new IllegalArgumentException("no more than 5 rows");
}
}

}

然后像这样使用它:

public static void main(String[] args) {
new Pool().setupBalls();
}

关于java - java中的台球游戏如何放入15个球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com