🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

1661閲覧

クイズアプリで回答ボタン配置を固定して正誤判定をして、クイズごとに違う音声も鳴らしたい

kubonos

総合スコア6

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/12/16 12:59

編集2019/12/17 03:56

andoroid Studioでクイズアプリを作っています。

【具体的にアプリに欲しい挙動】

具体的に作りたいのは、幼児用の英語の数字を覚えるアプリなのですが

問題:oneはどれ?
プレイヤー回答:1!
画面:正解!
音声"one.wav"再生:「♪ワンは1だよ♪」

問題:threeはどれ?
プレイヤー回答:3!
画面:正解!
音声"three.wav"再生:「♪スリーは3だよ♪」

問題:twoはどれ?
プレイヤー回答:3!
画面:不正解!
音声"two.wav"再生:「♪トゥーは2だよ♪」

問題:nineはどれ?
プレイヤー回答:9!
画面:正解!
音声"nine.wav"再生:「♪ナインは9だよ♪」

同じようにランダムに問題を出題

結果発表!
20問中17問正解!!

という挙動をするアプリを作りたいです。

回答ボタンの配置を「1,2,3,4,5,6,7,8,9」と固定して、クイズアプリを作りたいのですが、やり方が分かりません。

【現況】

今は、ネットに載っている、四択クイズの、回答ボタンをシャッフルするやり方で作っています。

String quizData[][] = {
//{"画像名","正解","選択2","選択3","選択4"},
{"one","1","2","3","4"},
{"two","2","1","3","4"},

で、正解を最初に書き、選択肢をシャッフル
Collections.shuffle(quiz);
して並べているのですが、

答えボタンを、
1,2,3,4
と固定の順番で並べて、
oneが出てきたら、1で正解
twoが出てきたら、2で正解

と回答ボタンを完全に固定して動かすには、どのようにしたらよろしいでしょうか?

今の状態だと、回答ボタンが
4,3,1,2
1,3,2,4
2,3,4,1
などとコロコロ変わって、ただ見ずらいです。

最終的には9個の回答ボタンを実装して、問題数20個程度のクイズアプリを作りたいのですが・・。

クイズの正解を、音声で流すことをどうしてもしたくて、その条件をどのように書いていけば良いのかわからずに悩んでいます。

良いやり方をご教授願えますと幸いです。

よろしくお願いいたします。

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

エラーメッセージは特にありません。

<ソースコードのすべて>

package com.vjoutatu.doremijava;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private TextView countLabel;

    private ImageView questionImage;

    //private TextView questionLabel;
private Button answerBtn1;
private Button answerBtn2;
private Button answerBtn3;
private Button answerBtn4;

    private String rightAnswer;
private int rightAnswerCount = 0;
private int quizCount = 1;
static final private int QUIZ_COUNT = 2; //全部の出題数を入れるのだ!!

    ArrayList<ArrayList<String>> quizArray = new ArrayList<>();

    String quizData[][]  = {
//{"画像名","正解","選択2","選択3","選択4"},

{"one","1","2","3","4"},
{"two","2","1","3","4"},           {"three","3","2","1","4"},             {"four","4","2","3","1"},

    };

    //Sound
private  SoundPlayer soundPlayer;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

        soundPlayer = new soundPlayer;

        countLabel = findViewById(R.id.countLabel);
questionImage = findViewById(R.id.questionImage);
answerBtn1 = findViewById(R.id.answerBtn1);
answerBtn2 = findViewById(R.id.answerBtn2);
answerBtn3 = findViewById(R.id.answerBtn3);
answerBtn4 = findViewById(R.id.answerBtn4);

        //quizDataからクイズ出題用のquizArrayを作成する
for (int i = 0; i < quizData.length; i++) {

            //新しいArrayListを用意
ArrayList<String> tmpArray = new ArrayList<>();
//クイズデータを追加
tmpArray.add(quizData[i][0]); //画像名
tmpArray.add(quizData[i][1]); //正解
tmpArray.add(quizData[i][2]); //選択2
tmpArray.add(quizData[i][3]); //選択3
tmpArray.add(quizData[i][4]); //選択4

            //tmpArrayをquizArrayに追加する
quizArray.add(tmpArray);
}

        showNextQuiz();

    }

    public void showNextQuiz() {
//クイズカウントラベルを更新
countLabel.setText("Q" + quizCount);

        //ランダムな数字を取得
Random random = new Random();
int randomNum = random.nextInt(quizArray.size());

        //randomNumを使ってquizArrayからクイズを一つ取り出す
ArrayList<String> quiz = quizArray.get(randomNum);

        //画像をセットする
questionImage.setImageResource(
getResources().getIdentifier(quiz.get(0), "drawable", getPackageName())
);

        //正解をrightAnswerにセット
rightAnswer = quiz.get(1);

        //クイズ配列から画像名を削除
quiz.remove(0);

        //正解と選択肢3つをシャッフル
Collections.shuffle(quiz);

        //回答ボタンに正解と選択肢3つをセット
answerBtn1.setText(quiz.get(0));
answerBtn2.setText(quiz.get(1));
answerBtn3.setText(quiz.get(2));
answerBtn4.setText(quiz.get(3));

        //このクイズをquizArrayから削除<消したいけど消すとおかしくなる
quizArray.remove(randomNum);

    }

     public  void checkAnswer(View view){

        //どのボタンが押されたか
Button answerBtn = findViewById(view.getId());

         //ボタンのテキストを取得
String btnText = answerBtn.getText().toString();

         String alertTitle;
if (btnText.equals(rightAnswer)) {
alertTitle = "せいかい!!";
rightAnswerCount++;

     }else {
alertTitle = "まちがっているよ";
}

         //ダイアログを作成
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(alertTitle);
builder.setMessage("こたえは" + rightAnswer + "だよ");
builder.setPositiveButton("つぎへいく", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (quizCount == QUIZ_COUNT){
//結果画面へ移動
Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
intent.putExtra("RIGHT_ANSWER_COUNT", rightAnswerCount);
startActivity(intent);

                 }else {
quizCount++;
showNextQuiz();
}
}
});
builder.setCancelable(false);
builder.show();

    }
}

試したこと

本を色々読んでいるのですが、どのように条件分岐したらよいのか分かりません・・。

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

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

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

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

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

jimbe

2019/12/16 15:57

コードは, ``` で囲まれて書いてある「ソースコード」という文字列を置き換える形にしてください.
jimbe

2019/12/16 15:59

ご提示のコードでは Collections.shuffle(quiz) の quiz 変数がなんなのか分かりません. 妙な一部では無く, 出来るだけ全体をご提示願えますか.
kubonos

2019/12/16 17:53

すみません、先週からandoroidStudioを使いはじめたもので、変数が何なのかも今いち分かっておりません・・。 htmlとcssはある程度分かるのですが、javaはサッパリです・・。 ソースを全体表示にして、具体的に欲しいアプリの挙動を書き直しました。 どうぞよろしくお願いいたします。
jimbe

2019/12/17 04:51

レイアウトの activity_main.xml と, SoundPlayer.java もお願いできますか. 消されてしまいましたが, コードには専用の枠があります. 入力枠の上辺に "<code>" というのがあると思いますが, それを押すとカーソルの位置に ```ここに言語を入力 コード ``` というのが追加されます. "ここに言語を入力" という文字列を "java" や "xml" 等, コードの種類(ファイル名ではありません)に置き換え, "コード" の個所にコードを入力(コピペ)してください. うまくいけば Gonnnn さんの回答のコードのように, 薄い灰色の枠内に表示されます. うまくいったかは, 入力枠の下にプレビューで表示されていますので, ご確認ください.
guest

回答1

0

ベストアンサー

ボタンのテキストをbutton.getText().toString()で取得できるので、ボタンのクリックリスナーに

Java

1@Override 2public void onClick(View v) { 3 if(((Button)v).getText().toString().equals(quizData[問題の番号][1])){ 4 正解時の処理 5 } 6} 7

というふうにしてはどうでしょう
これだとボタンを固定したまま正誤判定できます。

投稿2019/12/16 14:57

Gonnnn

総合スコア52

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

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

kubonos

2019/12/17 01:33

ご回答ありがとうございます! 質問に、やりたいことを書き足しました・・。 ちなみにいただいた記述はどこに挿入すればよろしいのでしょうか? javaを始めて1週間くらい経ちますが、打ち込んでいるだけで、意味は8割くらいわかっていません。 ソースは全文表示してみました。
Gonnnn

2019/12/17 02:18 編集

私が書いた部分はcheckAnswer(View view)に書かれているようなのでそれで大丈夫です! ざっとプログラムを読んだ感じでは、わざわざシャッフルしなくてもkubonosさんがしたい挙動をすると思うでのですが。。 具体的にはxmlの方でanswerBtnに1~4の数字をTextにいれて、 ```java //クイズ配列から画像名を削除 quiz.remove(0); //正解と選択肢3つをシャッフル Collections.shuffle(quiz); //回答ボタンに正解と選択肢3つをセット answerBtn1.setText(quiz.get(0)); answerBtn2.setText(quiz.get(1)); answerBtn3.setText(quiz.get(2)); answerBtn4.setText(quiz.get(3)); ``` をコメントアウトすればできませんか? 正解の音はプレイヤーが正解したときに出せばいいので ```java if (btnText.equals(rightAnswer)) { alertTitle = "せいかい!!"; rightAnswerCount++; ///ここで鳴らす }else { alertTitle = "まちがっているよ"; } ``` でいいのではないでしょうか
kubonos

2019/12/17 04:54

ご丁寧にありがとうございます!! ご指摘の箇所をコメントアウトしたところ、思った通りの挙動になりました!! 本当に申し訳ございませんが、あと一点お伺いできませんでしょうか? 正解の音を one.wav two.wav three.wav... と9種類、クイズによって使い分けたいのですが、その場合はどのように書いていけば良いのか、教えていただけませんでしょうか??
Gonnnn

2019/12/17 09:41

効果音でしたら https://akira-watson.com/android/soundpool.html のSoundPoolの21~40行目を参考にサウンドプールを作ります。 本当はクラス分けするのがいいのでしょうが、まだ始めたてでわからないと思うので、 SoundPoolの配列を作ります。OnCreateでそれぞれのサウンドプールを読み込み、rightAnswer と同じやり方でサウンドプールの変数を作りcheckAnswerで今のクイズのサウンドプールを代入します。そしたら ///ここで鳴らす の部分でplayすれば正解したときに鳴ると思います。
kubonos

2019/12/17 14:41

何度もありがとうございます! ちょっとまだサウンドプールについては理解できていませんが、何とか作っていけそうです! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問