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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

1回答

4276閲覧

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

NOVUCHANMAN

総合スコア5

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

1クリップ

投稿2019/09/09 07:59

前提・実現したいこと

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パターンだけになったりします。

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

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

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

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

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

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

jimbe

2019/09/09 12:44

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

2019/09/10 04: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 04:14

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

2019/09/10 08:20

ありがとうございます.
guest

回答1

0

ベストアンサー

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

java

1import java.awt.BorderLayout; 2import java.awt.CardLayout; 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.awt.event.WindowEvent; 8import java.util.ArrayDeque; 9import java.util.Arrays; 10import java.util.Collections; 11import java.util.Deque; 12import java.util.List; 13 14import javax.swing.JButton; 15import javax.swing.JComponent; 16import javax.swing.JFrame; 17import javax.swing.JLabel; 18import javax.swing.JPanel; 19 20public class QuizGame extends JFrame { 21 public static void main(String[] args){ 22 new QuizGame("NOBUクイズ", 500, 500); 23 } 24 25 static private class Quiz { 26 String question; //問題文 27 String[] answers; //選択肢 28 String correct; //正解 29 Quiz(String question, String[] answers) { 30 this(question, answers, 0); 31 } 32 Quiz(String question, String[] answers, int correctNo) { 33 this.question = question; 34 this.answers = shuffle(answers); 35 this.correct = answers[correctNo]; 36 } 37 private static String[] shuffle(String[] array) { 38 List<String> a = Arrays.asList(array.clone()); 39 Collections.shuffle(a); 40 return a.toArray(new String[array.length]); 41 } 42 } 43 44 static private Quiz[] quizArray = { 45 new Quiz("ドラえもんに登場するスネ夫の苗字は?", 46 new String[]{"骨川", "馬川", "スネ山"}), 47 new Quiz("ドラえもんの好物はどら焼き、では妹のドラミちゃんの好物は?", 48 new String[]{"メロンパン", "チョコレートパン"}), 49 new Quiz("硬式テニスで0点の事を2文字で何と言うでしょう?", 50 new String[]{"ラブ", "レイブ"}), 51 new Quiz("パソコンのコンはコンピュータの略。ではパソの略は?", 52 new String[]{"パーソナル", "ターミナル"}), 53 new Quiz("ばいきんまんが愛用しているロボットの名前は?", 54 new String[]{"だだんだん", "どどんどん"}), 55 }; 56 57 private Deque<Quiz> quizStack = new ArrayDeque<Quiz>(); 58 private Quiz quiz; //出題中のクイズ 59 60 private JLabel questionLabel; 61 private AnswerPanel answerPanel; 62 private SouthPanel southPanel; 63 64 public QuizGame(String title, int width, int height) { 65 super(title); 66 setVisible(true); 67 setSize(width, height); 68 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 69 setResizable(false); 70 71 JPanel headerPanel = new JPanel(); 72 headerPanel.setBackground(Color.BLACK); 73 headerPanel.setPreferredSize(new Dimension(500,50)); 74 add(headerPanel, BorderLayout.NORTH); 75 76 questionLabel = new JLabel(""); 77 questionLabel.setHorizontalAlignment(JLabel.CENTER); 78 add(questionLabel, BorderLayout.CENTER); 79 80 answerPanel = new AnswerPanel(answer->decide(answer)); 81 82 southPanel = new SouthPanel(answerPanel, e->drawQuiz(), e->end()); 83 add(southPanel, BorderLayout.SOUTH); 84 85 //クイズをシャッフルして山にする 86 List<Quiz> quizList = Arrays.asList(quizArray.clone()); 87 Collections.shuffle(quizList); 88 quizStack.addAll(quizList); 89 90 drawQuiz(); 91 } 92 93 //回答ボタン群 94 static private class AnswerPanel extends JPanel { 95 interface AnswerListener { 96 void decide(String answer); 97 } 98 private AnswerListener answerListener; 99 private final ActionListener actionListener = new ActionListener() { 100 @Override 101 public void actionPerformed(ActionEvent e) { 102 String answer = ((JButton)e.getSource()).getText(); 103 answerListener.decide(answer); 104 } 105 }; 106 AnswerPanel(AnswerListener answerListener) { 107 this.answerListener = answerListener; 108 } 109 //回答数に応じてボタン配置 110 void setAnswers(String[] answers) { 111 removeAll(); 112 for(int i=0; i<answers.length; i++) { 113 JButton button = new JButton(answers[i]); 114 button.addActionListener(actionListener); 115 add(button); 116 } 117 } 118 } 119 120 //下部の表示を進行状況に応じて切り替える 121 static private class SouthPanel extends JPanel { 122 enum Card { 123 ANSWER, //回答 124 NEXT, //次の問題へ 125 END //全問終了 126 }; 127 128 private CardLayout southCard; 129 130 SouthPanel(JComponent answer, ActionListener nextActionListener, ActionListener endActionListener) { 131 super(null); 132 southCard = new CardLayout(); 133 setLayout(southCard); 134 135 add(answer, Card.ANSWER.name()); 136 137 JButton nextButton = new JButton("次へ"); 138 nextButton.addActionListener(nextActionListener); 139 add(nextButton, Card.NEXT.name()); 140 141 JButton endButton = new JButton("終了"); 142 endButton.addActionListener(endActionListener); 143 add(endButton, Card.END.name()); 144 } 145 146 void show(Card card) { 147 southCard.show(this, card.name()); 148 } 149 } 150 151 private void end() { 152 dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 153 } 154 155 //山からクイズを引き, 表示する. 156 private void drawQuiz() { 157 quiz = quizStack.pollFirst(); 158 159 southPanel.show(SouthPanel.Card.ANSWER); 160 161 questionLabel.setText(quiz.question); 162 questionLabel.setForeground(Color.red); 163 answerPanel.setAnswers(quiz.answers); 164 } 165 166 //判定 167 private void decide(String answer) { 168 if(answer.equals(quiz.correct)){ 169 questionLabel.setText("正解"); 170 questionLabel.setForeground(Color.PINK); 171 }else{ 172 questionLabel.setText("不正解"); 173 questionLabel.setForeground(Color.DARK_GRAY); 174 } 175 176 southPanel.show(quizStack.isEmpty() ? SouthPanel.Card.END : SouthPanel.Card.NEXT); 177 } 178}

投稿2019/09/09 18:41

編集2019/09/10 09:54
jimbe

総合スコア12632

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

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

NOVUCHANMAN

2019/09/10 04:20

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

2019/09/10 08:59

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

2019/09/15 03:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問