質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

個別に乱数を生成したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,200

score 26

下記のソースコードで実行すると、4つの点が現れcounterが100の倍数になる度にそれぞれの点が上下左右のうち1方向に進む事を期待していたのですが、実際に実行してみると、4つの点が現れてcounterが100の倍数になる度に方向を変換するところまでは良かったのですが、全部の点が同じ方向に進んでしまいます。
それぞれの点が個別の方向に動くようにしたいのですが、どう修正すれば改善できるでしょうか?
import java.awt.*;
import javax.swing.*;
import java.util.Random;

public class Tracking {
    public static void main(String[] args) {
    JFrame frame = new JFrame();

    frame.setTitle("Simple Animation");
    frame.setSize(1000, 1000);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MyPanel panel = new MyPanel();
    frame.getContentPane().add(panel);

    frame.setVisible(true);
    }
}

class MainPanel extends JPanel implements Runnable {
   public static int counter;
   // Cfの数
   private static int Fugitives = 4;
   // Cfを格納する配列
   private drawCf [] Cf;

    public MainPanel() {
    // Cfを格納する配列を作成
    Cf = new drawCf[Fugitives];
    // Cfを作成
    Cf[0] = new drawCf(10,10,20);
    Cf[1] = new drawCf(50,50,20);
    Cf[2] = new drawCf(100,100,20);
    Cf[3] = new drawCf(200,200,20);
        // 10ミリ秒ごとに画面を書き換える
    Thread refresh = new Thread(this);
    refresh.start();
    }

    public void paintComponent(Graphics g) {
    super.paintComponent(g);

        // アニメーションの1コマごとの処理
        for (int i = 0; i < Fugitives; i++) {
            Cf[i].draw(g);
        }
        counter++;
        
   }
    // 10ミリ秒ごとに画面を書き換える
    public void run() {
    while(true) {
            // 各ボールを移動させる
            for (int i = 0; i < Fugitives; i++) {
                Cf[i].move();
            }
        repaint();
        try {
        Thread.sleep(10);
        }
        catch(Exception e) {
        }
    }
    }
}

class Draw{
   public static boolean check;
   public static int x;
   public static int y;

   private static int direction;
   private static int Random;

   public void ball(int X,int Y) {
    check = false;
    //画面端か判定
    if(X > 1000){X = 0; check = true;}
        if(X < 0){X = 1000; check = true;}
    if(Y > 1000){Y = 0; check = true;}
        if(Y < 0){Y = 1000; check = true;}
        x = X;
        y = Y;
   }
   public static void random(int X,int Y,double C){
        double D1 = C / drawCf.rD;
        int D2 = (int)D1;
        if(D1 - D2 == 0){
       Random R = new Random();
           direction = R.nextInt(4);
    }
    switch(direction){
       case 0: X++; break;
       case 1: Y++; break;
       case 2: X--; break;
       case 3: Y--; break;
    }
    x = X;
    y = Y;
    //System.out.println(direction);
   }
}

class drawCf{
   //Drawオブジェクト
   Draw draw = new Draw();

   private int x;
   private int y;
   private int S;

   public static int rD = 100;

   public static boolean random;
    // コンストラクタ(新しいボールオブジェクトを作る)
    public drawCf(int x, int y,int S) {
        // ボールの属性を設定
        this.x = x;
        this.y = y;
        this.S = S;
    }

    public void move() {
       //反転させる
       draw.ball(x,y);
       if(Draw.check == true){ x = Draw.x; y = Draw.y;}

    //RandomWalk
    draw.random(x,y,(double) MyPanel.counter);
    x = Draw.x;
    y = Draw.y;

    }
    public void draw(Graphics g) {
        g.setColor(Color.green);
        g.fillOval(x, y, S, S);
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Drawのすべての変数がstaticになっています.
これでは1つ変更しても全てにその変更が適用され,「全部同じ方向に移動する」という現象が起きます.

気になる点が多すぎて・・・
まず「100の倍数になるたびに」の判定に面倒な方法を取ってますが,
剰余算を使えばスマートに判定できます.
   public static void random(int X,int Y,int C){
        if(C % drawCf.rD == 0){
           Random R = new Random();
           direction = R.nextInt(4);
        }
    //略
    }
無駄な変数もあります.Drawクラスのint Randomはどこでも使っていません.
drawCfクラスのboolean randomも同様です.
様々な定数を色々なクラスにバラバラに書いていますし.可視性にも劣ります.
Drawクラスは見る限りdrawCfクラスと切り離す必然性が見えませんし,色々支離滅裂です.
ちょっと落ち着いてコードを整理してみてはいかがでしょう?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/11 00:27

    ありがとうございます。無事解決しました。m(__)m

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る