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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

3回答

2006閲覧

メソッドの一部が機能しない

tomagurosu

総合スコア37

Java

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

0グッド

0クリップ

投稿2017/05/13 07:37

Java

1public class Numeron2{ 2 public static void main(String[] args){ 3 int clearTurn = 0; 4 Answer.answerGenerator(); 5 do{ 6 clearTurn ++; 7 Predict p1 = new Predict(Answer.getDigit()); 8 AnswerChecker.check(Answer.getAnswer(),p1.getPredict()); 9 }while(AnswerChecker.getEat() != Answer.getDigit()); 10 System.out.println("GAME CLEAR!!"); 11 System.out.println("あなたはクリアに"+clearTurn+"ターンかかりました"); 12 } 13}

Java

1public class Answer{ 2 private static int[] answer;//答え 3 private static int digit;//桁数 4 public static int[] getAnswer(){//答えを送る 5 return answer; 6 } 7 public static int getDigit(){ 8 return digit; 9 } 10 public static void answerGenerator(){// 11 Gamelevel.levelInput(); 12 digit = Gamelevel.getLevel();; 13 answer = new int[digit]; 14 int check;//取得して桁数でアンサー配列を生成 15 do{//ここからアンサーの要素を重複なく生成する 16 check = 0; 17 for(int a = 0;a < answer.length; a++){ 18 answer[a] = (int)(Math.random()*10); 19 } 20 for(int b = 0;b < answer.length; b++){ 21 for(int c = 0;c < answer.length; c++){ 22 if(answer[b] == answer[c]){ 23 check++; 24 } 25 } 26 } 27 }while(check != answer.length); 28 for(int i = 0;i < answer.length;i ++){ 29 System.out.println(answer[i]); 30 } 31 } 32}

Java

1public class AnswerChecker{ 2 private static int eat = 0; 3 private static int bite = 0; 4 public static void check(int[] answer,int[] predict){ 5 for(int a = 0; a<predict.length; a++){ 6 if(predict[a] == answer[a]){ //predict配列をまわしてanswer配列に使用されてる数字と位置を重複しているかチェック 7 eat++; 8 }for(int b = 0; b<answer.length; b++){ 9 if(predict[a] == answer[b]){ //同じくanswer配列をまわして使用されてる数字が重複しているかチェック 10 bite++; 11 } 12 } 13 }System.out.println(bite+"BITE-"+eat+"EAT"); 14 } 15 public static int getEat(){ 16 return eat; 17 } 18}

Java

1public class Gamelevel{ 2 private static int level; 3 public static void levelInput(){ 4 System.out.println("数字を入力してレベルを選んでください"); 5 System.out.println("0:レベル1 3桁 1:レベル2 4桁 2:レベル3 5桁"); 6 int level = new java.util.Scanner(System.in).nextInt()+3; 7 } 8 public static int getLevel(){ 9 return level; 10 } 11}

Java

1public class Predict{ 2 private static int[] predict; 3 Predict(int d){ 4 predict = new int[d]; 5 System.out.println("予想するナンバーを1つずつ入力してください"); 6 for(int a = 0;a < predict.length; a++){ 7 predict[a] = new java.util.Scanner(System.in).nextInt(); 8 } 9 } 10 public static int[] getPredict(){ 11 return predict; 12 } 13}

オブジェクト指向の練習をしようと思い数あてゲームを作ったのですが
このプログラムを実行するとエラーは出ないのですが答え入力(アンサークラス)が飛ばされて
何もせずにゲームクリアとなってしまいます。
確認用に答えを表示するようにも作ったのですがそれも飛ばされてしまうようです。
全体的に配列を使ったfor文の箇所がおかしくなっているような気がするのですが直す方法がいまいちわかりません。
解答よろしければお願いします。

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

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

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

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

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

guest

回答3

0

java

1public class Gamelevel{ 2 private static int level; 3 public static void levelInput(){ 4 System.out.println("数字を入力してレベルを選んでください"); 5 System.out.println("0:レベル1 3桁 1:レベル2 4桁 2:レベル3 5桁"); 6 int level = new java.util.Scanner(System.in).nextInt()+3; 7 } 8 public static int getLevel(){ 9 return level; 10 } 11}

このクラスのlebelInputで入力を格納しているのがstaticメンバのlevelではなく、ローカル変数のlevelです。staticメンバのlevelは0のままなので、getLevelでも当然0を返します。あとはお分かりですね?

それ以外にもクラスを細かく分けすぎとかstaticなものにインスタンス介してアクセスしてるとかそもそもstatic値の設定にコンストラクタ使ってたりとか、突っ込みどころいっぱいあるんだけどね。

投稿2017/05/13 16:41

編集2017/05/13 16:53
swordone

総合スコア20651

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

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

tomagurosu

2017/05/14 05:00

細かすぎましたか。。。 知識不足なのでこれからいろいろと精進していきたいです ありがとうございます
guest

0

ベストアンサー

Java

1public class Gamelevel{ 2 private static int level; 3 public static void levelInput(){ 4 System.out.println("数字を入力してレベルを選んでください"); 5 System.out.println("0:レベル1 3桁 1:レベル2 4桁 2:レベル3 5桁"); 6 // ↓の行がstatic変数ではなく、ローカル変数に対しての代入になってます。そのためstatic変数levelの値が変更されずに 0となります。行頭のintを削除してください。 7 int level = new java.util.Scanner(System.in).nextInt()+3; 8 } 9 public static int getLevel(){ 10 return level; 11 } 12}

IDE(eclipsenetbeans)をインストールしてデバック実行するのが一番いいと思いますが。

<< 大まかな調べ方 >>
質問文のプログラムを実行すると以下の内容がコンソールに出力されます。

|入力/出力|内容|ソースコードの箇所||
|:--|:--|:--:|
|出力|数字を入力してレベルを選んでください|GamelevelクラスのlevelInput|
|出力|0:レベル1 3桁 1:レベル2 4桁 2:レベル3 5桁|GamelevelクラスのlevelInput|
|入力|0|GamelevelクラスのlevelInput|
|出力|予想するナンバーを1つずつ入力してください|PredictクラスのPredict (コンストラクタ)|
|出力|0BITE-0EAT|AnswerCheckerクラスのcheck|
|出力|GAME CLEAR!!|Numeron2クラスのmain|
|出力|あなたはクリアに1ターンかかりました|Numeron2クラスのmain|

1,PredictクラスのPredict(コンストラクタ)でScannerで入力待ちを行ってますが、上記表にPredict#Predictの入力待ちがないため、ループの条件外ということが分かります。

Java

1for(int a = 0;a < predict.length; a++){ 2 predict[a] = new java.util.Scanner(System.in).nextInt(); 3}

predict = new int[d]; ←理由は配列(predict)のlengthが0なため。

2,Numeron2クラスのmainメソッドにてPredictクラスをnew Predictで生成する時に引数の値としてAnswer.getDigit()を渡してます。

Java

1Predict p1 = new Predict(Answer.getDigit());

AnswerクラスのgetDigit

Java

1public static int getDigit() { 2 return digit; 3}

3,AnswerクラスのanswerGeneratorにてGamelevelクラスのgetLevel より値を取得してます。

投稿2017/05/13 12:55

編集2017/05/13 15:24
umyu

総合スコア5846

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

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

tomagurosu

2017/05/14 05:02

詳しく解説していただきありがとうございます! Eclipseでデバッグやってみたいと思います。 プログラムはintを抜いたら思うとおりに動きました!
guest

0

このプログラムを実行するとエラーは出ないのですが...

恐らく、eclipse なりなんなりで、ワーニングが出ていると思うのでそれを解決するとよいです。

投稿2017/05/13 09:56

koko_u

総合スコア936

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

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

tomagurosu

2017/05/14 05:03

Eclipse使ってみたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問