実現したいこと
3つラベルを用意し,スタートボタンを押すとルーレットのようにラベル内の数字が高速かつランダムに変化しつつ,5秒後に当たりorハズレに合わせてラベル内の数字がストップ(当たりの場合は3つとも同じ数字を,ハズレの場合は数字が揃わないように)するプログラムを作成させたいと考えています。
発生している問題・分からないこと
Timer機能にて0.01秒ごとにラベル内の数字を変化させ,もう一つのTimerにて5秒後に当たりorハズレの抽選を行ってその結果に合わせてラベル内に数字を表示させるプログラムを記入しました。
5秒後に発火するTimerにて0.01秒毎に発火するTimerを終了させた際にはランダムに選ばれた数字がラベル内に表示されますが,抽選後の数字(当たりの場合は111,222など,ハズレの場合は384,242など)を表示させるタイミングでラベルの数字が更新されず,0.01秒毎に発火されるTimerで選ばれた数字が残ってしまうため,当たっている時に384,242などのハズレ数字が表示されたり,ハズレの時に111,222など当たり数字が表示されたりしてしまいます。
Printを用いてコンソールに表示させると正常にプログラム自体は動いているようですが,ラベルの表示のみ正常に動作していません。
どの部分を改善すればよろしいか,ご教授いただけますと幸いです。
該当のソースコード
Swift
1class ViewController: UIViewController { 2 3 @IBOutlet weak var hundred: UILabel! 4 @IBOutlet weak var ten: UILabel! 5 @IBOutlet weak var one: UILabel! 6 @IBOutlet weak var hundred2: UILabel! 7 @IBOutlet weak var ten2: UILabel! 8 @IBOutlet weak var one2: UILabel! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view. 13 14 testCountNum.text = String(testCount) 15 kakuhenCountNum.text = String(kakuhenCount) 16 normalCountNum.text = String(normalCount) 17 hazureCountNum.text = String(hazureCount) 18 hundred.text = nil 19 ten.text = nil 20 one.text = nil 21 hundred2.isHidden = true 22 ten2.isHidden = true 23 one2.isHidden = true 24 25 } 26 27 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 28 view.endEditing(true) 29 } 30 31 @IBOutlet weak var testCountNum: UILabel! 32 @IBOutlet weak var kakuhenCountNum: UILabel! 33 @IBOutlet weak var normalCountNum: UILabel! 34 @IBOutlet weak var hazureCountNum: UILabel! 35 36 var testCount = 0 37 var kakuhenCount = 0 38 var normalCount = 0 39 var hazureCount = 0 40 let kakuhenArray = [10, 24, 36, 68, 103, 104, 210, 253, 286, 289, 296, 409, 637, 715, 747, 912, 1046, 1048, 1356, 1827, 2846, 3096, 3784, 5060, 5283, 5475, 5876, 6106, 7777, 9037, 11303, 11586, 11867, 12486, 14869, 18576, 18764, 18978, 19284, 19384, 20193, 22222, 22857, 23487, 23867, 25049, 25867, 26157, 27373, 28345, 30938, 31000] 41 let normalArray = [3, 16, 20, 64, 105, 158, 179, 236, 247, 295, 314, 376, 736, 799, 1175, 1657, 1659, 1688, 2186, 2367, 2646, 3263, 3948, 4857, 4938, 5338, 6456, 6873, 6874, 7041, 8456, 9285, 10374, 15364, 17366, 17684, 19867, 23136, 23183, 23456, 23576, 25676, 27756, 29173, 29465, 30124, 30476, 31900] 42 let kakuhenArray2 = [1, 3, 5, 7, 9] 43 let normalArray2 = [2, 4, 6, 8] 44 let kakuhenNumArray = [1, 3, 5, 7, 9] 45 let normalNumArray = [2, 4, 6, 8] 46 var hundredNum:Int = 0 47 var tenNum:Int = 0 48 var oneNum:Int = 0 49 50 51 @IBAction func startCount(_ sender: UIButton) { 52 53 testCountNum.text = String(testCount) 54 kakuhenCountNum.text = String(kakuhenCount) 55 normalCountNum.text = String(normalCount) 56 hazureCountNum.text = String(hazureCount) 57 58 let repeatingTimer2 = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in 59 self.hundredNum = Int.random(in: 1...9) 60 self.tenNum = Int.random(in: 1...9) 61 self.oneNum = Int.random(in: 1...9) 62 self.hundred.text = String(self.hundredNum) 63 self.ten.text = String(self.tenNum) 64 self.one.text = String(self.oneNum) 65 } 66 67 let repeatingTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { timer in 68 69 repeatingTimer2.invalidate() 70 print("StopTimer") 71 self.testCount += 1 72 print(self.testCount) 73 self.testCountNum.text = String(self.testCount) 74 let pickNum = Int.random(in: 1...20) 75 print(pickNum) 76 print(self.hundredNum) 77 print(self.tenNum) 78 print(self.oneNum) 79 if self.kakuhenArray2.contains(pickNum) == true { 80 let kakuhenNum:Int! = self.kakuhenNumArray.randomElement() 81 self.hundredNum = kakuhenNum 82 self.tenNum = kakuhenNum 83 self.oneNum = kakuhenNum 84 print(self.hundredNum) 85 print(self.tenNum) 86 print(self.oneNum) 87 self.hundred.isHidden = true 88 self.ten.isHidden = true 89 self.one.isHidden = true 90 self.hundred2.isHidden = false 91 self.ten2.isHidden = false 92 self.one2.isHidden = false 93 self.hundred2.text = String(self.hundredNum) 94 self.ten2.text = String(self.tenNum) 95 self.one2.text = String(self.oneNum) 96 self.kakuhenCount += 1 97 print("kakuhen") 98 self.kakuhenCountNum.text = String(self.kakuhenCount) 99 }else if self.normalArray2.contains(pickNum) == true { 100 let normalNum:Int! = self.normalNumArray.randomElement() 101 self.hundredNum = normalNum 102 self.tenNum = normalNum 103 self.oneNum = normalNum 104 print(self.hundredNum) 105 print(self.tenNum) 106 print(self.oneNum) 107 self.hundred.isHidden = true 108 self.ten.isHidden = true 109 self.one.isHidden = true 110 self.hundred2.isHidden = false 111 self.ten2.isHidden = false 112 self.one2.isHidden = false 113 self.hundred2.text = String(self.hundredNum) 114 self.ten2.text = String(self.tenNum) 115 self.one2.text = String(self.oneNum) 116 self.normalCount += 1 117 print("normal") 118 self.normalCountNum.text = String(self.normalCount) 119 }else { 120 self.hundredNum = Int.random(in: 1...9) 121 self.hundred.isHidden = true 122 self.hundred2.isHidden = false 123 self.hundred2.text = String(self.hundredNum) 124 self.tenNum = Int.random(in: 1...9) 125 self.ten.isHidden = true 126 self.ten2.isHidden = false 127 self.ten2.text = String(self.tenNum) 128 self.oneNum = Int.random(in: 1...9) 129 if self.hundredNum == self.tenNum { 130 while self.oneNum == self.tenNum { 131 self.oneNum = Int.random(in: 1...9) 132 } 133 } 134 print(self.hundredNum) 135 print(self.tenNum) 136 print(self.oneNum) 137 self.one.isHidden = true 138 self.one2.isHidden = false 139 self.one2.text = String(self.oneNum) 140 self.hazureCount += 1 141 print("hazure") 142 self.hazureCountNum.text = String(self.hazureCount) 143 } 144 145 146 sleep(3) 147 print("Wait a 3 seconds.") 148 149 self.hundred.isHidden = false 150 self.ten.isHidden = false 151 self.one.isHidden = false 152 self.hundred2.isHidden = true 153 self.ten2.isHidden = true 154 self.one2.isHidden = true 155 156 let repeatingTimer2 = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in 157 let hundredNum = Int.random(in: 1...9) 158 let tenNum = Int.random(in: 1...9) 159 let oneNum = Int.random(in: 1...9) 160 self.hundred.text = String(hundredNum) 161 self.ten.text = String(tenNum) 162 self.one.text = String(oneNum) 163 } 164 print("StartTimer") 165 } 166 167 168 169 } 170 171} 172
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
ラベルを別物にして,0.01秒ごとに発火されるTimerで表示されるラベルと,5秒毎に発火されるTimerで表示されるラベルを非表示対応などで切り替わるようにしましたが,これでも上手くいきませんでした。
補足
特になし
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/27 12:11