🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

1回答

949閲覧

Javaのタートルグラフィックで亀の総移動距離や回転を表示する

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2019/10/22 15:40

亀を移動させ、終了命令と共に総移動距離と平均移動距離を出力したい

タートルグラフィックスの亀を動かし回転させ、終了とともに総移動距離と平均移動距離を出力したいです。
命令は2つあります

命令1(op1):quit, go, rotate の3つです
命令2(op2):taro(亀t1), hanako(亀t2) の2つです

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

1.命令1でquitと入力した場合:それまでのそれぞれの亀の総移動距離と平均移動距離を出力する

2.命令1でgoと入力した場合:
①続けて命令2でtaroと入力した場合→taroは乱数m1(10.0以上50.0未満)で前に進み、インスタンスの位置と向きの角度を出力する
②続けて命令2でhanakoと入力した場合→hanakoは乱数m2(10.0以上50.0未満)で前に進み、インスタンスの位置と向きの角度を出力する

3.命令1でrotateと入力した場合:
①続けて命令2でtaroと入力した場合→taroは乱数k(0.0以上180.0未満)で右に回転し、インスタンスの位置と向きの角度を出力する
②続けて命令2でhanakoと入力した場合→hanakoは乱数k(0.0以上180.0未満)で右に回転し、インスタンスの位置と向きの角度を出力する

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

という内容のプログラムを組みたいです

しかし、私の書いたプログラムでは、以下の問題が生じてしまいます

・go ~ で前に進む距離が毎回変化せず、一回目の乱数のみで固定されてしまう

・rotate ~ と入力すると
【Exception in thread "main" java.lang.NullPointerException
at homework06_02.main(homework06_02.java:48)】
と表示されてしまう

(上記の問題が解決できないため、総移動距離や平均移動距離を出力するプログラムはまだ書いていません)

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.NullPointerException at homework06_02.main(homework06_02.java:48)

該当のソースコード

Java

1import java.util.Scanner; 2 3import javafx.scene.paint.Color; 4import tg.Turtle; 5import tg.TurtleFrame; 6 7public class homework06_02 { 8 9 public static void main(String[] args) { 10 // TODO 自動生成されたメソッド・スタブ 11 Scanner sc = new Scanner(System.in); 12 TurtleFrame f = new TurtleFrame(); 13 Turtle t1 = new Turtle(150, 200, 180); //taro 14 Turtle t2 = new Turtle(250, 200, 0); //hanako 15 f.add(t1); f.add(t2); 16 17 t1.setTColor(Color.BLUE); 18 t2.setTColor(Color.RED); 19 20 double m = 10.0 + Math.random() * 40.0; 21 double m1, m2, sum1 = 0, sum2 = 0; 22 double k = Math.random() * 180.0; 23 24 while(true) { 25 String op1, op2; 26 op1 = sc.next(); 27 if (op1.equals("quit")) { 28 System.out.println("終了します"); 29 System.out.println("taroの総移動距離=" + sum1); 30 System.out.println("hanakoの総移動距離=" + sum2); 31 break; 32 33 } else if(op1.equals("go")) { 34 op2 = sc.next(); 35 if(op2.equals("taro")) { 36 t1.fd(m); 37 m1 = m; 38 sum1 = sum1 + m1; 39 System.out.println("taroは" + m1 + "移動して(150.0, " + sum1 + ")にいます"); 40 } else if(op2.equals("hanako")) { 41 t2.fd(m); 42 m2 = m; 43 sum2 = sum2 + m2; 44 System.out.println("hanakoは" + m2 + "移動して(250.0, " + sum2 + ")にいます"); 45 } 46 47 } else if(op1.equals("rotate")) { 48 if(op2.equals("taro")) { 49 t1.rt(k); 50 System.out.println("taroは(150.0, "+ sum1 + ")で" + t1.getAngle() + "を向きました"); 51 }else if(op2.equals("hanako")) { 52 t2.rt(k); 53 System.out.println("hanakoは(250.0, " + sum2 + ")で" + t2.getAngle() + "を向きました"); 54 } 55 } 56 }sc.close(); 57 } 58}

試したこと

・if文に不備がないか紙に書き出し、一度中身を削除して範囲を見直し書き直した

###最後に
長々と分かりづらい説明でも仕分けございません。
コメントをいただければ分かる限りお答えしたいと思います。
当方かなりの初心者で、調べようにもどう調べたら良いか分からず最終手段として質問させていただきました。どうかよろしくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずはエラーメッセージに従って、48行目をチェックしましょう。

Java

if(op2.equals("taro")) {

この行のどこかで、NullPointerExceptionが生じています。
...と言っても、この中でnull値を取り得るのはop2しかありませんね。

それでは、op2に着目してコードを追ってみましょう。

Java

1String op1, op2; 2op1 = sc.next(); 3if (op1.equals("quit")) { 4 ... 5 break; 6} else if(op1.equals("go")) { 7 op2 = sc.next(); 8 ... 9} else if(op1.equals("rotate")) { 10 if(op2.equals("taro")) { 11 ...

rotateと入力された際は、op2を読み込んでいないことが分かります。

乱数の取り扱いについて

根本的な勘違いをしていると思います。

Java

double m = 10.0 + Math.random() * 40.0;

このmはただのdouble型変数であって、たまたまその値が乱数で決定されているだけです。
mを評価する度に新たな乱数が生成されるわけではありません。

乱数が必要なときは再度Math.random()を使って下さい。

投稿2019/10/22 15:49

編集2019/10/22 15:53
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 15:56

迅速な回答ありがとうございます。 rotateの条件下でop2を読み込んでいない理由や読み込ませる修正方法などご教授いただけないでしょうか? エラーの出ている48,51行目のop2にカーソルを当てると「変数を初期化します」と表示され、クリックすると25行目の String op1, op2; が String op1, op2 = null; となりました。 またその状態で実行しrotate ~ を入力しても【Exception in thread "main" java.lang.NullPointerException at homework06_02.main(homework06_02.java:48)】と表示されてしまいました。。。
退会済みユーザー

退会済みユーザー

2019/10/22 15:59

回答に追加していただきありがとうございます。 乱数は毎回生成されるわけではないのですね!
LouiS0616

2019/10/22 22:47

> rotateの条件下でop2を読み込んでいない理由や読み込ませる修正方法 if(op1.equals("go")) のときと同じように入力を受けてやれば良いです。 あるいはquitしなかったときに常にop2を読み取るようにします。
swordone

2019/10/23 03:54

この時って、ヌルポじゃなくて「変数が初期化されていない」コンパイルエラーになりそうだが…
LouiS0616

2019/10/23 03:58

@swordone さん 確かに。でも48行目そこなんですよね...
退会済みユーザー

退会済みユーザー

2019/10/23 15:41

解決いたしました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問