2

我正在尝试创建一个小程序,其中用户通过将狗移向羊并使羊沿随机方向远离狗来将羊放入笔中。羊和狗被定义为对象。

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

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

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


}
4

3 回答 3

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 像素。

希望这可以帮助。

于 2012-08-30T21:41:51.633 回答
0

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

于 2012-08-30T21:27:33.360 回答
0

我会将您要移动绵羊的方向划分为一个数字。如果羊可以上下左右移动,而你减去狼来自的方向,说左,你剩下三个。上下左右。

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

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

这将给你 0、1 和 2。然后做一个案例陈述以根据数字移动方向。也许为了良好的做法,请查看三个方向的枚举器。

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

于 2012-08-30T21:27:35.907 回答