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;

ここで、距離はピクセルの尺度であり、方向は度単位の移動角度の尺度です。

ベクトルで作業しているため、角度と距離、およびいくつかの非常に基本的な三角関数を使用して、新しいピクセル位置を計算できます。

これを関数に入れて新しいターゲット位置を計算することをお勧めします。このようにして、関数は新しい位置を計算でき、その位置が犬に近すぎる場合は、新しいパスを決定できます。

提案があれば、羊の次の動きを再計算するタイマークラスに羊のクラスを入れることをお勧めします。このようにして、羊は歩き回ることができます。放浪している間、羊は各動きに対してはるかに小さいMAX_DISTANCEを持っている可能性があります。これにより、脅威のレベルをシミュレートします。

本当にシミュレーションに参加したい場合は、犬から羊までの距離を測定し、その距離に基づいて羊の動きの速度をスケーリングし、犬が近づくほど羊の動きが速くなるようにします(最大距離を超えないようにしてください)。これを行う場合は、Math.log()を使用して動きをスケーリングし、犬から羊までの距離を10ピクセル短縮しても、犬が200ピクセル離れているときよりも羊の動きに与える影響が小さくなるようにすることをお勧めします。犬は15ピクセル離れています。

お役に立てれば。

于 2012-08-30T21:41:51.633 に答える
0

参考になるかもしれないので、Java 標準ライブラリのRandomクラスを調べてください。疑似乱数の int を簡単に生成し、文字の (x,y) を調整できます。エラーチェックを追加して、それらが互いに離れていることを確認してください。

于 2012-08-30T21:27:33.360 に答える
0

羊を動かしたい方向を数に分けます。ヒツジが上下左右に移動でき、オオカミが来る方向を引くと、左と言うと残りは 3 になります。上下左右。

これらのランダムな 1 つを選択するには、数学のランダム関数を使用します。API を調べることができますが、基本的には、ランダムに必要な最大数を乗算し、整数としてキャストして小数を取り除きます。

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

これにより、0、1、および 2 のいずれかが返されます。次に、数値に基づいて方向を移動する case ステートメントを作成します。おそらく、3 つの方向の列挙子を調べてください。

ベクトルを調べることができるより多くの方向が必要な場合は、これがランダムにする方法です。

于 2012-08-30T21:27:35.907 に答える