在Java Applet中以随机方向移动对象

时间:2012-08-30 21:14:33

标签: java random applet mouseevent

我正在尝试创建一个小程序,用户通过将一条狗移向绵羊并使羊以随机方向远离狗而将羊变成笔。绵羊和狗被定义为物体。

小程序仍处于早期阶段。到目前为止,我可以将狗对象拖动到屏幕周围,当狗对象接近绵羊对象时,它会移动但仅在某个区域内(在我设置的范围内)。我不是在寻找解决方案,我只是在寻求帮助。

我想要帮助的是当狗对象进入我设定的范围内时,使羊对象沿着随机方向远离狗移动,而不仅仅是在设定范围内移动。任何帮助或提示将不胜感激。这是我的代码:

    package mandAndDog;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;


public class SheepDog extends Applet implements ActionListener, MouseListener, MouseMotionListener
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * 
     */

    Dog dog;
    Sheep sheep;
    int xposR;
    int yposR;
    int sheepx;
    int sheepy;
    int sheepBoundsx;
    int sheepBoundsy;

    public void init()
    {
        addMouseListener(this);
        addMouseMotionListener(this);
        dog = new Dog(10, 10);
        sheep = new Sheep(200, 100);
        sheepx = 175;
        sheepy = 75;
        sheepBoundsx = 50;
        sheepBoundsy = 50;


    }
    public void paint(Graphics g)
    {
        dog.display(g);
        sheep.display(g);

    }
    public void actionPerformed(ActionEvent ev)
    {}
    public void mousePressed(MouseEvent e)
    {}
    public void mouseReleased(MouseEvent e)
    {}
    public void mouseEntered(MouseEvent e)
    {}
    public void mouseExited(MouseEvent e)
    {}
    public void mouseMoved(MouseEvent e)
    {
    }
    public void mouseClicked(MouseEvent e)
    {}
    public void mouseDragged(MouseEvent e)
    {
        dog.setLocation(xposR, yposR);
        if (xposR > sheepx&& xposR < sheepx+sheepBoundsx && yposR > sheepy
                && yposR < sheepy+sheepBoundsy){
            sheep.setLocation(xposR + 50, yposR + 50);
        }

        xposR = e.getX();
        yposR = e.getY();
        repaint();

    }
}

class Dog 
{
    int xpos;
    int ypos;
    int circleWidth = 30;
    int circleHeight = 30;

    public Dog(int x, int y)
    {
        xpos = x;
        ypos = y;

    }

    public void setLocation(int lx, int ly)
    {
        xpos = lx;
        ypos = ly;
    }

    public void display(Graphics g)
    {
        g.setColor(Color.blue);
        g.fillOval(xpos, ypos, circleWidth, circleHeight);
    }       
}
class Sheep
{
    int xpos;
    int ypos;
    int circleWidth = 10;
    int circleHeight = 10;

    public Sheep(int x, int y)
    {
        xpos = x;
        ypos = y;

    }

    public void setLocation(int lx, int ly)
    {
        xpos = lx;
        ypos = ly;
    }

    public void display(Graphics g)
    {
        g.setColor(Color.green);
        g.fillOval(xpos , ypos, circleWidth, circleHeight);
    }


}

3 个答案:

答案 0 :(得分:1)

你不是在寻找代码,所以这就是我要做的。这是非常基本的,并且由于JVM的随机性可能产生可预测的结果,但是,我喜欢使用内置的Math.random()函数来生成随机数,并使用模运算符将随机数绑定到某个整数值介于0和上限之间。

我建议将行程的方向和距离计算为矢量。

  int MAX_DISTANCE = 50;
  int direction = (int) (Math.random() * 360) % 360;
  int distance = (int) (Math.random() * MAX_DISTANCE) % MAX_DISTANCE;

此处,距离是像素的度量,方向是以度为单位的行程角度的度量。

由于我们正在使用矢量,我们可以使用角度和距离以及一些非常基本的触发来计算新的像素位置。

我建议把它放到一个函数来计算新的目标位置,这样,函数可以计算新的位置,如果该位置离狗太近,你可以决定一条新的路径。

如果我可以提出建议,我建议将羊类放入Timer类,重新计算羊的下一步动作。通过这种方式,绵羊可以四处游荡。在徘徊时,绵羊的每次运动可能会有更小的MAX_DISTANCE。从而模拟了一定程度的威胁。

如果你真的想进入模拟,你可以测量狗与绵羊的距离,并根据距离,缩放绵羊运动的速度,这样狗越近,速度越快羊移动(不超过最大距离)。如果你这样做,我建议你考虑使用Math.log()来缩放动作,这样当狗距离200英寸时,从狗到绵羊的距离减少10个像素对羊的运动影响较小。狗距离15像素。

希望这会有所帮助。

答案 1 :(得分:0)

查看Java标准库中的Random类,因为它可能会有所帮助。您可以轻松生成伪随机整数并调整角色的(x,y)。添加一些错误检查,以确保它们彼此远离,你应该好好去!

答案 2 :(得分:0)

我会将您要移动绵羊的方向划分为数字。如果绵羊可以向上,向下,向左和向右移动,并且你减去了狼来自的方向,那就说左边有三只。向上和向右。

使用数学随机函数随机选择其中一个,您可以查看API,但基本上乘以您想要随机的最大数字并转换为Int以除去小数。

int intDirection = (int)(Math.random()*3);  

这将给出0,1和2。然后根据数字做一个case语句来移动方向。也许为了良好的实践,可以调查三个方向的调查员。

如果你想获得更多方向,你可以查看向量,但这就是你随机做的方式。