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

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

ただいまの
回答率

88.10%

javaでクイズ、次の問題を表示したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,694

score 5

前提・実現したいこと

java勉強中の初心者です。javaで2択のクイズゲームを作っているのですが、クイズは5問あり、ランダムに問題を表示させるようにしました。あと2択のボタンを作り、クイズの内容によって合うテキストに表示するようにしました。(コードは汚いですが、、、)
そしてボタンを押せば、「正解」、「不正解」と表示されるのですが、その後に次の問題が表示されるようにしたいです。

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

エラーメッセージ   特になし

該当のソースコード

package テスト;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class クイズゲーム implements ActionListener{
    public static String a;
    public static String b;
    public static String c;
    public static JLabel lb1;
    public static JButton bt1,bt2;
    public static String seikai[] = {"骨川","メロンパン","ラブ","パーソナル","だだんだん"};
    public static void main(String[]args){
        c = クイズ.kuizurandom();
        a = test.buttonrandom();
        b = test.buttonrandom2();
    GAME gm = new GAME("NOBUクイズ",500,500);
        bt1 = new JButton(a);
        bt2 = new JButton(b);
    lb1 = new JLabel(c);
    lb1.setHorizontalAlignment(JLabel.CENTER);
    lb1.setForeground(Color.red);
    JPanel headerPanel = new JPanel();
    headerPanel.setBackground(Color.BLACK);
    Dimension headerPanelDimension = new Dimension(500,50);
    headerPanel.setPreferredSize(headerPanelDimension);
    gm.add(headerPanel,BorderLayout.NORTH);
    JPanel p = new JPanel();
        bt1.addActionListener(e -> {
            bt1 = (JButton)e.getSource();
            String str;
            str = bt1.getText();
            answer(str);

---ここにnextkuizu()を挿入

        });
        bt2.addActionListener(e ->{
            String str2;
            bt2 = (JButton)e.getSource();
            str2 = bt2.getText();
            answer(str2);

---ここにnextkuizu()を挿入

        });
        p.add(bt1);
        p.add(bt2);
        gm.add(lb1);
        gm.add(p,BorderLayout.PAGE_END);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        bt1 = (JButton)e.getSource();
        String str,str2;
        str = bt1.getText();
        answer(str);

---ここにnextkuizu()を挿入

        bt2 = (JButton)e.getSource();
        str2 = bt2.getText();
        answer(str2);

---ここにnextkuizu()を挿入

    }

    public static void answer(String b){
    if(b.equals(seikai[0])){
        lb1.setText("正解");
        lb1.setForeground(Color.PINK);
    }else if(b.equals(seikai[1])){
        lb1.setText("正解");
        lb1.setForeground(Color.PINK);
    }else if(b.equals(seikai[2])){
        lb1.setText("正解");
        lb1.setForeground(Color.PINK);
    }else if(b.equals(seikai[3])){
        lb1.setText("正解");
        lb1.setForeground(Color.PINK);
    }else if(b.equals(seikai[4])){
        lb1.setText("正解");
        lb1.setForeground(Color.PINK);
    }else{
        lb1.setText("不正解");
        lb1.setForeground(Color.DARK_GRAY);
        }

    }
    public static void nextkuizu(){
         lb1.setText(クイズ.kuizurandom());
         bt1.setText(test.buttonrandom());
         bt2.setText(test.buttonrandom2());
    }
}
package テスト;

import java.util.Random;

public class クイズ{
        public static String kuizurandom(){
        String[] mondai = new String[5];
        mondai[0]="ドラえもんに登場するスネ夫の苗字は?";
        mondai[1]="ドラえもんの好物はどら焼き、では妹のドラミちゃんの好物は?";
        mondai[2]="硬式テニスで0点の事を2文字で何と言うでしょう?";
        mondai[3]="パソコンのコンはコンピュータの略。ではパソの略は?";
        mondai[4]="ばいきんまんが愛用しているロボットの名前は?";
        Random a = new Random();
        return  mondai[a.nextInt(5)];
        }
}
package テスト;

import java.util.Random;

public class test{
    public static String buttonrandom(){
    String[] bu = new String[2];
    bu[0]="骨川";
    bu[1]="馬川";
    String[] bu1 = new String[2];
    bu1[0]="メロンパン";
    bu1[1]="チョコレートパン";
    String[] bu2 = new String[2];
    bu2[0]="ラブ";
    bu2[1]="レイブ";
    String[] bu3 = new String[2];
    bu3[0]="パーソナル";
    bu3[1]="ターミナル";
    String[] bu4 = new String[2];
    bu4[0]="だだんだん";
    bu4[1]="どどんどん";
    Random d = new Random();
    if(クイズゲーム.c.equals("ドラえもんに登場するスネ夫の苗字は?")){
    return    bu[d.nextInt(2)];
    }else if(クイズゲーム.c.equals("ドラえもんの好物はどら焼き、では妹のドラミちゃんの好物は?")){
    return  bu1[d.nextInt(2)];
    }else if(クイズゲーム.c.equals("硬式テニスで0点の事を2文字で何と言うでしょう?")){
    return bu2[d.nextInt(2)];
    }else if(クイズゲーム.c.equals("パソコンのコンはコンピュータの略。ではパソの略は?")){
    return bu3[d.nextInt(2)];
    }else
    return bu4[d.nextInt(2)];
    }
    public static String buttonrandom2(){
        String[] bu = new String[2];
        bu[0]="骨川";
        bu[1]="馬川";
        String[] bu1 = new String[2];
        bu1[0]="メロンパン";
        bu1[1]="チョコレートパン";
        String[] bu2 = new String[2];
        bu2[0]="ラブ";
        bu2[1]="レイブ";
        String[] bu3 = new String[2];
        bu3[0]="パーソナル";
        bu3[1]="ターミナル";
        String[] bu4 = new String[2];
        bu4[0]="だだんだん";
        bu4[1]="どどんどん";
        switch(クイズゲーム.a){
        case "骨川":
            return bu[1];
        case "馬川":
            return bu[0];
        case "メロンパン":
            return bu1[1];
        case "チョコレートパン":
            return bu1[0];
        case "ラブ":
            return bu2[1];
        case "レイブ":
            return bu2[0];
        case "パーソナル":
            return bu3[1];
        case "ターミナル":
            return bu3[0];
        case "だだんだん":
            return bu4[1];
        case "どどんどん":
            return bu4[0];
        default:
            return null;
        }

    }
    }

試したこと

nextkuizuメソッドを作りactionPerformedとActionListenerの処理の後に挿入してみたのですが、ボタンを押すと「正解」「不正解」の文字が出なくなり、クイズは変わるのですが、テキストの色が「正解」の色と同じだったり、ボタンの表示が1パターンだけになったりします。

すいませんが、よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • jimbe

    2019/09/09 21:44

    > GAME gm = new GAME("NOBUクイズ",500,500);
    GAME クラスが見当たりませんが, どのようなクラスでしょう.

    キャンセル

  • NOVUCHANMAN

    2019/09/10 13:13

    package テスト;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JFrame;

    public class GAME extends JFrame implements ActionListener{
    public GAME(String title,int width,int height){
    super(title);
    setVisible(true);
    setSize(width,height);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    }
    public void actionPerformed(ActionEvent e){

    }
    }

    キャンセル

  • NOVUCHANMAN

    2019/09/10 13:14

    すいません。忘れていました。ご指摘ありがとうございます。

    キャンセル

  • jimbe

    2019/09/10 17:20

    ありがとうございます.

    キャンセル

回答 1

checkベストアンサー

+1

申し訳ありませんが, ご提示のコードは汚いというより無茶苦茶と思います.
名前に日本語・英語・ローマ字・単一文字が混在し, クイズの文字列は散在し, public static だらけです.
これでは手を入れ難いので, ソレっぽく作り直してみました.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class QuizGame extends JFrame {
  public static void main(String[] args){
    new QuizGame("NOBUクイズ", 500, 500);
  }

  static private class Quiz {
    String question; //問題文
    String[] answers; //選択肢
    String correct; //正解
    Quiz(String question, String[] answers) {
      this(question, answers, 0);
    }
    Quiz(String question, String[] answers, int correctNo) {
      this.question = question;
      this.answers = shuffle(answers);
      this.correct = answers[correctNo];
    }
    private static String[] shuffle(String[] array) {
      List<String> a = Arrays.asList(array.clone());
      Collections.shuffle(a);
      return a.toArray(new String[array.length]);
    }
  }

  static private Quiz[] quizArray = {
      new Quiz("ドラえもんに登場するスネ夫の苗字は?",
          new String[]{"骨川", "馬川", "スネ山"}),
      new Quiz("ドラえもんの好物はどら焼き、では妹のドラミちゃんの好物は?",
          new String[]{"メロンパン", "チョコレートパン"}),
      new Quiz("硬式テニスで0点の事を2文字で何と言うでしょう?",
          new String[]{"ラブ", "レイブ"}),
      new Quiz("パソコンのコンはコンピュータの略。ではパソの略は?",
          new String[]{"パーソナル", "ターミナル"}),
      new Quiz("ばいきんまんが愛用しているロボットの名前は?",
          new String[]{"だだんだん", "どどんどん"}),
  };

  private Deque<Quiz> quizStack = new ArrayDeque<Quiz>();
  private Quiz quiz; //出題中のクイズ

  private JLabel questionLabel;
  private AnswerPanel answerPanel;
  private SouthPanel southPanel;

  public QuizGame(String title, int width, int height) {
    super(title);
    setVisible(true);
    setSize(width, height);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);

    JPanel headerPanel = new JPanel();
    headerPanel.setBackground(Color.BLACK);
    headerPanel.setPreferredSize(new Dimension(500,50));
    add(headerPanel, BorderLayout.NORTH);

    questionLabel = new JLabel("");
    questionLabel.setHorizontalAlignment(JLabel.CENTER);
    add(questionLabel, BorderLayout.CENTER);

    answerPanel = new AnswerPanel(answer->decide(answer));

    southPanel = new SouthPanel(answerPanel, e->drawQuiz(), e->end());
    add(southPanel, BorderLayout.SOUTH);

    //クイズをシャッフルして山にする
    List<Quiz> quizList = Arrays.asList(quizArray.clone());
    Collections.shuffle(quizList);
    quizStack.addAll(quizList);

    drawQuiz();
  }

  //回答ボタン群
  static private class AnswerPanel extends JPanel {
    interface AnswerListener {
      void decide(String answer);
    }
    private AnswerListener answerListener;
    private final ActionListener actionListener = new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        String answer = ((JButton)e.getSource()).getText();
        answerListener.decide(answer);
      }
    };
    AnswerPanel(AnswerListener answerListener) {
      this.answerListener = answerListener;
    }
    //回答数に応じてボタン配置
    void setAnswers(String[] answers) {
      removeAll();
      for(int i=0; i<answers.length; i++) {
        JButton button = new JButton(answers[i]);
        button.addActionListener(actionListener);
        add(button);
      }
    }
  }

  //下部の表示を進行状況に応じて切り替える
  static private class SouthPanel extends JPanel {
    enum Card {
      ANSWER, //回答
      NEXT,   //次の問題へ
      END     //全問終了
    };

    private CardLayout southCard;

    SouthPanel(JComponent answer, ActionListener nextActionListener, ActionListener endActionListener) {
      super(null);
      southCard = new CardLayout();
      setLayout(southCard);

      add(answer, Card.ANSWER.name());

      JButton nextButton = new JButton("次へ");
      nextButton.addActionListener(nextActionListener);
      add(nextButton, Card.NEXT.name());

      JButton endButton = new JButton("終了");
      endButton.addActionListener(endActionListener);
      add(endButton, Card.END.name());
    }

    void show(Card card) {
      southCard.show(this, card.name());
    }
  }

  private void end() {
    dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
  }

  //山からクイズを引き, 表示する.
  private void drawQuiz() {
    quiz = quizStack.pollFirst();

    southPanel.show(SouthPanel.Card.ANSWER);

    questionLabel.setText(quiz.question);
    questionLabel.setForeground(Color.red);
    answerPanel.setAnswers(quiz.answers);
  }

  //判定
  private void decide(String answer) {
    if(answer.equals(quiz.correct)){
      questionLabel.setText("正解");
      questionLabel.setForeground(Color.PINK);
    }else{
      questionLabel.setText("不正解");
      questionLabel.setForeground(Color.DARK_GRAY);
    }

    southPanel.show(quizStack.isEmpty() ? SouthPanel.Card.END : SouthPanel.Card.NEXT);
  }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/10 13:20

    勉強になります。本当にありがとうございます。

    キャンセル

  • 2019/09/10 17:59

    GAME クラスの記述を反映しました.

    キャンセル

  • 2019/09/15 12:24

    解決できました。ありがとうございます。

    キャンセル

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

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

関連した質問

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