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

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

詳細はこちら
Java

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

Q&A

解決済

2回答

2390閲覧

java でscannerで取得した値をフィールド値に代入して他のファイルでも使いたい

D-coder

総合スコア9

Java

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

0グッド

0クリップ

投稿2020/12/07 09:55

編集2020/12/07 09:59

前提・実現したいこと

Javaで下記を実現するためのプログラムを作成しています。
1.Scannerで主人公と敵に名前を付ける※仮に主人公を『勇者』敵を『ゴブリン』とする
2.1で取得した名前を基に主人公と敵でじゃんけんをする(グー、チョキ、パーのコマンドを入力)
3.じゃんけんで勝った方が負けた方に1のダメージを与える(それぞれのHPは20)
4.主人公がじゃんけんで勝った場合は「敵の名前に1のダメージ」と表示する
5.主人公がじゃんけんに負けた場合は「主人公の名前に1のダメージ」と表示する

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

JAVAファイルAでScanner を用いて名前を入力するメソッドで『勇者』と『ゴブリン』という名前を付けたとします。 その値をJAVAファイルBの戦闘処理をするファイルでも取得して勇者の勝利!ゴブリンに1のダメージ と表示するようにしたいのですが、うまくいかずに nullに1のダメージ となってしまいます。 おそらく設定したフィールド値にScannerで取得した値が代入できていないのが原因では? と思っています。

該当のソースコード

--メインメソッド import java.util.Scanner; public class Sample { public static void main(String[] args) { BattleF suteitasu = new BattleF(); named namae = new named(); namae.input_youname();//あなたの名前を入力 // 入力を促すメッセージ do{ System.out.print("コマンド? 0:グー 1:チョキ 2:パー"); java.util.Scanner input = new java.util.Scanner(System.in); int hand = input.nextInt(); if( hand == 9 ) { System.out.println("コマンド9検出:強制終了しました"); break; } java.util.Random rand = new java.util.Random(); int com = rand.nextInt(3); // ジャンケンによる勝敗の条件分岐 if( hand == com ) { System.out.println("引き分け"); } if( com == 0 ) { if( hand == 1 ) { suteitasu.dameizi();//あなたへのダメージ処理 } if( hand == 2 ) { suteitasu. ataltuku();//敵へのダメージ処理 } } if(com == 1 ) { if( hand == 0 ) { suteitasu.ataltuku();//敵へのダメージ処理 } if( hand == 2 ) { suteitasu.dameizi();//あなたへのダメージ処理 } } if( com == 2 ) { if( hand == 0 ) { suteitasu.dameizi();//あなたへのダメージ処理 } if( hand == 1 ) { suteitasu. ataltuku();//敵へのダメージ処理 } } }while( true ); } }
--戦闘処理メソッド class BattleF{ /*フィールド値*/ int playr_hp = 20; int enemi_hp = 20; named namae = new named(); void ataltuku(){ System.out.print(namae.input_enemi+"1のダメージ"); enemi_hp--; System.out.print(namae.input_enemi+enemi_hp); System.out.print(namae.input_name+"HP"+playr_hp); } void dameizi(){ System.out.print(namae.input_name+"1のダメージ"); playr_hp--; System.out.print(namae.input_name+"HP"+playr_hp); System.out.print(namae.input_enemi+"HP"+enemi_hp); } }
--名前入力メソッド import java.util.Scanner; public class named { /*フィールド値*/ String input_name; String input_enemi; void input_youname( ){ Scanner name = new Scanner(System.in); // 入力を促すメッセージ System.out.print("名前を入力してください > "); //入力された内容をインスタンスから取得 String input_name = name.nextLine(); //入力された内容を画面に表示 System.out.println("あなたの名前は"+input_name + "です"); Scanner enemi = new Scanner(System.in); // 入力を促すメッセージ System.out.print("敵の名前を入力してください "); //入力された内容をインスタンスから取得 String input_enemi = enemi.nextLine(); //入力された内容を画面に表示 System.out.println(input_enemi + "が入力されました"); System.out.println("敵の名前は"+input_enemi); System.out.println("あなたの名前は"+input_name); } }

試したこと

様々なサイトを見て動かそうと試しましたがどうしてもScannerで取得した勇者やゴブリンといった値を他のファイルでも使えるようにならずにnullになってしまいます。
20時間ほど試行錯誤しましたが無理でした。

補足情報(FW/ツールのバージョンなど)

実際文字での説明では理解が難しいので、nullとならずに正常にダメージ処理のセリフが表示されるようにするにはどんなコードに変更すればよいのでしょうか?
コードを教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://paiza.io/projects/Veg9_MG-tPeYw0SEbcXpUg
にもおいてますがここにも貼り付けます。一応動作確認しました。
わからないことがあったらコメントください。

  • クラス間で値を共有したければ、それぞれのクラスで別々に new せずに、例えばメイン(Main.java)で「public static」として宣言して、他のクラスからは「Main.scanner」や「Main.namae」のようにアクセスする。
  • class named では「public String input_name;」「public String input_enemi;」のようにパブリックとしてメンバ変数宣言しておき。「void input_youname(Scanner scanner)」内では、「this.name」「this.enemi」に値を格納する。メソッド内で変数(String)宣言したらメンバ変数には値が入りませんよ。

こんな説明で伝わりますか?とりあえず、添付したコードが動作することをご確認ください。
よろしくお願いします。

java:Main.java

1//メインメソッド 2import java.util.Scanner; 3 4public class Main { 5 6 public static Scanner scanner = null; 7 public static named namae = null; 8 9 public static void main(String[] args) { 10 11 Main.scanner = new Scanner(System.in); 12 Main.namae = new named(); 13 Main.namae.input_youname(scanner); //あなたの名前を入力 14 BattleF suteitasu = new BattleF(); 15 16 // 入力を促すメッセージ 17 do{ 18 System.out.println("コマンド? 0:グー 1:チョキ 2:パー"); 19 20 int hand = scanner.nextInt(); 21 22 if( hand == 9 ) { 23 System.out.println("コマンド9検出:強制終了しました"); 24 break; 25 } 26 27 java.util.Random rand = new java.util.Random(); 28 int com = rand.nextInt(3); 29 // ジャンケンによる勝敗の条件分岐 30 if( hand == com ) { 31 System.out.println("引き分け"); 32 } 33 if( com == 0 ) { 34 if( hand == 1 ) { 35 suteitasu.dameizi();//あなたへのダメージ処理 36 37 } 38 if( hand == 2 ) { 39 suteitasu. ataltuku();//敵へのダメージ処理 40 } 41 } 42 if(com == 1 ) { 43 if( hand == 0 ) { 44 suteitasu.ataltuku();//敵へのダメージ処理 45 46 } 47 if( hand == 2 ) { 48 suteitasu.dameizi();//あなたへのダメージ処理 49 } 50 } 51 if( com == 2 ) { 52 if( hand == 0 ) { 53 suteitasu.dameizi();//あなたへのダメージ処理 54 } 55 if( hand == 1 ) { 56 suteitasu. ataltuku();//敵へのダメージ処理 57 } 58 } 59 } while( true ); 60 } 61}

java:named.java

1//名前入力メソッド 2import java.util.Scanner; 3 4public class named { 5 /*フィールド値*/ 6 public String input_name; 7 public String input_enemi; 8 9 void input_youname(Scanner scanner){ 10 // 入力を促すメッセージ 11 System.out.print("名前を入力してください > "); 12 13 //入力された内容をインスタンスから取得 14 this.input_name = scanner.nextLine(); 15 16 //入力された内容を画面に表示 17 System.out.println("あなたの名前は"+this.input_name + "です"); 18 19 // 入力を促すメッセージ 20 System.out.print("敵の名前を入力してください "); 21 22 //入力された内容をインスタンスから取得 23 this.input_enemi = scanner.nextLine(); 24 25 //入力された内容を画面に表示 26 System.out.println(this.input_enemi + "が入力されました"); 27 System.out.println("敵の名前は"+this.input_enemi); 28 System.out.println("あなたの名前は"+this.input_name); 29 } 30}

java:BattleF.java

1//戦闘処理メソッド 2class BattleF{ 3 4 /*フィールド値*/ 5 int playr_hp = 20; 6 int enemi_hp = 20; 7 8 void ataltuku(){ 9 System.out.println(Main.namae.input_enemi+"1のダメージ"); 10 enemi_hp--; 11 System.out.println(Main.namae.input_enemi+"HP"+enemi_hp); 12 System.out.println(Main.namae.input_name+"HP"+playr_hp); 13 } 14 15 void dameizi(){ 16 System.out.println(Main.namae.input_name+"1のダメージ"); 17 playr_hp--; 18 System.out.println(Main.namae.input_name+"HP"+playr_hp); 19 System.out.println(Main.namae.input_enemi+"HP"+enemi_hp); 20 } 21 22}

投稿2020/12/07 18:50

編集2020/12/07 23:05
JavaCommons

総合スコア86

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

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

D-coder

2020/12/08 02:16

回答頂きありがとうございます。 コードの方も大変参考になりました! エラーの連続でだめかと思いましたが、色々お教え頂きありがとうございます。
JavaCommons

2020/12/08 03:00

参考になってよかったです。 開発頑張ってください。
guest

0

名前が null になるのは、String input_name = name.nextLine(); で、
フィールドの input_name ではなく、ローカル変数の input_name に名前を入れているからです。
input_name = name.nextLine(); としましょう。

それから、入力元は System.in ひとつですから、new Scanner は 1回だけにしましょう。

Java

1import java.util.Scanner; 2import java.util.Random; 3 4public class Sample { 5 public static void main(String[] args) { 6 Scanner input = new Scanner(System.in); 7 Random rand = new Random(); 8 9 named namae = new named(input); 10 namae.input_youname(); 11 BattleF suteitasu = new BattleF(namae); 12 13 while (true) { 14 System.out.print("コマンド? 0:グー 1:チョキ 2:パー: "); 15 int hand = input.nextInt(); 16 if (hand == 9) { 17 System.out.println("コマンド9検出:強制終了しました"); 18 break; 19 } 20 int com = rand.nextInt(3); 21 if (hand == com) { 22 System.out.println("引き分け"); 23 } 24 else if (com==0 && hand==1 || com==1 && hand==2 || com==2 && hand==0) { 25 suteitasu.dameizi(); 26 } 27 else { 28 suteitasu.ataltuku(); 29 } 30 } 31 } 32} 33 34class BattleF { 35 int playr_hp = 20; 36 int enemi_hp = 20; 37 named namae; 38 39 BattleF(named namae) { this.namae = namae; } 40 41 void ataltuku() { 42 enemi_hp--; 43 System.out.println(namae.input_enemi + " 1のダメージ " 44 + namae.input_enemi + " HP" + enemi_hp + " " 45 + namae.input_name + " HP" + playr_hp); 46 } 47 48 void dameizi() { 49 playr_hp--; 50 System.out.println(namae.input_name + " 1のダメージ " 51 + namae.input_name + " HP" + playr_hp + " " 52 + namae.input_enemi + " HP" + enemi_hp); 53 } 54} 55 56class named { 57 String input_name; 58 String input_enemi; 59 Scanner input; 60 61 named(Scanner input) { this.input = input; } 62 63 void input_youname() { 64 System.out.print("名前を入力してください > "); 65 input_name = input.nextLine(); 66 System.out.println("あなたの名前は"+input_name + "です"); 67 System.out.print("敵の名前を入力してください "); 68 input_enemi = input.nextLine(); 69 System.out.println(input_enemi + "が入力されました"); 70 System.out.println("敵の名前は"+input_enemi); 71 System.out.println("あなたの名前は"+input_name); 72 } 73}

投稿2020/12/07 18:45

kazuma-s

総合スコア8224

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

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

D-coder

2020/12/08 02:19

回答ありがとうございます! String を付けていたことで、フィールド値に代入できていなかったんですね・・・ 無事解決できました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問