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

标签 java

我目前只是在摆弄一些代码,但一直遇到问题。我想创建十个圆圈,然后让它们在 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/

相关文章:

java - 尝试映射列表时出现不兼容类型错误

Java 8 Stream 确定文本文件中的最大计数

java - 将md5转换为Java中的两个long变量

java - Google 相册 API - 静态内容上传项目的永久 URL

java - 我如何找到以下功能的时间复杂度?

java - 抵押贷款计算返回负值

java - 公共(public)类的父类(super class)可以是包私有(private)的吗?

java - 在不同的类中使用Android canvas,调试崩溃错误

java - java中遇到连字符时分割句子

java - 非常简单的符号频率