質問編集履歴

3 回答をいただいたあとの修正版

Rino-T_C

Rino-T_C score 95

2015/06/02 19:33  投稿

Java Turtleアプレット「一匹の亀をドラッグすると、三匹の他の亀がそれぞれ1/2,1/3,2倍の距離を同時に動くようにしたい。」 
こんにちは、Java初心者です。
Turtleアプレットの作成を通じて、イベント処理とオブジェクト指向の学習をしています。
現在、亀に足跡を描かせるクラス。Turtleクラスをを用いて、4匹の亀を生成します。うち1匹をドラッグすると、それに伴って他の亀が同じ向きで距離だけ異なって移動し、図形を描画させたいです。
頑張って考えたのですが、実際に動かしてみると、全く描画されません。
急ぎなので、わかる方お願いします!
Turtle.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle{
   //インスタンス変数の宣言
   int x, y;
   double angle = 0;
   int pensize = 1;
   Color pencolor = Color.black;
   ArrayList<Point> points = new ArrayList<Point>();
   //コンストラクタの定義
   Turtle(int i, int j){
   x = i;
   y = j;
   //亀さんの座標を決定
   points.add(new Point(x, y));
   }
   //各種メソッドの定義
   
   //現在位置から進行方向に向かって距離lengthだけ移動する。
 
   public void move(double length){
   int i = points.size()-1;
   Point pt = points.get(i);
   int x_l = (int)Math.round(length * Math.cos(angle)) + pt.x;
   int y_l = (int)Math.round(length * Math.sin(angle)) + pt.y;
   points.add(new Point(x_l, y_l));
   }
   
   //進行方向をdegだけ左回転する。
   public void turn(double deg){
   angle -= deg;         
   }
   //ペンの太さを設定する。
   public void PenSize(int size){
   pensize = size;
   }
   //ペンの色を設定する
   public void penColor(Color c){
   pencolor = c;
   }
   //亀の軌跡の描画
   public void paint(Graphics g){
   g.setColor(pencolor);
   int i;
   int px[] = new int[points.size()];
   int py[] = new int[points.size()];
   for( i = 0; i < points.size(); i++){
       Point p_i = points.get(i);
       px[i] = p_i.x;
       py[i] = p_i.y;
   }
   g.drawPolyline(px, py, points.size());   
   }
}
```
Turtle2.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle2{
   Turtle kame[] = new Turtle[4];
   Turtle2(Turtle k[]){
   kame = k;
   }
   void move(double length){
   kame[0].move(length);
   kame[1].move(length/2);
   kame[2].move(length/3);
   kame[3].move(length*2);
   }
   void turn(double deg){
   for(int i = 0; i < 4; i++){
       kame[i].turn(deg);
   }
   }
   void paint(Graphics g){
   for(int i = 0; i < 4; i++){
       kame[i].paint(g);
   }
   }
   
}
```
Rabbit.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class Rabbit extends Applet implements MouseMotionListener{
   int current_x;    //マウスの現在のx座標
   int current_y;    //マウスの現在のy座標
   Turtle kame[] = new Turtle[4];
   Turtle2 Usagi = new Turtle2(kame);
   double deg = 0;
   double length = 0;
   double pi = Math.PI;
   Image imgs;
   public void init(){
   setBackground(Color.white);
         imgs= getImage(getDocumentBase(), "kame2.gif");
   kame[0] = new Turtle(100, 100);
   kame[1] = new Turtle(300, 100);
   kame[2] = new Turtle(100, 300);
   kame[3] = new Turtle(300, 300);
   //addMouseListener(this);
   addMouseMotionListener(this);
   }
   
   public void mouseDragged(MouseEvent e){
   
          int size = kame[0].points.size() - 1;
   Point p_0 = kame[0].points.get(size);
   if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){
       current_x = e.getX();
       current_y = e.getY();
       kame[0].points.add(new Point(current_x, current_y));
   }
   repaint();
   }
   public void mouseMoved(MouseEvent e){
   }
   
   
   public void paint(Graphics g){
   int size = kame[0].points.size() - 1;
   for(int i = 0; i < 4; i++){
       g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y, this);
   }
   g.setColor(Color.black);
   Point p_0 = kame[0].points.get(size - 1);
   double dx = current_x - p_0.x;
   double dy = current_y - p_0.y;
   deg = Math.atan2(dy, dx);
   if( deg != 0  || deg != pi || deg != -pi){
       length = dx;
   }
   else{
       length = dy/Math.sin(deg);
   }
       Usagi.turn(deg);
   Usagi.move(length);
   Usagi.paint(g);
   }
}
```
解決「現在は実行時エラーです。
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。」
現在、実行した段階でなぜか毎回決まった線が描画されてしまっています。
現在、実行した段階でなぜか毎回決まった線が描画されてしまっています。
修正後
Turtle.java
```lang-<Java>
public class Turtle{
   //インスタンス変数の宣言
   int x, y;
   double angle = 0;
   ArrayList<Point> points = new ArrayList<Point>();
   //コンストラクタの定義
   Turtle(int i, int j){
   x = i;
   y = j;
   points.add(new Point(x, y));
   }
   //各種メソッドの定義
   public void move(double x, double y){
   int i = points.size() - 1;
   Point pt = points.get(i);
   points.add(new Point( (int)x+pt.x, (int)y+pt.y));
   }
   //亀の軌跡の描画
   public void paint(Graphics g){
   
   g.setColor(pencolor);
   int i;
       int px[] = new int[points.size()];
   int py[] = new int[points.size()];
   for( i = 0; i < points.size(); i++){
       Point p_i = points.get(i);
       px[i] = p_i.x;
       py[i] = p_i.y;
   }
   g.drawPolyline(px, py, points.size());   
   
   }
}
```
Turtle2.java
```lang-<Java>
public class Turtle2{
   Turtle kame[] = new Turtle[4];
   Turtle2(Turtle k[]){
   kame = k;
   }
   void move(double x, double y){
   kame[1].move(x/2, y/2);
   kame[2].move(x/3, y/3);
   kame[3].move(x*2, y*2);
   
   void paint(Graphics g){
   for(int i = 0; i < 4; i++){
       kame[i].paint(g);
   }
   }
   
}
```
Rabbit.java
```lang-<Java>
public class Rabbit extends Applet implements MouseListener, MouseMotionListener{
   int current_x;    //マウスの現在のx座標
   int current_y;    //マウスの現在のy座標
   Turtle kame[] = new Turtle[4];
   Turtle2 Usagi = new Turtle2(kame);
   Image imgs;
   public void init(){
   setBackground(Color.white);
         imgs= getImage(getDocumentBase(), "kame2.gif");
   kame[0] = new Turtle(100, 100);
   kame[1] = new Turtle(300, 100);
   kame[2] = new Turtle(100, 300);
   kame[3] = new Turtle(300, 300);
   addMouseListener(this);
   addMouseMotionListener(this);
   }
   
   public void mouseDragged(MouseEvent e){
   
          int size = kame[0].points.size() - 1;
   Point p_0 = kame[0].points.get(size);
   if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){
       current_x = e.getX();
       current_y = e.getY();
       kame[0].points.add(new Point(current_x, current_y));
       repaint();
   }
   }
   public void mouseMoved(MouseEvent e){
   }
   public void mouseClicked(MouseEvent e){
   }
   public void mouseEntered(MouseEvent e){
   }
   public void mouseExited(MouseEvent e){
   
   }
   public void mousePressed(MouseEvent e){
   
   }
   public void mouseReleased(MouseEvent e){
   
   } 
   public void paint(Graphics g){
   for(int i = 0; i < 4; i++){
       
       int size = kame[i].points.size() - 1;
       
       Point p_cur = kame[i].points.get(size - 1);
       Point p_prev = kame[i].points.get(size - 1);
       double dx = p_cur.x - p_prev.x;
       double dy = p_cur.y - p_prev.y;
       Usagi.move(dx, dy);
       g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y,this);
   }
   g.setColor(Color.black);
   Usagi.paint(g);
   }
}
```
こんなかんじになりました。現在実行時エラーです(´;ω;`)
  • Java

    25061 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2 追記

Rino-T_C

Rino-T_C score 95

2015/06/02 16:28  投稿

Java Turtleアプレット「一匹の亀をドラッグすると、三匹の他の亀がそれぞれ1/2,1/3,2倍の距離を同時に動くようにしたい。」 
こんにちは、Java初心者です。
Turtleアプレットの作成を通じて、イベント処理とオブジェクト指向の学習をしています。
現在、亀に足跡を描かせるクラス。Turtleクラスをを用いて、4匹の亀を生成します。うち1匹をドラッグすると、それに伴って他の亀が同じ向きで距離だけ異なって移動し、図形を描画させたいです。
頑張って考えたのですが、実際に動かしてみると、全く描画されません。
急ぎなので、わかる方お願いします!
Turtle.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle{
   //インスタンス変数の宣言
   int x, y;
   double angle = 0;
   int pensize = 1;
   Color pencolor = Color.black;
   ArrayList<Point> points = new ArrayList<Point>();
   //コンストラクタの定義
   Turtle(int i, int j){
   x = i;
   y = j;
   //亀さんの座標を決定
   points.add(new Point(x, y));
   }
   //各種メソッドの定義
   
   //現在位置から進行方向に向かって距離lengthだけ移動する。
 
   public void move(double length){
   int i = points.size()-1;
   Point pt = points.get(i);
   int x_l = (int)Math.round(length * Math.cos(angle)) + pt.x;
   int y_l = (int)Math.round(length * Math.sin(angle)) + pt.y;
   points.add(new Point(x_l, y_l));
   }
   
   //進行方向をdegだけ左回転する。
   public void turn(double deg){
   angle -= deg;         
   }
   //ペンの太さを設定する。
   public void PenSize(int size){
   pensize = size;
   }
   //ペンの色を設定する
   public void penColor(Color c){
   pencolor = c;
   }
   //亀の軌跡の描画
   public void paint(Graphics g){
   g.setColor(pencolor);
   int i;
   int px[] = new int[points.size()];
   int py[] = new int[points.size()];
   for( i = 0; i < points.size(); i++){
       Point p_i = points.get(i);
       px[i] = p_i.x;
       py[i] = p_i.y;
   }
   g.drawPolyline(px, py, points.size());   
   }
}
```
Turtle2.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle2{
   Turtle kame[] = new Turtle[4];
   Turtle2(Turtle k[]){
   kame = k;
   }
   void move(double length){
   kame[0].move(length);
   kame[1].move(length/2);
   kame[2].move(length/3);
   kame[3].move(length*2);
   }
   void turn(double deg){
   for(int i = 0; i < 4; i++){
       kame[i].turn(deg);
   }
   }
   void paint(Graphics g){
   for(int i = 0; i < 4; i++){
       kame[i].paint(g);
   }
   }
   
}
```
Rabbit.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class Rabbit extends Applet implements MouseMotionListener{
   int current_x;    //マウスの現在のx座標
   int current_y;    //マウスの現在のy座標
   Turtle kame[] = new Turtle[4];
   Turtle2 Usagi = new Turtle2(kame);
   double deg = 0;
   double length = 0;
   double pi = Math.PI;
   Image imgs;
   public void init(){
   setBackground(Color.white);
         imgs= getImage(getDocumentBase(), "kame2.gif");
   kame[0] = new Turtle(100, 100);
   kame[1] = new Turtle(300, 100);
   kame[2] = new Turtle(100, 300);
   kame[3] = new Turtle(300, 300);
   //addMouseListener(this);
   addMouseMotionListener(this);
   }
   
   public void mouseDragged(MouseEvent e){
   
          int size = kame[0].points.size() - 1;
   Point p_0 = kame[0].points.get(size);
   if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){
       current_x = e.getX();
       current_y = e.getY();
       kame[0].points.add(new Point(current_x, current_y));
   }
   repaint();
   }
   public void mouseMoved(MouseEvent e){
   }
   
   
   public void paint(Graphics g){
   int size = kame[0].points.size() - 1;
   for(int i = 0; i < 4; i++){
       g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y, this);
   }
   g.setColor(Color.black);
   Point p_0 = kame[0].points.get(size - 1);
   double dx = current_x - p_0.x;
   double dy = current_y - p_0.y;
   deg = Math.atan2(dy, dx);
   if( deg != 0  || deg != pi || deg != -pi){
       length = dx;
   }
   else{
       length = dy/Math.sin(deg);
   }
       Usagi.turn(deg);
   Usagi.move(length);
   Usagi.paint(g);
   }
}
```
現在は実行時エラーです。
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。
解決「現在は実行時エラーです。
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。」
現在、実行した段階でなぜか毎回決まった線が描画されてしまっています。
  • Java

    25061 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1 式の修正

Rino-T_C

Rino-T_C score 95

2015/06/02 16:08  投稿

Java Turtleアプレット「一匹の亀をドラッグすると、三匹の他の亀がそれぞれ1/2,1/3,2倍の距離を同時に動くようにしたい。」 
こんにちは、Java初心者です。
Turtleアプレットの作成を通じて、イベント処理とオブジェクト指向の学習をしています。
現在、亀に足跡を描かせるクラス。Turtleクラスをを用いて、4匹の亀を生成します。うち1匹をドラッグすると、それに伴って他の亀が同じ向きで距離だけ異なって移動し、図形を描画させたいです。
頑張って考えたのですが、実際に動かしてみると、全く描画されません。
急ぎなので、わかる方お願いします!
Turtle.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle{
   //インスタンス変数の宣言
   int x, y;
   double angle = 0;
   int pensize = 1;
   Color pencolor = Color.black;
   ArrayList<Point> points = new ArrayList<Point>();
   //コンストラクタの定義
   Turtle(int i, int j){
   x = i;
   y = j;
   //亀さんの座標を決定
   points.add(new Point(x, y));
   }
   //各種メソッドの定義
   
   //現在位置から進行方向に向かって距離lengthだけ移動する。
 
   public void move(double length){
   int i = points.size()-1;
   Point pt = points.get(i);
   int x_l = (int)Math.round(length * Math.cos(angle)) + pt.x;
   int y_l = (int)Math.round(length * Math.sin(angle)) + pt.y;
   points.add(new Point(x_l, y_l));
   }
   
   //進行方向をdegだけ左回転する。
   public void turn(double deg){
   angle -= deg;         
   }
   //ペンの太さを設定する。
   public void PenSize(int size){
   pensize = size;
   }
   //ペンの色を設定する
   public void penColor(Color c){
   pencolor = c;
   }
   //亀の軌跡の描画
   public void paint(Graphics g){
   g.setColor(pencolor);
   int i;
   int px[] = new int[points.size()];
   int py[] = new int[points.size()];
   for( i = 0; i < points.size(); i++){
       Point p_i = points.get(i);
       px[i] = p_i.x;
       py[i] = p_i.y;
   }
   g.drawPolyline(px, py, points.size());   
   }
}
```
Turtle2.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Turtle2{
   Turtle kame[] = new Turtle[4];
   Turtle2(Turtle k[]){
   kame = k;
   }
   void move(double length){
   kame[0].move(length);
   kame[1].move(length/2);
   kame[2].move(length/3);
   kame[3].move(length*2);
   }
   void turn(double deg){
   for(int i = 0; i < 4; i++){
       kame[i].turn(deg);
   }
   }
   void paint(Graphics g){
   for(int i = 0; i < 4; i++){
       kame[i].paint(g);
   }
   }
   
}
```
Rabbit.java
```lang-<Java>
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class Rabbit extends Applet implements MouseMotionListener{
   int current_x;    //マウスの現在のx座標
   int current_y;    //マウスの現在のy座標
   Turtle kame[] = new Turtle[4];
   Turtle2 Usagi = new Turtle2(kame);
   double deg = 0;
   double length = 0;
   double pi = Math.PI;
   Image imgs;
   public void init(){
   setBackground(Color.white);
         imgs= getImage(getDocumentBase(), "kame2.gif");
   kame[0] = new Turtle(100, 100);
   kame[1] = new Turtle(300, 100);
   kame[2] = new Turtle(100, 300);
   kame[3] = new Turtle(300, 300);
   //addMouseListener(this);
   addMouseMotionListener(this);
   }
   
   public void mouseDragged(MouseEvent e){
   
          int size = kame[0].points.size() - 1;
   Point p_0 = kame[0].points.get(size);
   if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){
       current_x = e.getX();
       current_y = e.getY();
       kame[0].points.add(new Point(current_x, current_y));
   }
   repaint();
   }
   public void mouseMoved(MouseEvent e){
   }
   
   
   public void paint(Graphics g){
   int size = kame[0].points.size() - 1;
   for(int i = 0; i < 4; i++){
       g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y, this);
   }
   g.setColor(Color.black);
   Point p_0 = kame[0].points.get(size - 1);
   double dx = current_x - p_0.x;
   double dy = current_y - p_0.y;
   deg = Math.atan2(dy, dx);
   if( deg == 0  || deg == pi || deg == -pi){
   if( deg != 0  || deg != pi || deg != -pi){
       length = dx;
   }
   else{
       length = dy/Math.sin(deg);
   }
       Usagi.turn(deg);
   Usagi.move(length);
   Usagi.paint(g);
   }
}
 
```  
現在は実行時エラーです。
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。
```
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。
  • Java

    25061 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る