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

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

ただいまの
回答率

90.35%

  • Swift

    9406questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iPhone

    1150questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

  • 配列

    656questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • タッチパネル

    5questions

    タッチパネルとは、画面に指やペンで直接触れてコンピューターを操作する電子機器のことです。表示装置と入力装置の2つの機能を組み合わせたデバイスです。

配列を使って複数個の問題(newQuestion)を作たいのですがわかりません

受付中

回答 1

投稿 編集

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

a2201416

score 6

初めまして。
長文失礼します。
swiftではじめるiPhone開発の教科書(森 巧尚)を参考にさせて頂いて、色と音を使ったアプリケーションを作成しています。
swift初心者で、何も分からずにプログラムを書いているので、おかしなプログラムになっていると思います。
すみません。

上記に書いているように「色と音を使ったアプリケーション(ゲーム)」を作成しています。
色と音は「ド=赤」「レ=オレンジ」「ミ=黄色」「ファ=緑」「ソ=水色」「ラ=青」「シ=紫」といったような対応関係になっています。
1つだけ異なる色のボールをタッチをすると消える、といった形にしています。

今はランダムで色のついたボールが出現するようになっていますが、これを1曲の曲になるようにボールを出現させたいと思っています。
(例:ドレミの歌
ドレ→ミ→ファ→ミ→レ→ド・・・→ミ→レ→ド(終了)
の順に対応した色のボールが落ちてくる(「→=タッチ」です))

「questionNo = randomSource.nextIntWithUpperBound(correct.count)」の部分のランダムを配列にすればいいのではないかと試行錯誤してみましたがわかりませんでした。

説明が下手で申し訳ございません。
よろしくお願いします。

import SpriteKit
import GameplayKit
import AVFoundation

class GameScene: SKScene {

    // ランダムを使う準備をします
    let randomSource = GKARC4RandomSource()
    // 間違い番号の変数を用意します
    var mistakeNo = 0

    // メッセージを表示するラベルノードを作ります
    let msgLabel = SKLabelNode(fontNamed: "HiraKakuProN-W3")
    var msg:String = "違う色をタッチしよう"
    // 漢字を入れるボール数を6個にします
    let ballMax = 6
    // ボールを入れておく配列を用意します
    var ballList:[SKShapeNode] = []

    // 問題を配列で用意します
    let correct = [
        SKColor.redColor(),SKColor.orangeColor(),SKColor.yellowColor(),SKColor.greenColor(),
        SKColor.cyanColor(),SKColor.blueColor(),SKColor.magentaColor()]

    // 問題の番号の変数を用意します
    var questionNo = 0

    override func didMoveToView(view: SKView) {
        // 物理シミュレーション空間サイズを作ります
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

        // 背景を白にします
        self.backgroundColor = UIColor.whiteColor()
        // メッセージラベルを表示します
        msgLabel.text = msg
        msgLabel.fontSize = 36
        msgLabel.fontColor = UIColor.blackColor()
        msgLabel.position = CGPoint(x: 320, y: 1080)
        self.addChild(msgLabel)

        // 次の問題を出題します
        newQuestion()
    }

    // 出題するメゾッド
    func newQuestion(){
        // 問題番号を決めます
        questionNo = randomSource.nextIntWithUpperBound(correct.count)

        // 間違い番号をランダムに決めます
        mistakeNo = ballMax - 1

        // ボールの配列をリセットします
        ballList = []

        // ballMax個のボールを作ります
        for loopID in 0..<ballMax - 1{
            // ボールをシュープノードで作ります
            let ball = SKShapeNode(circleOfRadius: 45)
            ball.fillColor = UIColor(red: 1.0, green: 0.9, blue: 0.6, alpha: 1.0)
            ball.position = CGPoint(x: loopID * 100 + 70, y: 1000)

            // シーンに表示します
            self.addChild(ball)

            // ボールの配列に追加します
            ballList.append(ball)

            // ボールを画面の上の方にランダムに配置します
            let wx = randomSource.nextIntWithUpperBound(440) + 100
            let wy = randomSource.nextIntWithUpperBound(200) + 800
            ball.position = CGPoint(x: wx, y: wy)

            // 円の物理シミュレーション物体を作って結びつけます
            ball.physicsBody = SKPhysicsBody(circleOfRadius: 45)

            // ボールの反発力を少し上げます
            ball.physicsBody?.restitution = 0.3
        }

        for loopID in 0...0{
            // ボールをシュープノードで作ります
            let mball = SKShapeNode(circleOfRadius: 45)

            mball.fillColor = correct[questionNo]
            mball.position = CGPoint(x: loopID * 100 + 70,y: 1000)
            // シーンに表示します
            self.addChild(mball)

            // ボールの配列に追加します
            ballList.append(mball)

            // ボールを画面の上の方にランダムに配置します
            let wx = randomSource.nextIntWithUpperBound(440) + 100
            let wy = randomSource.nextIntWithUpperBound(200) + 800
            mball.position = CGPoint(x: wx, y: wy)

            // 円の物理シミュレーション物体を作って結びつけます
            mball.physicsBody = SKPhysicsBody(circleOfRadius: 45)

            // ボールの反発力を少し上げます
            mball.physicsBody?.restitution = 0.3

        }

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){
        // 1つのタッチ情報を取り出します
        for touch in touches {
            // タッチした位置にあるノードを全て調べます
            let location = touch.locationInNode(self)
            let touchNodes = self.nodesAtPoint(location)
            // ノード1つ1つについて調べます
            for tNode in touchNodes {
                // ボールの配列と比較して
                for loopID in 0..<ballMax {
                    // タッチしたノードとボールが同じなら
                    if tNode == ballList[loopID] {
                        print("ボール\(loopID)をタッチしました")
                        // print("ボール\()をタッチしました")
                        answerCheck(loopID)
                        break
                    }
                }
            }
        }
    }

    // チェックメソッド
    func answerCheck(No:Int) {
        // 番号が間違い番号なら正解、そうでないなら不正解を表示します
        if No == mistakeNo {
            if correct[questionNo] == correct[0] {
                // 効果音データの作成(ド=赤)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("1do.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[1] {
                // 効果音データの作成(レ=オレンジ)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("2re.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[2] {
                // 効果音データの作成(ミ=黄色)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("3mi.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[3] {
                // 効果音データの作成(ファ=緑)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("4fa.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[4] {
                // 効果音データの作成(ソ=水色)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("5so.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[5] {
                // 効果音データの作成(ラ=青)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("6ra.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            if correct[questionNo] == correct[6] {
                // 効果音データの作成(シ=紫)
                let mySoundAction: SKAction = SKAction.playSoundFileNamed("7si.mp3", waitForCompletion: true)
                // 再生アンクション
                self.runAction(mySoundAction);
            }
            msg = "正解!"
            // 画面上のボールを削除します
            for loopID in 0..<ballMax {
                ballList[loopID].removeFromParent()
            }
            // 次の問題を出題します
            newQuestion()
        }
        else{
            msg = "不正解!"
        }
        msgLabel.text = msg
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • t_obara

    2016/02/25 10:42

    課題をもう少し明確にしていただけると良いかと思います。
    「1曲の曲になるようにボールを出現させたい」のでしょうか?

    キャンセル

  • a2201416

    2016/02/25 17:36

    こんにちは。ご指摘ありがとうございます!
    そうです。「出現する6個のうち1個だけ違う色で、その色をタッチすると色に対応する音が鳴り、次の問題(6個のボール)に移行する」という流れにしたいと考えています。

    キャンセル

  • t_obara

    2016/02/25 18:03

    「出現する6個のうち1個だけ違う色にする」のはできているのですか?
    「その色をタッチすると色に対応する音が鳴り」はできているのですか?
    「次の問題に移行する」の部分がよくわかりません。一個のボールにつき一つの音名(ドとかミとか)にあった音がなるのですよね。曲と問題との関係がイマイチわかりません。

    キャンセル

回答 1

0

「questionNo = randomSource.nextIntWithUpperBound(correct.count)」の部分のランダムを配列にすればいいのではないかと試行錯誤してみましたがわかりませんでした。

こういう時は、その試行錯誤してみた内容を提示して質問しないと、「やってほしいことだけを記載した丸投げの質問」と取られかねませんので注意してください。どんなことを試したかを書けば、何が誤っているか指摘しやすいので回答が得られやすくなるはずです。

今回の質問は、randomSource.nextIntWithUpperBoundでランダムの数値(=音階番号)を取得していたのを
あらかじめ配列に音階番号の並びを入れておいて、それを順番に取り出したいという質問だと理解しました。
であれば、例えば
var questionNo = 0
の次に
var questionList:[Int] = [0,1,2,3,2,1,0] //ドレミファミレド
を追加し、
questionNo = randomSource.nextIntWithUpperBound(correct.count)
の替わりに
questionNo = questionList.removeAtIndex(0)
とすればよいと思います。

こういうのは配列を使うことがわかっていて、Swiftの配列の使い方がわかっていれば簡単にできるレベルの内容です。Swiftの配列の使い方についてちゃんと理解できていないのだと思いますので、回答をもらって満足するのではなく、プログラミングの勉強をしっかりすることをお勧めします。
ちなみに上記の回答だけだと、配列に入っている音階番号を全部取り出した後の処理が入っていないので、最後に落ちます。そのあたりはあえて回答しませんでしたので自分で考えてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Swift

    9406questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iPhone

    1150questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

  • 配列

    656questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • タッチパネル

    5questions

    タッチパネルとは、画面に指やペンで直接触れてコンピューターを操作する電子機器のことです。表示装置と入力装置の2つの機能を組み合わせたデバイスです。