JAVAにて4択クイズの作成をしているのですが、下記は5問の問題を連続して表示するプログラムなんですが、これは5問の中から3問をランダムで表示させるようにしたいのですが、どのようにしたら良いのでしょうか。
乱数を使うのも考えたのですが、どのように入れていけばわからないです。よろしければ教えて下さい。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class kake extends Applet implements ActionListener{
private Checkbox CB[];
private CheckboxGroup CBG;
private Button BT;
private Label QL, PL;
private Panel P1, P2;
private String[][] question = {
{"問題1","A","B","C","D","1"},
{"問題2","A","B","C","D","2"},
{"問題3","A","B","C","D","3"},
{"問題4","A","B","C","D","4"},
{"問題5","A","B","C","D","1"},
};
private int rightAns, count;
public void init(){
rightAns = Integer.parseInt(question[0][5]);
count = 0;
CB = new Checkbox[4];
setLayout(new GridLayout(5, 1));
CBG = new CheckboxGroup();
add(QL = new Label(question[0][0]));
add(P1 = new Panel(new GridLayout(1, 2)));
P1.add(CB[0] = new Checkbox(question[0][1], CBG, true));
P1.add(CB[1] = new Checkbox(question[0][2], CBG, false));
add(P2 = new Panel(new GridLayout(1, 2)));
P2.add(CB[2] = new Checkbox(question[0][3], CBG, false));
P2.add(CB[3] = new Checkbox(question[0][4], CBG, false));
add(BT = new Button("答える"));
BT.addActionListener(this);
BT.setActionCommand("BT");
add(PL = new Label(""));
}
public void actionPerformed(ActionEvent ae){
try{
if(ae.getActionCommand().compareTo("BT") == 0){
if(CB[rightAns].getState()){
judgement(true);
}
else{
judgement(false);
}
setQuestion();
}
}
catch(Exception e){
PL.setText(e.toString());
}
}
private void setQuestion(){
QL.setText(question[count][0]);
rightAns = Integer.parseInt(question[count][5]);
CB[0].setLabel(question[count][1]);
CB[1].setLabel(question[count][2]);
CB[2].setLabel(question[count][3]);
CB[3].setLabel(question[count][4]);
repaint();
}
private void judgement(boolean ans){
String result;
if(ans == true){
result = "正解";
}
else{
result = "不正解";
}
if(count == 9){
PL.setText(result);
}
else{
PL.setText(result);
count++;
}
}
}
No.4ベストアンサー
- 回答日時:
すみません回答が遅くなりました
問題の順番を決めてから表示をしますので、init()メソッドの先頭で
順番を入れ替えてから、1問目をGUIにセットするのがいいと思います。
順番を入れ替えているだけなので問題が重複することはありません。
また、問題文(選択肢)を丸ごと入れ替えるのであれば解答がおかしい
ということにはならないはずです。
このへんは実際のコードを見てみないと何とも言えません。
問題の順番がランダムで選択肢の入れ替えはないということでいいんですよね?
応用的には選択肢クラスと問題クラスを設計し、問題クラスのメンバとして
選択肢クラスの配列持つといったような考え方をするのがいいと思います。
No.3
- 回答日時:
>この方法ですと重複の問題が出てこないでしょうか。
でてきますね。
でも「重複を許可しない」のは「ランダム」じゃありません。
1度出てきたら絶対に出てこない数字があるのはランダムじゃないですよね。
で、1度出てきた数字が出てこないようにするには、
出てきた数字を覚えておいて、2回目以降は飛ばして、次の数字を持ってくる。
でいいのでは?
No.2
- 回答日時:
Math.random()は0.0~1.0未満の値を返します。
そこでこの乱数にデータ数nを掛け、int型にすることで0~(n-1)の
ランダムな値を得ることができます。
今回は5問中3問出すということでしたので、重複せずに選ぶ方法として
5問をシャッフルして先頭から3問を使うという方法が考えられます。
※問題のストック数に対して、使用する問題数がはるかに少なければ
ランダムに使用する問題数だけ選んだ方がいいと思います。
「先頭から順にランダムな番号と入れ替える」とすることでシャッフル
することができます
String tmp[];
for(int i=0; i<question.length; i++){ //先頭から順番に繰り返す
k = (int)(Math.random()*question.length);//入れ替える番号をランダムに求める
//問題文を入れ替える
tmp = question[i];
question[i] = question[k];
question[k] = tmp;
}
ランダムに使用する問題数だけ選ぶのであればArrayListを
使用すると便利です。
ArrayList#contains()メソッドを使用することで要素の重複を
確認できます。
また2つのArrayListを用意して一方からもう一方へ要素を
移すという方法も考えられます。
ArrayList#remove()で一度選んだものは削除することで
重複しないようにできると思います。
この回答への補足
詳しくありがとうございます。
またわかりやすいように、実際のプログラムの例文まで書いていただきありがとうございます。
この例文はquestionの乱数によって順番を入れ替えて、順番がランダムになったquestion[k]が指定されると理解しました。ですので、上記のソースのsetQuestion()メソッドの中に入れれば、うまくいくと思いました。
ですが、問題はランダムに表示されるのですが、重複が起きたり、また出題されている問題と違う答えで認識してしまっています。
この例文を上記のソースのどこに入れたらうまくいくのでしょうか。
またinit()メソッドで最初に一番最初の問題を指定しているのですが、最初もランダムに表示させるにはinit()メソッドを使用しないほうが良いのでしょうか。
知識が乏しくて、質問が多くてすいません。
どうか教えてもらえないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java junit list同士の比較方法
-
【Swing】JPanel クラス外から...
-
JPanelの切り替えと再描画
-
javaで方向キー・特殊キーなど...
-
Javaのレイアウトマネージャに...
-
KeyListenerの使い方について
-
JDialogを閉じた時の処理
-
Enterキーでボタンを押すにはど...
-
ボタンクリック後パネルを再描...
-
4択クイズでのランダム出題の...
-
setColorメソッド の使い方
-
(急募)このフレームにじゃんけ...
-
JavaでのSwingを使った簡易電卓...
-
チェックボックスを動的に生成する
-
Java本格じゃんけんで
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
0dの意味を教えてください
-
JSPでHashMap・配列の変数の値...
-
VB.net 引数で配列変数を渡す際...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
JPanelの切り替えと再描画
-
連番をオブジェクト名の最後に...
-
JPanelの重ね方/OverlayLayout他
-
JavaのswingでCardLayoutの画面...
-
JavaでのSwingを使った簡易電卓...
-
ArrayListの使い方について(初...
-
4択クイズでのランダム出題の...
-
KeyListenerの使い方について
-
JDialogを閉じた時の処理
-
BMI測定を作ろうとしている...
-
TextAreaでの文字の色
-
EXECLの行を削除
-
Java-Swing TextAreaにスクロー...
-
setPrefferedSizeとsetSize
-
【Swing】JPanel クラス外から...
-
最後の行に移動するには?
-
あるコンボボックスを選択する...
-
JButton-背景の透明化
おすすめ情報