拼图游戏之 IOS 版(用swift语言开发的)

因为公司项目需要,最近在学习IOS开发,为了巩固我的学习,我想着能不能把以前用C# 开发的拼图游戏移植到 Iphone 上呢,然后我就开始了这一移植的历程,因为这是第二次做这个游戏了,所以想的也就比较深入,对以前的算法进行了优化,借助系统提供的API又节省了不少代码。个人感觉这个游戏还是挺成功的。

界面设计:

开始之后:

算法:

  1. 自定义一个控件,有两个属性 ImageTag 和ImageIndex,ImageTag用来存储控件的位置,ImageIndex 用来存储图片的序号,tag 的取值范围是0  - 15
  2. 一张图片分割成4 *4 =16 张小图,从 0 开始标号,初始的时候,tag 和index相等的,
  3. 当向下滑动时,它与它的ImageTag +4的图片互换,
  4. 当向上的时间 ,取imageTag-4,
  5. 当向左的时候,取ImageTag-1,
  6. 当向右的时候,取imageTag+1,
  7. 改变图片后index也跟着改变,tag不变,用 tag==index来判断图片是否复位,当所有的图片都复位了,拼图也就完成了

我的想法是能不能利用系统提供的手势来移动UIImageView 控件呢,然后我就写了一个测试程序,发现手势操作只能控制View的移动,不能移动UIImageView,

所以要改变一下思路,把一个UIImageView控件加到一个View中,做成一个自定义控件,问题解决:

import Foundation
import UIKit
class PImageView:UIView
{
   
//    init(image: UIImage!)
//    {
//       // super.init(image:image)
//    }
    var parentView:ViewController!
    var imageView:UIImageView!
   init(frame: CGRect)
   {
    super.init(frame: frame)
    var temp=frame
    temp.origin=CGPointMake(0, 0)
    imageView=UIImageView(frame:temp)
    self.addSubview(imageView)
    
    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.imageTag)
        
        parentView.moveImages(self, directionStr: dir)
    }
   
    func initWithTagAndIndex(myTag:Int! ,myIndex:Int!)
    {
        self.imageIndex=myIndex
        self.imageTag=myTag
    }
    
    func checkTagAndIndexValueIsSame()->Bool
    {
        return self.imageIndex==self.imageTag
    }
    var imageTag:Int!
    var imageIndex:Int!
    
    
}

这个是自定义View的代码,初始化的时候设置View的iamgeIndex和 imageTag,设置图片,注册系统手势操作

调用它的checkTagAndIndexValueIsSame() 方法来检测图片是否复位.

我们再看看主界面代码:

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 imageView:UIImageView
        //var image: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 imageW=myImage.size.width/4
        var imageH=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(imageW * col, imageH *  row, imageW, imageH)
            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 imageView=PImageView(frame:frm)
            //            imageView.frame.origin=CGPointMake(0, 0)
            //            imageView.frame.size=CGSizeMake(colWidth, rowHeight)
            //            imageView.backgroundColor=UIColor.redColor()
            
            sv.initWithTagAndIndex(num,myIndex: num)
            
            var image=getImage(myImage,rect: rect)
            
            if(num==0){
                sv.imageView.image=image
            }
            else
            {
                //var data = UIImagePNGRepresentation(image)
                dicImages.setObject(image, forKey:String( num))
                sv.imageView.image=image
            }
            sv.parentView=self
            self.v_allImageViews.addSubview(sv)
            //self.view.addSubview(imageView)
            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 imagePartRef:CGImageRef
        var imageRef:CGImageRef
        
        imageRef=img.CGImage
        
        imagePartRef=CGImageCreateWithImageInRect(imageRef, rect)
        
        im=UIImage(CGImage: imagePartRef)
        
        //CGImageRelease(imagePartRef)
        
        return im
    }
    
    @IBOutlet var btnStart : UIButton
    
    //开始游戏
    @IBAction func start(sender : AnyObject) {
       var vFrist =  self.v_allImageViews.subviews[0] as PImageView
        vFrist.imageView.image=nil
        dicIndexValues=NSMutableDictionary()
        var num=1
        dicIndexValues.setObject(0, forKey: 0)
        var  arr:NSArray = ["0"]
        
        while(num<self.v_allImageViews.subviews.count)
        {
            var myindex=arc4random()%15+1;
            //if(!dicIndexValues.allValues.(String(myindex)))
             //var obj = arr.indexOfObject(String(myindex))
            if (!arr.containsObject(String(myindex)))
            {
              arr = arr.arrayByAddingObject(String(myindex))
                dicIndexValues.setObject(String( myindex), forKey: num)
                NSLog("key :%d value: %@\r\n",num, String( myindex))
                //var data = dicImages.objectForKey(String( myindex))
                
                var   v_img  = self.v_allImageViews.subviews[num]  as PImageView
                
                v_img.imageView.image = dicImages.objectForKey(String(myindex)) as UIImage
                v_img.imageIndex=Int( myindex)
                num++
                
                // NSLog("tag:%d index:%d", v_img.imageTag,v_img.imageIndex)
            }
            
            
        }
    }
    //动画切换图片(没有加入动画,只是简单的移动)
    func moveImages(myImageView:PImageView,directionStr:String! )
    {
        var myTag=myImageView.imageTag
        let anotherCharacter:String=directionStr
        var num=0
        switch  anotherCharacter
            {
            
        case "Up":
            num = -4
            NSLog("up")
        case "Down":
            num = 4
            NSLog("Down")
            
        case "Left":
            num = -1
        case "Right":
            num = 1
        default:
            NSLog("default")
        }
        //边界检查
        if (myTag + num)>=0 && (myTag + num) <= 15
        {
             var   v_img  = self.v_allImageViews.subviews[myTag + num]  as PImageView
            //判断目标位置是否为空
             if v_img.imageIndex != 0
             {
                return
             }
            var tempImage=myImageView.imageView.image
            //dicImages.objectForKey(String(myImageView.imageIndex)) as UIImage
            v_img.imageView.image=tempImage
            v_img.imageIndex=myImageView.imageIndex
            myImageView.imageIndex=0
            myImageView.imageView.image=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("image Tag:%d ,direction:%@", myImageView.imageTag,directionStr)
    
    }
}

每移动一步就检测一次.当遇到第一个没复位的就反回,如果所有都 复位了则游戏完成了.

代码请看附件

时间: 2024-10-10 21:02:16

拼图游戏之 IOS 版(用swift语言开发的)的相关文章

基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析

前言 Swift 语言,怎么说呢,有一种先接受后排斥,又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift几乎占据了多半,而国内虽然出现很多相关技术介绍和教程,但是在真正项目开发中使用的占据很少部分,原因一是目前熟练它的开发者并不多,二是版本不太稳定,还需要更成熟可靠的版本支持,但总之未来还是很有前景的,深有体会,不管是代码量还是编译效率,以及语言特性,现代性都优于Object-C,估计后续会被苹果作为官方开发语言,值得期待. 走起 鉴于此,笔者将之前用Object-C写的SSO授权登录:微

IOS入门之Swift语言(一)

经过不断的努力,小哥也买了台苹果设备,终于可以开始我的IOS之旅了,说来确实令人苦恼,为了学习IOS我这着贫农阶级,省了几个月的零花钱,外加向亲朋好友求救,最终痛下心扉,卖了台MAC pro128G版.苦逼的事情就不在多说,下面聊一聊,初次使用的心得体会,IOS的做工确实没说的,铝合金的机身,看上去就很显身份,用起来确实流畅,而且附带了很多有趣的应用,其中最让我惊奇的是段视频制作软件,提供了很多模板,让我制作小视频方便了很多.其次就是它的多手指操作了,炫酷的很,不过初次拿到本本时,确实很头疼,不

swift语言开发的一个游戏------熊猫跑酷(KongfuPanda)

项目地址:https://github.com/jakciehoo/KongfuPanda 欢迎加QQ群:260558552.大家一起交流iOS开发,我们可以一起学习,我很想集结一些志同道合的朋友,一起把iOS开发学好,学精,相互学习相互鼓励. 1.首先创建一个游戏项目: 2.将图片资源导入 将我项目里的 atlas整个目录 sound组里的音乐(background.mp3,fly.mp3,hit_platform.mp3,apple.mp3,hit.mp3,jump_from_platfor

【iOS开发】如何用 Swift 语言进行LBS应用的开发?

本文分为三部分,第一部分详解用Swift语言开发LBS应用,并给出完整的示例与源代码:第二部分介绍如何申请LBS密钥,第三部分是综合示例查看,扫描二维码即可查看示例demo. 第一部分 使用Swift语言开发LBS应用 1.下载iOS地图SDK的最新版本,地址:http://lbs.amap.com/api/ios-sdk/down/ 2.申请LBS密钥(见第二部分). 3.xCode新建工程 新建一个 Single View Application 工程.注意:Language 选择 Swif

关于Swift语言

继Objective--C以来, 苹果公司一直沿用该语言作为iPad和iPhone的开发语言.它是一门面向对象的编程语言,是一门对C语言进行封装的语言. WWDC于北京时间6月3日凌晨1点在旧金山召开.在大会上,它发布了两个系统,OS Yosemite和iOS 8, Swift语言也是在那时同时发布的, 仅发布后一天,有关该语言的电子书就被下载了37万次以上. 网易科技讯 6月5日消息,据国外媒体报道,苹果新编程语言Swift,从开始研发到最终发布仅用了不足4年时间.该语言背后的创造者为苹果开发

【iOS开发每日小笔记(六)】Swift语言学习的入门随想

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

Swift语言iOS开发:CALayer十则示例(转)

http://mobile.51cto.com/iphone-469498.htm 如你所知,我们在iOS应用中看到的都是视图(view),包括按钮视图.表视图.滑动条视图,还有可以容纳其他视图的父视图等. 但你或许不知道在iOS中支撑起每个视图的是一个叫做"图层(layer)"的类,确切地说是CALayer. 本文中您会了解CALayer及其工作原理,还有应用CALayer打造酷炫效果的十则示例,比如绘制矢量图形.渐变色,甚至是粒子系统. 本文要求读者熟悉iOS应用开发和Swift语

使用swift语言进行IOS应用开发

在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Swift 和Objective-C两种语言,两种语言之间能够互通和互用. 任意Objective-C的框架或C库(包括所有的Objective-C系统框架,例如Foundation.UIKit.SpriteKit以及系统提供的公共c库)作为模块被直接导入Swift 供Swift语言使用. 例如为了使用

IOS学习之路——Swift语言(1)——基本类型、运算符与逻辑控制语句

一.变量 变量标识符必须以字符包括Unicode编码字符.美元字符$.下划线_开头,不能以数字开头,不能包含空格.更不能使用关键字命名. swift中变量的声明使用var关键字,常量的声明使用let关键字. 1 var name="Swift"; 2 var version=2.2; 3 let company:String="Apple"; 变量的声明: 1. 可以使用,逗号分割变量来同时声明多个变量 2. 可以使用:类型来同时指明多个变量的类型 在Mac中可以使