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

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

ただいまの
回答率

90.00%

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,730

ATan

score 4

前提・実現したいこと

数当てゲームに簡単なパネルをつけたいのですが、、、
・精製した乱数がゲーム中保持されない
・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終了
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/07/30 22:08

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

    キャンセル

  • ATan

    2017/07/30 22:22

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

    キャンセル

  • swordone

    2017/07/30 22:23

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

    キャンセル

回答 3

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 + " でした!");
}

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


このゲームは次のような仕様になっています。

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

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

重要

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/31 01:26

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

    キャンセル

  • 2017/07/31 01:31

    心中お察しします。

    キャンセル

0

////ライブラリの読み込み////////////////////
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; // ボットが喋る文字を出力する用のラベルの宣言

    final int CHALLENGE_MAX = 10;
    int challengeCount = 0;
    int answer = -1;

    // //main メソッド///////////////////////////
    public static void main(String[] args) {
        // 初期設定(コンストラクタ)
        numquiz frame = new numquiz();

        // 上の初期設定(コンストラクタ)で設定した内容を表示
        frame.setVisible(true);
    }

    /**
     * 答えを決める
     */
    void generateAnser() {
        Random random = new Random();
        answer = random.nextInt(10);
    }

    // //chatterbotFileIOSpeak////////////////////////
    // ☆初期設定(コンストラクタ)☆//
    numquiz() {
        generateAnser();

        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) {
        int inputNumber;

        try {
            String inputText = text.getText(); // 入力された文字を読み込んでinputTextに代入
            inputNumber = new Integer(inputText).intValue();
        }catch(Exception ex) {
            ex.printStackTrace();
            label.setText("数値以外が入力されています。");
            return;
        }

        ++ challengeCount;

        System.out.println(challengeCount+"回目チャレンジ:"+inputNumber);

        if (answer == inputNumber) {
            label.setText(challengeCount+"回目チャレンジ:GREAT!!正解だよ!");
            generateAnser();
            challengeCount = 0;
            return;
        } else if (answer < inputNumber) {
            label.setText(challengeCount+"回目チャレンジ:大きすぎるよ!");
        } else if (answer > inputNumber) {
            label.setText(challengeCount+"回目チャレンジ:小さすぎるよ!");
        }

        if (CHALLENGE_MAX <= challengeCount) {
            label.setText("Game Over! 正解は " + answer + " でした!");
            generateAnser();
            challengeCount = 0;
        }

    }// イベント処理:actionPerformed終了
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/01 01:36

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

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る