前提・実現したいこと
ジャンケンアプリの作成になります。
✊✌️✋のいずれかのUIButtonを押すと、cpのimageViewが✊✌️✋の順番に画像がグルグルし、2秒後にlabelが勝敗判定(win, draw, lose)に変化します。同時にグルグルしていたimageViewがcpが出した手の画像に切り替わります。ちなみにcpの手はランダムです。
発生している問題・エラーメッセージ
2回目以降のジャンケン結果がおかしくなる。
自分の押した手とcpの出力された手の正しい勝敗がlabelにprintされない。また、2回目以降imageViewのグルグルがなくなる。
該当のソースコード
Swift
1 2import UIKit 3 4final class ViewController: UIViewController { 5 6 @IBOutlet weak var cpHand: UIImageView! 7 @IBOutlet weak var janken: UILabel! 8 @IBOutlet weak var selectbutton: UIButton! 9 @IBOutlet weak var scissorsbutton: UIButton! 10 @IBOutlet weak var paperbutton: UIButton! 11 @IBOutlet weak var rockbutton: UIButton! 12 13 var timer: Timer? 14 var nowIndex:Int = 0 15 16 enum hand: Int { 17 case rock = 0 18 case scissors = 1 19 case paper = 2 20 } 21 22 var cpHandImage:[UIImage] = [ 23 UIImage(named: "rockpic")!, 24 UIImage(named: "scissorspic")!, 25 UIImage(named: "paperpic")! 26 ] 27 28 override func viewDidLoad() { 29 super.viewDidLoad() 30 // Do any additional setup after loading the view. 31 } 32 33 @IBAction func selectbutton(_ sender: UIButton) { 34 35 let Button = Int(sender.tag) 36 guard let youHand = hand(rawValue: Button) else { 37 return 38 } 39 guard let cpHand = hand(rawValue: Int.random(in: 0...2)) else { 40 return 41 } 42 43 if timer == nil { 44 timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(changeImage), userInfo: nil, repeats: true) 45 } 46 DispatchQueue.main.asyncAfter(deadline: .now() + 1.99) { 47 self.timer?.invalidate() 48 self.janken(youHand: youHand, cpHand: cpHand) 49 self.result(youHand: youHand, cpHand: cpHand) 50 self.timer = nil 51 } 52 } 53 54 @objc func changeImage() { 55 nowIndex += 1 56 if (nowIndex == cpHandImage.count) { 57 nowIndex = 0 58 } 59 cpHand.image = cpHandImage[nowIndex] 60 } 61 62 func janken(youHand: hand, cpHand: hand) { 63 if youHand.rawValue == cpHand.rawValue { 64 janken.text = "you draw" 65 }else if (youHand.rawValue + 1)%3 == cpHand.rawValue { 66 janken.text = "you win!" 67 }else { 68 janken.text = "you lose" 69 } 70 } 71 72 func result(youHand: hand, cpHand: hand) { 73 if cpHand.rawValue == 0 { 74 self.cpHand.image = UIImage(named: "rockpic") 75 } else if cpHand.rawValue == 1 { 76 self.cpHand.image = UIImage(named: "scissorspic") 77 } else if cpHand.rawValue == 2 { 78 self.cpHand.image = UIImage(named: "paperpic") 79 } 80 } 81} 82
掲載されているコードが崩れているようです。
このままだと見にくいですし、仮にコピーしても正しく動かすのに手間がかかりますので、整形しなおしていただけますでしょうか。
申し訳ございません。修正いたしました。よろしくお願いいたします。
ご回答いただきありがとうございます。ご回答のように実装いたしました(質問ページのcodeも伴って変更させていただきました)。しかしながら、✊✌️✋全てのボタンが✊ボタンとして処理されてしまっているようです。改善策を教えていただくことは可能でしょうか。自分としてはsender.tagで割り振られているものだと思っておりました。
追記: これまでバラバラに宣言されていたbuttonを
@IBOutlet var selectbutton: [UIButton]!
でまとめましたが、変化はありませんでした。
試しに変更後のコードで動かしてみましたが、私の環境だときちんと動いています。
もちろん、ボタンは sender.tag で割り振っていることに気付いていましたので、StoryBoard で各ボタンに0, 1, 2 のタグを割り振ってあります。
ちなみに、私の回答に対するご質問ですので、できれば回答直下のコメント欄にコメントいただければと思います。
私が勘違いをしておりました。何かの拍子でtagが全て0になっていたようです。ありがとうございました。
コメントにつきましても以後気をつけます。不慣れなものですみませんでした。
回答1件
あなたの回答
tips
プレビュー