使用随机数移动JPanel图像

时间:2017-11-01 14:33:04

标签: java

我正在为我的班级制作赛车游戏,我只用Java编程了几个星期,所以我想知道如何使用特定的随机数让我的汽车以不同的速度移动。 / p>

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

这段代码是为了让汽车以不同的速度在屏幕上赛车,但我不知道选择哪个循环以及如何让他的汽车速度随机移动所以我完全猜到了

2 个答案:

答案 0 :(得分:1)

  

我想知道如何使用特定的随机数让我的汽车以不同的速度移动

每辆车都需要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
Random rnd = new Random();
car.setSpeed(rnd.nextInt(5)+1);  //random speed of 1 to 5

移动所有车辆:

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

如果您有时间,那么在不使用JLabels的情况下探索如何实现此功能实际上是值得的,而是使用自定义绘图实现它。

答案 1 :(得分:0)

如果循环使用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();

请注意,我还添加了一个计时器,以便它可以不断移动。

此外,可以在JPanel的onPaintComponent方法中学习如何执行此操作,这样您就可以从双缓冲中受益。