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

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

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

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

Q&A

解決済

1回答

1130閲覧

Thread 1: Fatal error: Index out of range について

hanetomo

総合スコア1

Swift

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

0グッド

0クリップ

投稿2020/11/03 08:21

編集2020/11/03 08:43

前提・実現したいこと

バラバラになった一枚の画像が揃ったところでボタンを押して揃えるゲームを作っています。RUNしてみたところxcodeに戻ってきてしまいました。まだまだ無知なので簡単に教えてもらえると嬉しいです。イメージ説明

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

Thread 1: Fatal error: Index out of range

該当のソースコード

swift

1import UIKit 2 3class GameViewController: UIViewController { 4 5 @IBOutlet var imgView1: UIImageView! 6 @IBOutlet var imgView2: UIImageView! 7 @IBOutlet var imgView3: UIImageView! 8 @IBOutlet var imgView4: UIImageView! 9 @IBOutlet var imgView5: UIImageView! 10 @IBOutlet var imgView6: UIImageView! 11 @IBOutlet var imgView7: UIImageView! 12 13 @IBOutlet var resultLabel: UILabel! 14 15 16 var timer: Timer! 17 var score: Int = 1000 18 let defaults: UserDefaults = UserDefaults.standard 19 20 let width: CGFloat = UIScreen.main.bounds.size.width 21 22 var positionX: [CGFloat] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 23 24 var dx: [CGFloat] = [1.0, 0.5, -1.0] 25 26 func start() { 27 resultLabel.isHidden = false 28 29 timer = Timer.scheduledTimer(timeInterval: 0.005, target: self, 30 selector: #selector(self.up), userInfo: nil, repeats: true) 31 32 timer.fire() 33 34 } 35 36 override func viewDidLoad() { 37 super.viewDidLoad() 38 positionX = [width / 2, width / 2, width / 2, width / 2, width / 2, width / 2, width / 2] 39 self.start() 40 } 41 42 @objc func up() { 43 for i in 0..<7{ 44 if positionX[i] > width || positionX[i] < 0 { 45 dx[i] = dx[i] * (-1) 46 } 47 positionX[i] += dx[i] 48 } 49 imgView1.center.x = positionX[0] 50 imgView2.center.x = positionX[1] 51 imgView3.center.x = positionX[2] 52 imgView4.center.x = positionX[3] 53 imgView5.center.x = positionX[4] 54 imgView6.center.x = positionX[5] 55 imgView7.center.x = positionX[6] 56 } 57 58 @IBAction func stop() { 59 if timer.isValid == true{ 60 timer.invalidate() 61 } 62 for i in 0..<7 { 63 score = score - abs(Int(width/2 - positionX[i]))*2 64 } 65 resultLabel.text = "Score : " + String(score) 66 resultLabel.isHidden = false 67 68 let highScore1: Int = defaults.integer(forKey: "score1") 69 let highScore2: Int = defaults.integer(forKey: "score2") 70 let highScore3: Int = defaults.integer(forKey: "score3") 71 let highScore4: Int = defaults.integer(forKey: "score4") 72 let highScore5: Int = defaults.integer(forKey: "score5") 73 let highScore6: Int = defaults.integer(forKey: "score6") 74 let highScore7: Int = defaults.integer(forKey: "score7") 75 76 if score > highScore1{ 77 defaults.set(score, forKey: "score1") 78 defaults.set(highScore1, forKey: "score2") 79 defaults.set(highScore2, forKey: "score3") 80 } else if score > highScore2{ 81 defaults.set(score, forKey: "score2") 82 defaults.set(highScore2, forKey: "score3") 83 } else if score > highScore3{ 84 defaults.set(score, forKey: "score3") 85 } else if score > highScore4{ 86 defaults.set(score, forKey: "score4") 87 } else if score > highScore5{ 88 defaults.set(score, forKey: "score5") 89 } else if score > highScore6{ 90 defaults.set(score, forKey: "score6") 91 } else if score > highScore7{ 92 defaults.set(score, forKey: "score7") 93 } 94 95 func retry() { 96 score = 1000 97 positionX = [width / 2, width / 2, width / 2, width / 2, width / 2, width / 2, width / 2] 98 99 if timer.isValid == true { 100 self.start() 101 } 102 } 103 104 func toTop() { 105 self.dismiss(animated: true, completion: nil) 106 } 107 108} 109 110} 111 112

試したこと

まだまだ学び始めたばかりで模写の段階です。自分でできたことは、for-in の部分の数字を変えてみることぐらいでした。

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

imgViewに入れた画像を左右に動かして揃ったところでボタンを押すと止まる、そして1000点満点で点数が出るゲームを作っています。RUNしてみたところスタートの画面からゲームの画面に移ることすらできませんでした。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1 var positionX: [CGFloat] = [0.0, 0.0, 0.0]

ここで宣言した要素数や

Swift

1 positionX = [width / 2, width / 2, width / 2]

ここで再代入している要素数は3つですが、

Swift

1 @objc func up() { 2 for i in 0..<7{ 3 if positionX[i] > width || positionX[i] < 0 { 4 dx[i] = dx[i] * (-1) 5 } 6 positionX[i] += dx[i] 7 } 8 imgView1.center.x = positionX[0] 9 imgView2.center.x = positionX[1] 10 imgView3.center.x = positionX[2] 11 imgView4.center.x = positionX[3] 12 imgView5.center.x = positionX[4] 13 imgView6.center.x = positionX[5] 14 imgView7.center.x = positionX[6] 15 }

ここでは7つ使っています。

要素は3つしかありませんので、インデックス(添字)が3を超えると実行時エラーとなってしまいます。

投稿2020/11/03 08:30

TsukubaDepot

総合スコア5086

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

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

TsukubaDepot

2020/11/03 08:32

retry()で操作している数も3つのようですね。
hanetomo

2020/11/03 08:46 編集

直してみたのですが、、、できませんでした。コードと写真を更新したので確認してしてもらえると嬉しいです。でも、エラーになった場所が変わりました
TsukubaDepot

2020/11/03 08:49

dxの数も合わせないとダメだと思います。
hanetomo

2020/11/03 12:58

できました!!!ありがとうございました。またご縁があればよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問