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

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

ただいまの
回答率

88.58%

四択クイズの正誤判定をString型の引数とフラグを使って行いたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 885

Seraphim_9

score 17

 正誤判定を正しく行いたい

Swiftを用いで四択クイズのアプリを作成しています。非常に初歩的な質問で申し訳ないのですが、正解の判定をしようとした時、正しく判定されない(appDelegateにbadという不正解を示すフラグがあるのですがそれがデフォルトのtrueのまま更新されなかったり、正解でないところで正解の判定をする事が多い)状況となっています。調べて見ましたが同じ方法を取っている所は見当たらず、teratailを当たらせていただきました
わたしのやり方がまずいのでしょうか、それともソースコードに論理エラーがあるのでしょうか。ご教授いただけると幸いです。

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

正誤判定の際、判定が正しく行われません。
初期値のまま不正解かどうかを示すflag"bad"が更新されません。
更新されても正しくないところで判定がなされています。

 該当のソースコード

 func judge(answer :String){                     //回答の判定はここ
        let appDelegate = UIApplication.shared.delegate as! AppDelegate //AppDelegateのインスタンスを取得
        if answer == correct{                      
 // answer(ボタンの文章) がcorrectと等しいか
            appDelegate.seikai = appDelegate.seikai + 1     
//正解なので正解数を1加算する 変数はInt型"seikai"
            appDelegate.bad = false
        }else {                                     
//不正解なら不正解判定だけして戻る
            appDelegate.bad = true
        }
    }

    @IBAction func select1(_ sender: UIButton) {                        //1番を回答した時呼ばれる
        let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate //AppDelegateのインスタンスを取得

        appDelegate.counter = appDelegate.counter + 1                       //現在の問題数を計算
        let storyboard: UIStoryboard = self.storyboard!
        let v5 = storyboard.instantiateViewController(withIdentifier: "v5") 
//"ViewController5.swift"に遷移する準備
        self.present(v5,animated: true, completion: nil)
        judge(answer: (sentaku1.titleLabel?.text)!)                         //judge: (answer: String)を呼び出し、引数にはボタンに表示されている文章を設定する(読み込みもとのリソースが正解を文字で表示している為)
    }

 試したこと

・switch case文に置き換えてみましたが等しいことを示す事ができず失敗しました
・badの初期値を変えてみましたが先程の状態が続くのみです

 補足情報(FW/ツールのバージョンなど)

OS:macOS High Sierra
IDE:Xcode10
Programming Language:Swift 4.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/10/25 12:47

    「正しく判定されない」とか「正解でないところで正解の判定をする」というのは遷移先での判定時のことでしょうか?もしそうなら遷移先で判定している箇所のコードを書いて下さい。

    キャンセル

  • Seraphim_9

    2018/10/29 09:49 編集

    いえ、遷移先で行なっているのは正解不正解に応じた「正解です」「不正解です」のような表示のみで、判定はこちらのコードで全て行っています。遷移先に書いてあるコードは「フラグが正解なら正解であることを表示しそうでなければ不正解であることを表示しなさい」というようなことのみでそのほかは書かれていません。

    キャンセル

  • fuzzball

    2018/10/29 10:10

    いや、クイズの正解/不正解の判定のことではなくて(それはjudgeでやっているので見ればわかります)、あなたが「正しく判定されない」と書いているのは、質問に書いているコード上でのことなのか、遷移先(v5)でのことなのか、という質問です。

    キャンセル

  • fuzzball

    2018/10/29 10:12

    あぁ、解決してた‥。

    キャンセル

回答 3

+2

まずはprintデバッグしてみるといいかもです。
judgeの中ではフラグに値入っていると思います

if answer == correct{                      
 // answer(ボタンの文章) がcorrectと等しいか
            appDelegate.seikai = appDelegate.seikai + 1     
//正解なので正解数を1加算する 変数はInt型"seikai"
            appDelegate.bad = false
            print(appDelegate.bad)
        }else {                                     
//不正解なら不正解判定だけして戻る
            appDelegate.bad = true
            print(appDelegate.bad)
        }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

ブレークポイントをjudgeメソッドの最初のほうにつけて実行されているか確認してください。
presentの後にjudge()を呼び出しているのですでに画面は遷移後であり、judgeが呼び出されていない気がします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/25 12:12

    試してみたところ、初期値のままということはなくなりました。
    しかし、最後の問題のみ正しい選択肢で判定されません
    正解を選択したのに不正解だと判定されてしまいます
    なおソースコードに対する変更はjudgeの位置のみで、それ以外の変更はありません

    キャンセル

  • 2018/10/25 12:16

    念のため、if文でanswer==correctする直前でanswer、correctそれぞれをprintし、思い通りの内容か確認してみてください

    キャンセル

check解決した方法

0

選択肢や回答などを格納したCSVファイルのデータに入るべきでないところでスペースが入っていたのが原因でした。また、最初の回答にもあったように、judge(answer)の位置が適切でなかったのも原因の一つでした。初歩的な質問でしたが真剣にご回答いただき有難うございました

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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