とりあえずブログ

プログラミングとiPhoneアプリの作り方を勉強中です。

試行錯誤 10.4 (シュッと⭐️・ジグソーパズル)

前回、正解エリアを作ってCGRectContainsPointを使って判定する方法を考えてみましたが、正解エリアを作るタイミングを変えた方が良さそう...と思っていました。

そこへ、Toshiさんから⭐️アドバイス第2弾!⭐️
本当にありがとうございます!
m(__)m

あらかじめ作っておく系、やってみました!(≧▽≦)
正解エリアには、分かりやすいように赤色をつけています。

で、プログラムも...
最初のものに比べたら、かなりシュッとしてませんか!?ヽ(*´v`*)ノ

import UIKit

class ViewController: UIViewController {
    
    var correctCount = 0
    var answerAreaAray:[UIView] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //台を作る
        let baseImg = UIImageView(frame: CGRectMake(10, 50, 300, 300))
        baseImg.backgroundColor = UIColor.grayColor()
        self.view.addSubview(baseImg)
        
        //ピースの数(1〜16)を入れる配列
        var pieceAray:[Int] = []
        
        for i in 0...15{
    
            pieceAray.append(i+1)
            
        }
        
        //4×4=16個のピースを作る
        for j in 0...3{
            for i in 0...3{
                
                //配列の要素数からランダムに値を取り(1〜16)、indexに入れる
                let index = Int(arc4random_uniform(UInt32(pieceAray.count)))
                
                //配列の(index+1)番目の要素を取り出しnumに入れる
                let num = pieceAray[index]
                
                //配列から取り除く
                pieceAray.removeAtIndex(index)
                
                //シャッフルされた数numを使って、画像をランダムに割り振ったimageViewを作る
                let pieces = UIImageView(frame: CGRectMake(CGFloat(75*i),CGFloat(75*j+40), 95, 95))
                let str = String(format:"img%d.png",num)
                pieces.image = UIImage(named: str)
                pieces.tag = num
                self.view.addSubview(pieces)
                
                //今回、変更したところ
                //正解エリアを作っておく
                let answerArea = UIView(frame:CGRectMake(0, 0, 15, 15))
                answerArea.center = pieces.center
                answerArea.backgroundColor = UIColor.redColor()
                answerAreaAray.append(answerArea)
                self.view.addSubview(answerArea)
                
                //ピースをばらまいた状態にする
                let yoko = Int(arc4random_uniform(225) + 50)
                let tate = Int(arc4random_uniform(225) + 80)
                
                var point:CGPoint = pieces.center
                point.x = CGFloat(yoko)
                point.y = CGFloat(tate)
                pieces.center = CGPointMake(point.x, point.y)
                
                //UIPanGestureRecognizerを使用
                let movePieces:UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragPieces:")
                pieces.addGestureRecognizer(movePieces)
                pieces.userInteractionEnabled = true
                
            }
        }
    }
    
    ///ピースをドラッグしたら呼ばれる関数
    func dragPieces(sender:UIPanGestureRecognizer){
        
        //ピースをドラッグし終わったら
        if sender.state == UIGestureRecognizerState.Ended{
            
            let targetImg:UIView = sender.view!
 
            //今回、変更したところ
            //answerAreaArayのviewと、targetImgの中心が重なったら正解とする
            for(var i=0; i<answerAreaAray.count; i++){
                
                let answerView = answerAreaAray[targetImg.tag-1]
                
                if (CGRectContainsPoint(answerView.frame, targetImg.center)){
     
                    //正解座標に移動
                    targetImg.center = CGPointMake(answerView.center.x, answerView.center.y)
                    
                    //正解後は動かないように
                    targetImg.userInteractionEnabled = false
    
                    //正解数をカウント
                    correctCount++
    
                    //全ピースが正解したら
                    if correctCount == 16{
                        print("Congratulations!")
            
                    }
                }
            }
            
        }else{
                
                let point: CGPoint = sender.translationInView(self.view)
                let movedPoint: CGPoint = CGPointMake(sender.view!.center.x + point.x, sender.view!.center.y + point.y)
                sender.view!.center = movedPoint
                sender.setTranslation(CGPointZero, inView: self.view)
        }
     }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

正解エリアをviewDidLoadで作り、配列にはtagではなくviewそのものを入れてみました。
そうすると、後々使いやすいように思いました♪

Toshiさん、お忙しい中本当にありがとうございました!
コードも気分も、すっきり!です(o’∀`)ノ