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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

5732閲覧

QUIZアプリでランダムに問題を出す方法

kimura

総合スコア59

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2015/10/11 12:54

下記のコードで問題を15問作りました。
そのうち15問中10問だけクイズを出したいときはどのように書き換えれば宜しいでしょうか?
また、出題の順番もランダムで出したいと思っております。
大変分かりにくくて申し訳ありませんが回答いただけますと助かりますので宜しくお願い致します。

・java

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class MyQuiz extends ActionBarActivity {

public final static String EXTRA_MYSCORE = "com.example.taguchi.myquizapp.MYSCORE"; private ArrayList<String[]> quizSet = new ArrayList<String[]>(); private TextView scoreText; private TextView qText; private Button a0Button; private Button a1Button; private Button a2Button; private Button nextButton; private int currentQuiz = 0; private int score = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_quiz); loadQuizSet(); getViews(); setQuiz(); } private void showScore() { scoreText.setText("Score: " + score + " / " + quizSet.size()); } private void setQuiz() { qText.setText(quizSet.get(currentQuiz)[0]); ArrayList<String> answers = new ArrayList<String>(); for (int i = 1; i <= 3; i++) { answers.add(quizSet.get(currentQuiz)[i]); } Collections.shuffle(answers); a0Button.setText(answers.get(0)); a1Button.setText(answers.get(1)); a2Button.setText(answers.get(2)); a0Button.setEnabled(true); a1Button.setEnabled(true); a2Button.setEnabled(true); nextButton.setEnabled(false); showScore(); } public void checkAnswer(View view) { // answer? Button clickedButton = (Button) view; String clickedAnswer = clickedButton.getText().toString(); // judge if (clickedAnswer.equals(quizSet.get(currentQuiz)[1])) { clickedButton.setText("◯ " + clickedAnswer); score++; } else { clickedButton.setText("× " + clickedAnswer); } showScore(); // button a0Button.setEnabled(false); a1Button.setEnabled(false); a2Button.setEnabled(false); nextButton.setEnabled(true); // next quiz currentQuiz++; if (currentQuiz == quizSet.size()) { nextButton.setText("Check result"); } } public void goNext(View view) { if (currentQuiz == quizSet.size()) { // show result Intent intent = new Intent(this, MyResult.class); intent.putExtra(EXTRA_MYSCORE, score + " / " + quizSet.size()); startActivity(intent); } else { setQuiz(); } } @Override public void onResume() { super.onResume(); nextButton.setText("Next"); currentQuiz = 0; score = 0; setQuiz(); } private void getViews() { scoreText = (TextView) findViewById(R.id.scoreText); qText = (TextView) findViewById(R.id.qText); a0Button = (Button) findViewById(R.id.a0Button); a1Button = (Button) findViewById(R.id.a1Button); a2Button = (Button) findViewById(R.id.a2Button); nextButton = (Button) findViewById(R.id.nextButton); } private void loadQuizSet() { InputStream inputStream = null; BufferedReader bufferedReader = null; try { inputStream = getAssets().open("quiz.txt"); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s; while ((s = bufferedReader.readLine()) != null) { quizSet.add(s.split("\t")); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (inputStream != null) inputStream.close(); if (bufferedReader != null) bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } }

}

・txt

what is A? A0 A1 A2
what is B? B0 B1 B2
what is C? C0 C1 C2
what is D? D0 D1 D2
what is E? E0 E1 E2
what is F? F0 F1 F2
what is G? G0 G1 G2
what is H? H0 H1 H2
what is I? I0 I1 I2
what is J? J0 J1 J2
what is K? K0 K1 K2
what is L? L0 L1 L2
what is M? M0 M1 M2
what is N? N0 N1 N2
what is O? O0 O1 O2

・xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".MainQuiz">

<TextView android:id="@+id/scoreText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" /> <TextView android:id="@+id/qText" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:gravity="center" android:textSize="32sp" android:textStyle="bold" /> <Button android:id="@+id/a0Button" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="checkAnswer" /> <Button android:id="@+id/a1Button" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="checkAnswer" /> <Button android:id="@+id/a2Button" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="checkAnswer" /> <Button android:id="@+id/a3Button" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="checkAnswer" /> <Button android:id="@+id/nextButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="goNext" android:layout_gravity="right" android:layout_marginTop="8dp" android:text="@string/next_button" />
</LinearLayout>

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

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

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

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

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

guest

回答2

0

java.util.Collectionsクラスのshuffle(List)メソッドを利用してはいかがでしょうか?

このメソッドでquizSetをシャッフルしたリストを作成し、最初の10個の要素を取り出せば、重複なくランダムに出題できると思います。

https://docs.oracle.com/javase/jp/6/api/java/util/Collections.html#shuffle(java.util.List)

投稿2015/10/11 14:43

編集2015/10/11 14:48
KiyoshiMotoki

総合スコア4791

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

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

kimura

2015/10/11 14:52

ご回答ありがとうございます。 ↓↓こういうことですか?   重複してしまいました(涙)   private void setQuiz() { java.util.Collections.shuffle(quizSet);
KiyoshiMotoki

2015/10/11 15:17

よく見たら回答のシャッフルに、すでに使っていましたね。 setQuiz メソッド内部ではなく、 loadQuizSet メソッド内部の、while文の直後に Collections.shuffle(quizSet) を追加してください。 これで quizSet の各要素がシャッフルされるので、出題するときは先頭から順番に要素を取り出すだけで、ランダムに出題できることになります。
kimura

2015/10/11 15:34

何度も回答してくださってありがとうございます。 おかげさまでシャッフルされて問題が出るようになりましたが、10問終了後再度playすると前回と同じ問題が順番に出ます。 何度も失礼ですが再度クイズをした場合にもランダムにすることは出来るのでしょうか? 何卒宜しくお願い致します。
kimura

2015/10/11 15:43

おかげさまで完璧に出来ました。 お世話になったのにベストアンサーにせず申し訳ありません。 ありがとうございました。
guest

0

ベストアンサー

  • 基本方針
  1. 問題の入っているquizSetを,最初の出題前にシャッフルする.途中でやっているanswerのシャッフルと同じ方法で構わない.
  2. nextButtonを押したタイミングでcurrentQuizが10なら終了する.
  • 現状の問題点

各ButtonにOnClickLisnerをセットしていないため,現段階ではどのButtonを押しても何も起こらない

ある程度コードを書いてみます.

java

1//クリックリスナーを実装 2public class MyQuiz extends ActionBarActivity implements View.OnClickListener{ 3 4 public final static String EXTRA_MYSCORE = "com.example.taguchi.myquizapp.MYSCORE"; 5 private ArrayList<String[]> quizSet = new ArrayList<String[]>(); 6 7 private TextView scoreText; 8 private TextView qText; 9 private Button a0Button, a1Button, a2Button; 10 private List<Button> buttons; //Buttonごとの操作をまとめてするためリスト化 11 private Button nextButton; 12 13 private int currentQuiz = 0; 14 private int score = 0; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_my_quiz); 20 21 loadQuizSet(); 22 23 Collections.shuffle(quizSet); //問題セットはこのタイミングで1度だけシャッフルする 24 25 getViews(); 26 27 setQuiz(); 28 } 29 30 private void showScore() { 31 scoreText.setText("Score: " + score + " / " + quizSet.size()); 32 } 33 34 private void setQuiz() { 35 qText.setText(quizSet.get(currentQuiz)[0]); 36 37 ArrayList<String> answers = new ArrayList<String>(); 38 for (int i = 1; i <= 3; i++) { 39 answers.add(quizSet.get(currentQuiz)[i]); 40 } 41 Collections.shuffle(answers); 42 43 //解答Buttonに個別にしていた設定をListとforを使ってまとめて記述 44 for(int i = 0; i < answers.size(); i++){ 45 Button button = buttons.get(i); 46 button.setText(answers.get(i)); 47 button.setEnabled(true); 48 } 49 50 nextButton.setEnabled(false); 51 52 showScore(); 53 } 54 55 //ボタンクリック時の動作を実装 56 @Override 57 public void onClick(View view){ 58 //クリックされたのが解答ボタンのどれかだった場合は解答の判定 59 if(buttons.contains(view)) 60 checkAnswer(view); 61 62 //nextButtonがクリックされたら次の問題への処理 63 else if(view == nextButton) 64 goNext(view); 65 } 66 67 public void checkAnswer(View view) { 68 69 //判定に関してはそのままでいい 70 71 // ここの操作もforで書き換え 72 for(Button button : buttons){ 73 button.setEnabled(false); 74 } 75 nextButton.setEnabled(true); 76 77 // next quiz 78 currentQuiz++; 79 80 if (currentQuiz == quizSet.size()) { 81 nextButton.setText("Check result"); 82 } 83 } 84 85 public void goNext(View view) { 86 //「10問目まで」ならここを10に書き換えればよい 87 if (currentQuiz == 10) { 88 // show result 89 Intent intent = new Intent(this, MyResult.class); 90 intent.putExtra(EXTRA_MYSCORE, score + " / " + quizSet.size()); 91 startActivity(intent); 92 } else { 93 setQuiz(); 94 } 95 } 96 97 @Override 98 public void onResume() { 99 //変更不要なので省略 100 } 101 102 private void getViews() { 103 104 //各View,Buttonを取得する記述(もとと同じでいいので省略) 105 106 buttons = Arrays.asList(a0Button, a1Button, a2Buttons); //Buttonをリスト化 107 //各Buttonにクリックリスナを設定 108 for(Button button : buttons){ 109 button.setOnClickListener(this); 110 } 111 nextButton.setOnClickListener(this); 112 } 113 114 private void loadQuizSet() { 115 //ここは変更しなくていいので省略 116 } 117}

投稿2015/10/11 13:19

編集2015/10/11 15:09
swordone

総合スコア20649

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

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

kimura

2015/10/11 14:02

すいません。修正前のを出してしまいました。 回答ありがとうございます。 1.はanswerと同じ方法でやったのですが、15問中同じ問題が何度か出てしまって消してしまいました。 2・のタイミングは分からなくて書けませんでした。
kimura

2015/10/11 15:33

何度もありがとうございます。 スッキリするソースで分かりやすかったです。 おかげさまで2は出来ました。 1もシャッフルされて問題が出るようになりましたが、10問終了後再度playすると前回と同じ問題が順番に出ます。 何度も失礼ですが再度クイズをした場合にもランダムにすることは出来るのでしょうか? 何卒宜しくお願い致します。
swordone

2015/10/11 15:38 編集

要するに10問終わってIntentで遷移した先の画面から戻ってきた時,ということでしょうか? だとすれば問題シャッフルのメソッドをonResumeのsetQuizの前に移動させるとできると思います.
kimura

2015/10/11 15:42

出来ました。 最後までありがとうございます。 しつこくてすいませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問