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

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

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

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

iPhone

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

タッチパネル

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

配列

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

Q&A

1回答

1788閲覧

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

a2201416

総合スコア8

Swift

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

iPhone

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

タッチパネル

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

配列

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

0グッド

0クリップ

投稿2016/02/24 13:59

編集2016/02/25 09:19

初めまして。
長文失礼します。
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 */ }

}

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

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

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

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

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

t_obara

2016/02/25 01:42

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

2016/02/25 08:36

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

2016/02/25 09:03

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

回答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の配列の使い方についてちゃんと理解できていないのだと思いますので、回答をもらって満足するのではなく、プログラミングの勉強をしっかりすることをお勧めします。
ちなみに上記の回答だけだと、配列に入っている音階番号を全部取り出した後の処理が入っていないので、最後に落ちます。そのあたりはあえて回答しませんでしたので自分で考えてみてください。

投稿2016/02/25 17:42

TakeOne

総合スコア6299

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問