Java 使用随机数移动JPanel图像

Java 使用随机数移动JPanel图像,java,Java,我正在为我的班级制作一个赛车游戏,我只用java编程了几个星期,所以我想知道如何使用一个随机数让我的赛车以不同的速度行驶 package racing.game; import java.awt.Color; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class RacingGame { pub

我正在为我的班级制作一个赛车游戏,我只用java编程了几个星期,所以我想知道如何使用一个随机数让我的赛车以不同的速度行驶

package racing.game;

import java.awt.Color;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class RacingGame {

    public static void main(String[] args) {
        int temp ;
        int dist1 = 0;
        int dist2 = 0;
        int dist3 = 0;
        int dist4 = 0;
        int i = 0;

        JFrame freRace = new JFrame();
        freRace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        freRace.setSize(1900, 1080);
        freRace.setLayout(null);

        //Creating the vehicles
        JLabel labelCar1 = new JLabel();
        labelCar1.setIcon(new ImageIcon("images/car1.jpg"));
        labelCar1.setBounds((0), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height);
        freRace.add(labelCar1);

        JLabel labelCar2 = new JLabel();
        labelCar2.setIcon(new ImageIcon("images/car2.jpg"));
        labelCar2.setBounds((0), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height);
        freRace.add(labelCar2);

        JLabel labelCar3 = new JLabel();
        labelCar3.setIcon(new ImageIcon("images/car3.jpg"));
        labelCar3.setBounds((0), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height);
        freRace.add(labelCar3);

        JLabel labelCar4 = new JLabel();
        labelCar4.setIcon(new ImageIcon("images/car4.jpg"));
        labelCar4.setBounds((0), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height);
        freRace.add(labelCar4);

        JLabel labelBackground = new JLabel();
        labelBackground.setIcon(new ImageIcon("images/race track.jpg"));
        labelBackground.setBounds((0), (0), labelBackground.getPreferredSize().width, labelBackground.getPreferredSize().height);
        freRace.add(labelBackground);
        freRace.setBackground(Color.WHITE);

        // freRace.setVisible(true);
        while (dist1 <= 1890) {

            Random rn = new Random();  

            dist1 = dist1 + rn.nextInt(5);
            dist2 = dist2 + rn.nextInt(4);
            dist3 = dist3 + rn.nextInt(3);
            dist4 = dist4 + rn.nextInt(2);
            labelCar1.setBounds((dist1), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height);
            labelCar2.setBounds((dist2), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height);
            labelCar3.setBounds((dist3), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height);
            labelCar4.setBounds((dist4), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height);
            freRace.setVisible(true);  
        } 
    }
}
package racing.game;
导入java.awt.Color;
导入java.util.Random;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公开课比赛{
公共静态void main(字符串[]args){
内部温度;
int dist1=0;
int dist2=0;
int dist3=0;
int dist4=0;
int i=0;
JFrame freRace=新的JFrame();
freRace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
freRace.setSize(19001080);
freRace.setLayout(空);
//创建车辆
JLabel labelCar1=新的JLabel();
labelCar1.setIcon(新的ImageIcon(“images/car1.jpg”);
labelCar1.setBounds((0)、(50),labelCar1.getPreferredSize().width,labelCar1.getPreferredSize().height);
freRace.add(labelCar1);
JLabel labelCar2=新的JLabel();
labelCar2.setIcon(新图像图标(“images/car2.jpg”);
labelCar2.setBounds((0)、(310),labelCar2.getPreferredSize().width,labelCar2.getPreferredSize().height);
freRace.add(labelCar2);
JLabel labelCar3=新的JLabel();
labelCar3.setIcon(新图像图标(“images/car3.jpg”);
labelCar3.setBounds((0)、(580),labelCar3.getPreferredSize().width,labelCar3.getPreferredSize().height);
freRace.add(labelCar3);
JLabel labelCar4=新的JLabel();
labelCar4.setIcon(新图像图标(“images/car4.jpg”);
labelCar4.setBounds((0)、(900),labelCar4.getPreferredSize().width,labelCar4.getPreferredSize().height);
freRace.add(labelCar4);
JLabel labelBackground=新的JLabel();
labelBackground.setIcon(新图像图标(“images/race track.jpg”);
labelBackground.setBounds((0)、(0),labelBackground.getPreferredSize().width,labelBackground.getPreferredSize().height);
freRace.add(labelBackground);
背景色(颜色:白色);
//freRace.setVisible(true);
while(dist1
我想知道我怎么能用一个随机数让我的车以不同的速度行驶

您需要为每辆车创建一个
speed
属性。而不是为每辆车创建一个速度值列表。如果该属性自包含在Car对象本身中,则会更容易:

class Car{
    private double speed;
}
要移动汽车,可以添加移动方法:

class Car{
    private int x;
    private int y;
    //private JLabel image;    //Better to use BufferedImage
    private double speed;

    //constructor not shown
    public void moveForward(){
        x += speed;
    }

    public void moveBackward(){
        x -= speed;
    }
}
然后您可以拥有一个数组或一个汽车列表:

ArrayList<Car> cars = new ArrayList<Car>();
要移动所有车辆:

//Example
for(Car c : cars)
    c.moveForward();

如果您有时间,实际上值得探索如何在不使用
JLabels
的情况下实现这一点,而是使用自定义图形来实现它。

如果您在main方法中循环,您将只看到移动的最后结果,您可以这样做:

 freRace.setVisible(true);
 new Thread(new Runnable() {
     public void run() {
        Random rn = new Random();  
        int s1 = rn.nextInt(5);
        int s2 = rn.nextInt(5);
        int s3 = rn.nextInt(5);
        int s4 = rn.nextInt(5);
       while (dist1 <= 1890) {
        dist1 = dist1 + s1;
        dist2 = dist2 + s2;
        dist3 = dist3 + s3;
        dist4 = dist4 + s4;
        labelCar1.setBounds((dist1), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height);
        labelCar2.setBounds((dist2), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height);
        labelCar3.setBounds((dist3), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height);
        labelCar4.setBounds((dist4), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height);
        freRace.invalidate();
        try { Thread.sleep(100); } catch (Exception e) {}
       } 
     }
 }).start();
freRace.setVisible(true);
新线程(newrunnable()){
公开募捐{
Random rn=新的Random();
int s1=rn.nextInt(5);
int s2=rn.nextInt(5);
int s3=rn.nextInt(5);
int s4=rn.nextInt(5);

while(dist1 Get
freRace.setVisible(true)
在您的时间之外,使用线程进行循环,随机更改位置不是一种速度,要实现速度,您需要先修复它,如
x
,然后尝试每秒相应地刷新帧。JLabel不是制作带有动画的游戏的好选项。自定义绘画将更容易。
 freRace.setVisible(true);
 new Thread(new Runnable() {
     public void run() {
        Random rn = new Random();  
        int s1 = rn.nextInt(5);
        int s2 = rn.nextInt(5);
        int s3 = rn.nextInt(5);
        int s4 = rn.nextInt(5);
       while (dist1 <= 1890) {
        dist1 = dist1 + s1;
        dist2 = dist2 + s2;
        dist3 = dist3 + s3;
        dist4 = dist4 + s4;
        labelCar1.setBounds((dist1), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height);
        labelCar2.setBounds((dist2), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height);
        labelCar3.setBounds((dist3), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height);
        labelCar4.setBounds((dist4), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height);
        freRace.invalidate();
        try { Thread.sleep(100); } catch (Exception e) {}
       } 
     }
 }).start();