因為公司項目需要,最近在學(xué)習(xí)IOS開發(fā),為了鞏固我的學(xué)習(xí),我想著能不能把以前用C# 開發(fā)的拼圖游戲移植到 Iphone 上呢,然后我就開始了這一移植的歷程,因為這是第二次做這個游戲了,所以想的也就比較深入,對以前的算法進行了優(yōu)化,借助系統(tǒng)提供的API又節(jié)省了不少代碼。個人感覺這個游戲還是挺成功的。
專注于為中小企業(yè)提供做網(wǎng)站、網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)南山免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。界面設(shè)計:
開始之后:
算法:
自定義一個控件,有兩個屬性 ImageTag 和ImageIndex,ImageTag用來存儲控件的位置,ImageIndex 用來存儲圖片的序號,tag 的取值范圍是0 - 15
一張圖片分割成4 *4 =16 張小圖,從 0 開始標號,初始的時候,tag 和index相等的,
當(dāng)向下滑動時,它與它的ImageTag +4的圖片互換,
當(dāng)向上的時間 ,取p_w_picpathTag-4,
當(dāng)向左的時候,取ImageTag-1,
當(dāng)向右的時候,取p_w_picpathTag+1,
改變圖片后index也跟著改變,tag不變,用 tag==index來判斷圖片是否復(fù)位,當(dāng)所有的圖片都復(fù)位了,拼圖也就完成了
我的想法是能不能利用系統(tǒng)提供的手勢來移動UIImageView 控件呢,然后我就寫了一個測試程序,發(fā)現(xiàn)手勢操作只能控制View的移動,不能移動UIImageView,
所以要改變一下思路,把一個UIImageView控件加到一個View中,做成一個自定義控件,問題解決:
import Foundation import UIKit class PImageView:UIView { // init(p_w_picpath: UIImage!) // { // // super.init(p_w_picpath:p_w_picpath) // } var parentView:ViewController! var p_w_picpathView:UIImageView! init(frame: CGRect) { super.init(frame: frame) var temp=frame temp.origin=CGPointMake(0, 0) p_w_picpathView=UIImageView(frame:temp) self.addSubview(p_w_picpathView) var recognizer1=UISwipeGestureRecognizer() recognizer1.addTarget(self, action:"handleSwipeView:") recognizer1.direction=UISwipeGestureRecognizerDirection.Right var recognizer2=UISwipeGestureRecognizer() recognizer2.addTarget(self, action:"handleSwipeView:") recognizer2.direction=UISwipeGestureRecognizerDirection.Left var recognizer3=UISwipeGestureRecognizer() recognizer3.addTarget(self, action:"handleSwipeView:") recognizer3.direction=UISwipeGestureRecognizerDirection.Up var recognizer4=UISwipeGestureRecognizer() recognizer4.addTarget(self, action:"handleSwipeView:") recognizer4.direction=UISwipeGestureRecognizerDirection.Down self.addGestureRecognizer(recognizer1) self.addGestureRecognizer(recognizer2) self.addGestureRecognizer(recognizer3) self.addGestureRecognizer(recognizer4) } func handleSwipeView(recognizer:UISwipeGestureRecognizer!) { var dir:String! if recognizer.direction.value==UISwipeGestureRecognizerDirection.Down.value { dir="Down" NSLog("move Down") } if recognizer.direction.value==UISwipeGestureRecognizerDirection.Up.value { dir="Up" NSLog("move Up") } if recognizer.direction.value==UISwipeGestureRecognizerDirection.Left.value { dir="Left" NSLog("move Left") } if recognizer.direction.value==UISwipeGestureRecognizerDirection.Right.value { dir="Right" NSLog("move Right") } //NSLog("tag:%d", self.p_w_picpathTag) parentView.moveImages(self, directionStr: dir) } func initWithTagAndIndex(myTag:Int! ,myIndex:Int!) { self.p_w_picpathIndex=myIndex self.p_w_picpathTag=myTag } func checkTagAndIndexValueIsSame()->Bool { return self.p_w_picpathIndex==self.p_w_picpathTag } var p_w_picpathTag:Int! var p_w_picpathIndex:Int! }
這個是自定義View的代碼,初始化的時候設(shè)置View的iamgeIndex和 p_w_picpathTag,設(shè)置圖片,注冊系統(tǒng)手勢操作
調(diào)用它的checkTagAndIndexValueIsSame()方法來檢測圖片是否復(fù)位.
我們再看看主界面代碼:
import UIKit class ViewController: UIViewController { @IBOutlet var v_allImageViews : UIView var screenWidth:CGFloat! var screenHeight:CGFloat! var dicImages:NSMutableDictionary! var dicIndexValues:NSMutableDictionary! var LocationX:Int = 0 var locationY:Int=0 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //var p_w_picpathView:UIImageView //var p_w_picpath:UIImage var myImage:UIImage self.screenWidth=self.view.frame.size.width self.screenHeight=self.view.frame.size.height var colWidth=(self.screenWidth-24)/4 var rowHeight=(self.screenHeight-184)/4 myImage=UIImage(named:"7.jpg") dicImages=NSMutableDictionary() var p_w_picpathW=myImage.size.width/4 var p_w_picpathH=myImage.size.height/4 var num=0 while(num<16) { var row = Float( num/4) var col = Float(num%4) NSLog("row:%.2f col:%.2f\r\n", row,col) var rect = CGRectMake(p_w_picpathW * col, p_w_picpathH * row, p_w_picpathW, p_w_picpathH) var tem=CGRectMake(10+colWidth * col+col, 40+rowHeight * row+row, colWidth, rowHeight) var sv=PImageView(frame: tem) // sv.frame.origin=CGPointMake(10+colWidth * col+col, 40+rowHeight * row+row) // sv.frame.size=CGSizeMake(colWidth, rowHeight) sv.backgroundColor=UIColor.lightGrayColor() // var frm=CGRect() // var p_w_picpathView=PImageView(frame:frm) // p_w_picpathView.frame.origin=CGPointMake(0, 0) // p_w_picpathView.frame.size=CGSizeMake(colWidth, rowHeight) // p_w_picpathView.backgroundColor=UIColor.redColor() sv.initWithTagAndIndex(num,myIndex: num) var p_w_picpath=getImage(myImage,rect: rect) if(num==0){ sv.p_w_picpathView.p_w_picpath=p_w_picpath } else { //var data = UIImagePNGRepresentation(p_w_picpath) dicImages.setObject(p_w_picpath, forKey:String( num)) sv.p_w_picpathView.p_w_picpath=p_w_picpath } sv.parentView=self self.v_allImageViews.addSubview(sv) //self.view.addSubview(p_w_picpathView) num++ } NSLog("dic count: %d ", dicImages.count) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func getImage(img:UIImage, rect:CGRect)->UIImage { var im:UIImage var p_w_picpathPartRef:CGImageRef var p_w_picpathRef:CGImageRef p_w_picpathRef=img.CGImage p_w_picpathPartRef=CGImageCreateWithImageInRect(p_w_picpathRef, rect) im=UIImage(CGImage: p_w_picpathPartRef) //CGImageRelease(p_w_picpathPartRef) return im } @IBOutlet var btnStart : UIButton //開始游戲 @IBAction func start(sender : AnyObject) { var vFrist = self.v_allImageViews.subviews[0] as PImageView vFrist.p_w_picpathView.p_w_picpath=nil dicIndexValues=NSMutableDictionary() var num=1 dicIndexValues.setObject(0, forKey: 0) var arr:NSArray = ["0"] while(num=0 && (myTag + num) <= 15 { var v_img = self.v_allImageViews.subviews[myTag + num] as PImageView //判斷目標位置是否為空 if v_img.p_w_picpathIndex != 0 { return } var tempImage=myImageView.p_w_picpathView.p_w_picpath //dicImages.objectForKey(String(myImageView.p_w_picpathIndex)) as UIImage v_img.p_w_picpathView.p_w_picpath=tempImage v_img.p_w_picpathIndex=myImageView.p_w_picpathIndex myImageView.p_w_picpathIndex=0 myImageView.p_w_picpathView.p_w_picpath=nil } //up -4 >=0 //down +4 <=15 //left -1>=0 //right +1<=15 //檢測是否完成 var indexValue=0 var isComplate:Bool = false while (indexValue < self.v_allImageViews.subviews.count) { var tempView = self.v_allImageViews.subviews[myTag + num] as PImageView if !tempView.checkTagAndIndexValueIsSame() { return } indexValue++ } //彈出消息,完成拼圖 NSLog("p_w_picpath Tag:%d ,direction:%@", myImageView.p_w_picpathTag,directionStr) } }
每移動一步就檢測一次.當(dāng)遇到第一個沒復(fù)位的就反回,如果所有都 復(fù)位了則游戲完成了.
代碼請看附件
附件:http://down.51cto.com/data/2365039另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。