

プログラミング初心者です。現在swiftを使って簡単なゲームアプリを作成しておりまして  
そのゲームを簡単に説明しますと  
画面内に五つのボタン（オブジェクト）がありましてそれをタップすれば当たりの場合、当たりの音声が流れ、ハズレの場合にはハズレの音声と画像が表示されゲームオーバーになるという仕様にしたいのです。（黒ひげ危機一発みたいなものです。）  
ハズレは５つのボタンのうち１つがランダムで設定されます。

ボタンを押すと音声が流れるところまではできていますが、ボタンに当たりハズレの概念がないため  
ただの音声を再生するための物となっております。

実装したい機能  
ボタンに当たりハズレの概念を設け、ハズレの場合にハズレ用の音声と画像が同時に出力される。

ご回答のほどよろしくお願いします。

[code]

    import UIKit
    
    import AVFoundation
    class ViewController: UIViewController {
    var player:AVAudioPlayer!
    var doll:AVAudioPlayer!
    //起動時からなるBGM
    func play(soundName:String){
        let url=NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent(soundName)
        do{
            try player = AVAudioPlayer(contentsOfURL:url)
            player.numberOfLoops = -1
            player.prepareToPlay()
            player.play()
        }
        catch{
            print("エラーです")
        }      
    }    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        play("BGM2.mp3")
    
    }
    
     //ボタン（doll）を押した時になる音
    
    @IBAction func dolltapped(sender:UIButton){
    
        switch sender.tag {
    
        case 1:
            print("日本人形\(sender.tag)")
            let path = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("gyaa.wav")
            do{
                try doll=AVAudioPlayer(contentsOfURL: path)
                doll.prepareToPlay()
                doll.play()
            }catch{
                print("エラーです")
    
            }
    
    
        case 2:
            print("日本人形\(sender.tag)")
            let path = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("gyaa.wav")
            do{
                try doll=AVAudioPlayer(contentsOfURL: path)
                doll.prepareToPlay()
                doll.play()
            }catch{
                print("エラーです")
            }
    
        case 3:
            print("日本人形\(sender.tag)")
            let path = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("gyaa.wav")
            do{
                try doll=AVAudioPlayer(contentsOfURL: path)
                doll.prepareToPlay()
                doll.play()
            }catch{
                print("エラーです")
            }
        case 4:
            print("日本人形\(sender.tag)")
            let path = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("gyaa.wav")
            do{
                try doll=AVAudioPlayer(contentsOfURL: path)
                doll.prepareToPlay()
                doll.play()
            }catch{
                print("エラーです")
            }
        case 5:
            print("日本人形\(sender.tag)")
            let path = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("gyaa.wav")
            do{
                try doll=AVAudioPlayer(contentsOfURL: path)
                doll.prepareToPlay()
                doll.play()
            }catch{
                print("エラーです")
            }
    
            default:
            print("どのボタンでもありません")
        }
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }  
    }
    
[/code]


CC BY-SA 3.0
2016-04-04T21:05:29.767
23747
2016-04-05T00:32:43.193
2016-04-04T23:27:37.340
15041
15041
question
ios swift
ボタンに当たり外れの概念を設ける。


ご質問にある内容をとりあえず最小限の修正でコード化するとこうなるかなというのを書いてみました。

[code]

    class ViewController: UIViewController {
        var player:AVAudioPlayer!
        var doll:AVAudioPlayer!
        //ハズレ音用のAVAudioPlayer
        var hazurePlayer: AVAudioPlayer!
        //ハズレ時に表示する画像
        @IBOutlet weak var hazureImage: UIImageView!
    
        //起動時からなるBGM
        func play(soundName:String){
            let url = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent(soundName)
            //設定ミスがあってサウンドリソースがなければcrashしても良い(デバッグですぐ見つかるはず)のでtry!を使う
            try! player = AVAudioPlayer(contentsOfURL:url)
            player.numberOfLoops = -1
            //AVAudioPlayerのplay()を呼ぶ直前にprepareToPlay()を呼んでも意味はありません
            player.play()
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            play("BGM2.mp3")
            //最初のハズレ設定
            setupHazure()
            //サウンドの設定はviewDidLoad()の中でやっておくと再生開始までの遅延が少なくなります
            let url = NSBundle.mainBundle().URLForResource("gyaa", withExtension: ".wav")!
            try! doll = AVAudioPlayer(contentsOfURL: url)
            doll.prepareToPlay()
            let hazureURL = NSBundle.mainBundle().URLForResource("hazure", withExtension: ".wav")!
            try! hazurePlayer = AVAudioPlayer(contentsOfURL: hazureURL)
            hazurePlayer.prepareToPlay()
        }
    
        private var hazureTag = 0
        func setupHazure() {
            //arc4random_uniform(5)の結果は0...4なので+1して1...5にする
            hazureTag = Int(arc4random_uniform(5)) + 1
        }
    
        @IBAction func dolltapped(sender:UIButton){
            print("日本人形\(sender.tag)")
            if sender.tag != hazureTag {
                doll.play()
            } else {
                hazurePlayer.play()
                hazureImage.hidden = false
            }
        }
    }
    
[/code]

いくつか前提:  
(1) ハズレ用のサウンドは`hazure.wav`と想定しています。  
(2)
ハズレ用の画像はInterfaceBuilderでUIImageViewをstoryboard内に置き、初期状態で非表示になるよう`hidden`にチェックを入れておき、@IBOutletに紐付けておく、と言う使い方です。  
(3) ボタンごとに当たりの場合のサウンドを変える必要がないのなら、switch-
caseで全部のボタンを区別する必要はないはずなので、当たりハズレを判定するだけのif文に置き換えました。

**一番肝心の「ボタンに当たりハズレの概念を設け」の部分**
ですが、元のコードのように5つのボタンがtagの値で区別できるようになっているのなら、当たりハズレもtagで区別できるようにすれば良いと言うことに「ハズレは５つのボタンのうち１つがランダムで設定」と言う要件を合わせ、`setupHazure()`メソッドのようにしてみました。

実際のアプリでは、サウンドの再生中はボタンを押せなくしたり、どこかのタイミングで「次」(次の問題?次の画面?)に進んだり、適当なタイミングでハズレ画像を消してゲームオーバー処理をしたり、あるいはハズレ画像の表示にもっと効果をつけたり、などと言ったことが必要になってくるかと思いますが、アプリ作成が順調に進んで必要になったところで(どんな動作が具体的に必要か、人に説明できる程度にまで固まったところで)別スレを立ててご質問された方が良いと思います。(この回答そのものについてわからないところは、この回答へのコメント等でお知らせください。)

ちなみにコードの整形方法ですが、この回答の場合、「Xcodeから丸ごとコピペ」「コピペした範囲をマウスドラッグ等で丸ごと選択」「その状態で編集領域の`{}`アイコンをクリック」で実行したものです。貼り付けたテキストの内容によってはうまくいかない時もありますが、ご参考までに。


CC BY-SA 3.0
2016-04-05T00:32:43.193
23748
2016-04-05T00:32:43.193
13972
23747
answer