gpt4 book ai didi

java - while 循环返回重复的随机值而不是新的随机值

转载 作者:行者123 更新时间:2023-12-01 16:38:43 25 4
gpt4 key购买 nike

我目前只是在摆弄一些代码,但一直遇到问题。我想创建十个圆圈,然后让它们在 window 周围弹跳。我遇到了一些问题(比如当我希望圆圈从墙上弹开时,由于某种原因 400,400 窗口实际上并不是那么大。我通过检查是否 x + width >= 400 让圆圈在右侧碰撞,但是它会在屏幕外弹跳,除非我将 400 更改为 380?),但我的主要问题是,当我创建圆圈时,我希望它们位于不同的位置(这样它们在移动之前就不会发生碰撞)。我试图得到它,以便如果一个圆将位于另一个圆内,则再次创建随机的 x 和 y 坐标,直到它不在另一个圆内。但由于某种原因,如果我输入 r.nextInt()在 while 循环内,它不断给我相同的值。有人可以帮忙吗?附注我不介意对我所犯的任何其他错误提出建议。

  package practicedots;

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PracticeDots extends JPanel {

float dots[][] = new float[10][7];
Random r = new Random();
boolean first = true;

float x = 0;
float y = 0;
float xAccel = 0;
float yAccel = 0;
int wall = 380;
int width = 50;
float radius = 0;

float centreX = 0;
float centreY = 0;

boolean collision;

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new PracticeDots());
f.setPreferredSize(new Dimension(400, 400));
f.setResizable(true);
f.pack();
f.setVisible(true);
}

/**
*
* @return
*/
public float[][] CreateDots() {

if (first == true) {
for (int i = 0; i < 10; i++) {
while(collision == true){
x = r.nextInt(300);
y = r.nextInt(300);
xAccel = r.nextFloat() / 2;
yAccel = r.nextFloat() / 2;
radius = width/2;
centreX = x + radius;
centreY = y + radius;

dots[i][0] = x;
dots[i][1] = y;
dots[i][2] = xAccel;
dots[i][3] = yAccel;
dots[i][4] = radius;
dots[i][5] = centreX;
dots[i][6] = centreY;
bounce();
}

}
first = false;
} else if (first == false) {

for (int i = 0; i < 10; i++) {
dots[i][0] = dots[i][0] + dots[i][2];
dots[i][1] = dots[i][1] + dots[i][3];

if (dots[i][0] >= wall - width) {
dots[i][2] = -dots[i][2];
}
if (dots[i][1] >= wall - 20 - width) {
dots[i][3] = -dots[i][3];
}

if (dots[i][0] < 0) {
dots[i][2] = -dots[i][2];
}
if (dots[i][1] < 0) {
dots[i][3] = -dots[i][3];
}
bounce();
}
}

repaint();

return dots;
}
//(x2-x1)^2 + (y1-y2)^2 <= (r1+r2)^2
public void bounce() {
for (int i = 0; i < 10; i++) {
for (int a = 0; a < 10; a++) {
if (a != i) {
System.out.println((dots[i][0] - dots[a][0])*(dots[i][0] - dots[a][0]) + (dots[i][1] - dots[a][1])*(dots[i][1] - dots[a][1]) <= (dots[i][4] + dots[a][4]) * (dots[i][4] + dots[a][4]));
collision = (dots[i][0] - dots[a][0])*(dots[i][0] - dots[a][0]) + (dots[i][1] - dots[a][1])*(dots[i][1] - dots[a][1]) <= (dots[i][4] + dots[a][4]) * (dots[i][4] + dots[a][4]);
}
}
}

}

/**
*
* @param g
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

for (int i = 0; i < 10; i++) {
CreateDots();
g.drawOval((int) dots[i][0], (int) dots[i][1], width, width);
g.fillOval((int) dots[i][0], (int) dots[i][1], width, width);
}
}
}


<!-- end snippet -->

最佳答案

有几个问题:

  1. bounce 期间,您应该在第一次发现碰撞时返回,否则碰撞将被设置为 true,但随后可能会在 for 的下一次迭代中设置回 false -循环。

  2. first == true条件下,您应该将collision初始化为true,否则它永远不会执行 while 完全循环。或者将其更改为 do-while

  3. paintComponent 期间,您不应在 for 循环内调用 CreateDots,因为它会循环遍历所有点本身。之前调用一下就可以了。

代码似乎适用于这些更改(包括宽度 400 而不是 380):

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PracticeDots extends JPanel {
float dots[][] = new float[10][7];
Random r = new Random();
boolean first = true;

float x = 0;
float y = 0;
float xAccel = 0;
float yAccel = 0;
int wall = 400;
int width = 50;
float radius = 0;

float centreX = 0;
float centreY = 0;

boolean collision;

public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new PracticeDots());
f.setPreferredSize(new Dimension(400, 400));
f.setResizable(true);
f.pack();
f.setVisible(true);
}

public float[][] CreateDots() {
if (first == true) {
for (int i = 0; i < 10; i++) {
do {
x = r.nextInt(300);
y = r.nextInt(300);
xAccel = r.nextFloat() / 2;
yAccel = r.nextFloat() / 2;
radius = width / 2;
centreX = x + radius;
centreY = y + radius;

dots[i][0] = x;
dots[i][1] = y;
dots[i][2] = xAccel;
dots[i][3] = yAccel;
dots[i][4] = radius;
dots[i][5] = centreX;
dots[i][6] = centreY;
bounce();
} while (collision == true);

}
first = false;
} else {
for (int i = 0; i < 10; i++) {
dots[i][0] = dots[i][0] + dots[i][2];
dots[i][1] = dots[i][1] + dots[i][3];

if (dots[i][0] >= wall - width) {
dots[i][2] = -dots[i][2];
}
if (dots[i][1] >= wall - 20 - width) {
dots[i][3] = -dots[i][3];
}

if (dots[i][0] < 0) {
dots[i][2] = -dots[i][2];
}
if (dots[i][1] < 0) {
dots[i][3] = -dots[i][3];
}
bounce();
}
}

repaint();

return dots;
}

public void bounce() {
collision = false;
for (int i = 0; i < 10; i++) {
for (int a = 0; a < 10; a++) {
if (a != i && !(dots[a][0] == 0 && dots[a][1] == 0)) {
boolean thisCollision = (dots[i][0] - dots[a][0]) * (dots[i][0] - dots[a][0]) + (dots[i][1] - dots[a][1]) * (dots[i][1] - dots[a][1]) <= (dots[i][4] + dots[a][4]) * (dots[i][4] + dots[a][4]);
// System.out.println("collision: "+collision+" i="+i+" a="+a);
if (thisCollision) {
collision = true;
return;
}
}
}
}
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

CreateDots();
for (int i = 0; i < 10; i++) {
g.drawOval((int) dots[i][0], (int) dots[i][1], width, width);
g.fillOval((int) dots[i][0], (int) dots[i][1], width, width);
}
}
}

关于java - while 循环返回重复的随机值而不是新的随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61907351/

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