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

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

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

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

Q&A

3回答

3934閲覧

数当てゲームを制作したのですが、全くゲームにならないのです。

ATan

総合スコア8

Java

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

0グッド

0クリップ

投稿2017/07/30 12:55

###前提・実現したいこと
数当てゲームに簡単なパネルをつけたいのですが、、、
・精製した乱数がゲーム中保持されない
・10
回ゲームオーバーの表示が出るよう書いているがゲームが終わらない
・◯回目という表示を出したくて設定したが、表示されない

と言った問題に悩んでいます。プログラミングは全くの初心者で、初歩的な質問をしているのは自覚しています。どなたか、下記のコードの修正点、足りないものを教えていただけないでしょうか。

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

###該当のソースコード
////ライブラリの読み込み////////////////////
import java.awt.; //AWT
import javax.swing.
; //Swing
import java.awt.image.; //画像表示用
import javax.imageio.ImageIO;//画像読み込み用
import java.io.File; //ファイル読み込み用
import java.io.IOException; //ファイル読み込み用
import java.awt.event.
; //(ボタンの)イベント処理用
import java.io.*; //javaのI/O(InputとOutput)に関するライブラリを読み込む
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

/simpleChatterbotクラス*********************/
class numquiz extends JFrame implements ActionListener{
JTextField text;//テキストフィールドの宣言
JLabel label; //ボットが喋る文字を出力する用のラベルの宣言

//String型の変数inputTextの宣言. //inputTextには,ユーザが入力した文字列が入ります String inputText; ////main メソッド/////////////////////////// public static void main (String [] args){ //初期設定(コンストラクタ) numquiz frame = new numquiz(); //上の初期設定(コンストラクタ)で設定した内容を表示 frame.setVisible(true); } ////chatterbotFileIOSpeak//////////////////////// //☆初期設定(コンストラクタ)☆// numquiz(){ setTitle("numberquiz!!"); //←" setBounds(100, 10, 300, 150); //ウィンドウサイズの設定(ウィンドウの画面上の横位置,縦位置,縦幅,横幅) setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ウィンドウ終了時の処理設定 //パネルの宣言 JPanel p = new JPanel();//ウィンドウフレーム上のボタンを出力する用のパネルの宣言+コンストラクタ(パネル初期設定) text = new JTextField("0~10の数字を入力してね!", 10);//テキストフィールドのコンストラクタ(テキスト初期設定) //ボタンの宣言 JButton button = new JButton("Input"); //↓ボタン(button)が動作するとactionPerformed(イベント処理)が発動するよう設定 button.addActionListener(this); //ボットが喋る文字を出力するラベルの初期設定 label = new JLabel(); //パネル上の北の位置に,テキストフィールドを置く p.add(text, BorderLayout.NORTH); //パネル上の北の位置に,ボタンを置く p.add(button, BorderLayout.NORTH); //ウィンドウ全体の領域面(contentPane)を宣言+コンストラクタ Container contentPane = getContentPane(); //ウィンドウ全体の領域面(contentPane)上の北の位置に,パネルを置く contentPane.add(p, BorderLayout.NORTH); //ウィンドウ全体の領域面(contentPane)上の配置状の一番最後に,ボットが喋る文字を出力する用のラベル contentPane.add(label, BorderLayout.PAGE_END); }//chatterbotFileIOSpeak ☆初期設定(コンストラクタ)☆の終了 ////イベント:actionPerformed ///////////// //イベント時に実行される.今回はボタンが押された時のみ// public void actionPerformed(ActionEvent e){ inputText = text.getText(); //入力された文字を読み込んでinputTextに代入 int i = new Integer(inputText).intValue(); Random random = new Random(); final int number = random.nextInt(10); int count = 0; for(count=0;count < 5;count++){ if (number == i) { label.setText("GREAT!!正解だよ!"); break; } else if (number < i) { label.setText("大きすぎるよ!"); } else if (number > i){ label.setText("小さすぎるよ!"); } } if(number != i){ label.setText("Game Over! 正解は " + number + " でした!"); } }//イベント処理:actionPerformed終了

}

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

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

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

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

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

swordone

2017/07/30 13:08

質問編集画面でコードを選択し、画面上部にある<code>を押して整形してください。
ATan

2017/07/30 13:22

初心者で申し訳ありません。やってみました。宜しくお願い致します。
swordone

2017/07/30 13:23

「やってみました」←何にもなっていません。
guest

回答3

0

このサイトがわかりやすいですね。
http://npnl.hatenablog.jp/entry/20090116/1232120896

new Random()でseedを指定していないので(おそらく既定値seed=0)、毎回同じ乱数が作られます。

1つ目の乱数がA
2つ目の乱数がB
だとしたら
newした後は必ずA,Bの順番で作られます。

seedを異なる値にする必要がありますので現在時刻のエポック秒などを指定してください。
毎回 Randomインスタンスを作っても異なる値が生成されます。

投稿2017/07/31 15:24

Tak1016

総合スコア1408

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

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

swordone

2017/07/31 16:36

Randomの引数なしコンストラクタで毎回同じシードで乱数生成するなんて聞いたことないです。 そしてそんなことないです。 実証→http://ideone.com/ysfhww (新規Randomインスタンスを引数なしコンストラクタで生成し、1桁の整数を10回出して文字列連結というものを10回繰り返した)
guest

0

Java

1////ライブラリの読み込み//////////////////// 2import java.awt.*; //AWT 3import javax.swing.*; //Swing 4import java.awt.image.*; //画像表示用 5import javax.imageio.ImageIO;//画像読み込み用 6import java.io.File; //ファイル読み込み用 7import java.io.IOException; //ファイル読み込み用 8import java.awt.event.*; //(ボタンの)イベント処理用 9import java.io.*; //javaのI/O(InputとOutput)に関するライブラリを読み込む 10import java.io.BufferedReader; 11import java.io.IOException; 12import java.io.InputStreamReader; 13import java.util.Random; 14 15/********** simpleChatterbotクラス *******************************/ 16class numquiz extends JFrame implements ActionListener { 17 JTextField text;// テキストフィールドの宣言 18 JLabel label; // ボットが喋る文字を出力する用のラベルの宣言 19 20 final int CHALLENGE_MAX = 10; 21 int challengeCount = 0; 22 int answer = -1; 23 24 // //main メソッド/////////////////////////// 25 public static void main(String[] args) { 26 // 初期設定(コンストラクタ) 27 numquiz frame = new numquiz(); 28 29 // 上の初期設定(コンストラクタ)で設定した内容を表示 30 frame.setVisible(true); 31 } 32 33 /** 34 * 答えを決める 35 */ 36 void generateAnser() { 37 Random random = new Random(); 38 answer = random.nextInt(10); 39 } 40 41 // //chatterbotFileIOSpeak//////////////////////// 42 // ☆初期設定(コンストラクタ)☆// 43 numquiz() { 44 generateAnser(); 45 46 setTitle("numberquiz!!"); // ←" 47 setBounds(100, 10, 300, 150); // ウィンドウサイズの設定(ウィンドウの画面上の横位置,縦位置,縦幅,横幅) 48 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// ウィンドウ終了時の処理設定 49 50 // パネルの宣言 51 JPanel p = new JPanel();// ウィンドウフレーム上のボタンを出力する用のパネルの宣言+コンストラクタ(パネル初期設定) 52 text = new JTextField("0~10の数字を入力してね!", 10);// テキストフィールドのコンストラクタ(テキスト初期設定) 53 54 // ボタンの宣言 55 JButton button = new JButton("Input"); 56 // ↓ボタン(button)が動作するとactionPerformed(イベント処理)が発動するよう設定 57 button.addActionListener(this); 58 // ボットが喋る文字を出力するラベルの初期設定 59 label = new JLabel(); 60 61 // パネル上の北の位置に,テキストフィールドを置く 62 p.add(text, BorderLayout.NORTH); 63 // パネル上の北の位置に,ボタンを置く 64 p.add(button, BorderLayout.NORTH); 65 66 // ウィンドウ全体の領域面(contentPane)を宣言+コンストラクタ 67 Container contentPane = getContentPane(); 68 // ウィンドウ全体の領域面(contentPane)上の北の位置に,パネルを置く 69 contentPane.add(p, BorderLayout.NORTH); 70 // ウィンドウ全体の領域面(contentPane)上の配置状の一番最後に,ボットが喋る文字を出力する用のラベル 71 contentPane.add(label, BorderLayout.PAGE_END); 72 73 }// chatterbotFileIOSpeak ☆初期設定(コンストラクタ)☆の終了 74 75 // //イベント:actionPerformed ///////////// 76 // イベント時に実行される.今回はボタンが押された時のみ// 77 public void actionPerformed(ActionEvent e) { 78 int inputNumber; 79 80 try { 81 String inputText = text.getText(); // 入力された文字を読み込んでinputTextに代入 82 inputNumber = new Integer(inputText).intValue(); 83 }catch(Exception ex) { 84 ex.printStackTrace(); 85 label.setText("数値以外が入力されています。"); 86 return; 87 } 88 89 ++ challengeCount; 90 91 System.out.println(challengeCount+"回目チャレンジ:"+inputNumber); 92 93 if (answer == inputNumber) { 94 label.setText(challengeCount+"回目チャレンジ:GREAT!!正解だよ!"); 95 generateAnser(); 96 challengeCount = 0; 97 return; 98 } else if (answer < inputNumber) { 99 label.setText(challengeCount+"回目チャレンジ:大きすぎるよ!"); 100 } else if (answer > inputNumber) { 101 label.setText(challengeCount+"回目チャレンジ:小さすぎるよ!"); 102 } 103 104 if (CHALLENGE_MAX <= challengeCount) { 105 label.setText("Game Over! 正解は " + answer + " でした!"); 106 generateAnser(); 107 challengeCount = 0; 108 } 109 110 }// イベント処理:actionPerformed終了 111}

できるだけ元のコードを使いました。
このような事をやりたかったのでしょうか。
ランダム値を生成するタイミング、作成したランダム値をどこに保持するか、
チャレンジした回数をどこに保持するか、この辺がポイントかと思います。
頑張って下さい。

投稿2017/07/31 06:28

編集2017/07/31 06:47
hige0119

総合スコア37

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

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

0

ここが目につきました。

Java

1for(count=0;count < 5;count++){ 2 if (number == i) { 3 label.setText("GREAT!!正解だよ!"); 4 break; 5 } else if (number < i) { 6 label.setText("大きすぎるよ!"); 7 } else if (number > i){ 8 label.setText("小さすぎるよ!"); 9 } 10} 11if(number != i){ 12 label.setText("Game Over! 正解は " + number + " でした!"); 13}

このforループなんなんです?numberとiに全く変化がないので、このループは無意味です。
おそらく、プログラミングの根本的な部分の理解がないものと思います。


このゲームは次のような仕様になっています。
0. 値を入力してボタンを押すと
0. たまたまランダムに生成された値と同一だった場合、正解メッセージが出て
0. そうではない場合、即座にゲームオーバーになる

まずはご自身のプログラムの動作を追ってみてください。

重要

swordoneさんもご指摘のとおり...
コードはバッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。
これをしているかどうかで、回答の量と質が変わってきます。

投稿2017/07/30 16:02

LouiS0616

総合スコア35660

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

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

swordone

2017/07/30 16:26

マークダウン記法といってもわからないだろうからやってほしい操作そのまま言ったのに伝わらない
LouiS0616

2017/07/30 16:31

心中お察しします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問