AppearanceProvider.swift

import UIKit

protocol AppearanceProviderProtocol:class {

  func tileColor(value:Int)->UIColor

  func numberColor(value:Int) -> UIColor

  func fontForNumbers()->UIFont

}

class AppearanceProvider:AppearanceProviderProtocol {

  func tileColor(value:Int)->UIColor {

    switch value {

      case 2:

      return UIColor(red:238.0/255.0,green:228.0/255.0,blue:218.0/255.0,alpha:1.0)

      

case 4:
  return UIColor(red: 237.0/255.0, green: 224.0/255.0, blue: 200.0/255.0, alpha: 1.0)
  case 8:
  return UIColor(red: 242.0/255.0, green: 177.0/255.0, blue: 121.0/255.0, alpha: 1.0)
  case 16:
  return UIColor(red: 245.0/255.0, green: 149.0/255.0, blue: 99.0/255.0, alpha: 1.0)
  case 32:
  return UIColor(red: 246.0/255.0, green: 124.0/255.0, blue: 95.0/255.0, alpha: 1.0)
  case 64:
 

return UIColor(red: 246.0/255.0, green: 94.0/255.0, blue: 59.0/255.0, alpha: 1.0)

      case 128,256,1024,2048:

      return UIColor(red:237.0/255.0,green:207.0/255.0,blue:114.0/255.0,alpha:1.0)

      default:

      return UIColor.whiteColor

      }

    }

  }

  func numberColor(value:Int) -> UIColor {

    switch value {

      case 2,4:

      return UIColor(red:119.0/255.0,green:110.0/255.0,101.0/255.0,alpha:1.0)

      default:

      return UIColor.whiteColor()

    }

    func fontFotNumbers()->UIFont {

      return UIFont(name:"HelveticaNenu-Bold",size:20)

    }

  }

}

a class implements a protocol use :   good interface

UIColor()   UIFont()    font name, how to use ,later study

tileColor, numberColor,  fontForNumbers

import UIKit

class ViewController:UIViewController {

  override func  viewDidLoad() {

    super.viewDidLoad()

  }

  @IBAction func startGameButtonTapped(sender:UIButton) {

    let game = NumberTileGameViewController(dimension:4,threshold:2048)

    self.presentViewController(game,animated:true,completion:nil)

  }

}

import UIKit

class TileView:UIView {

  var delegate:AppearanceProviderProtocol

  var value:Int = 0 {

  didSet{

    backgroundColor=delegate.tileColor(value)

    numberLabel.textColor = delegate.numberColor(value)

    numberLabel.text = "\(value)"

  }

  }

  var numberLabel:UILabel

  required init(coder:NSCoder) {

    fatalError("NSCoding not supported")

  }

  init(position:CGPoint, width:CGFloat, value:Int, radius:CGFloat,delegate d:AppearanceProviderProtocol) {

    delegate = d

    numberLabel = UILabel(frame:CGReckMake(0,0,width,width))

    numberLabel.textAlignment = NSTExtAlignment.Center

    numberLabel.minimumScaleFactor = 0.5

    numberLabel.font = delegate.fontForNumbers()

    super.init(frame:CGRectMake(position.x,position.y,width,width))

    addSubview(numberLabel)

    layer.cornerRadius = radius

    self.value = value

    backgroundColor = delegate.tileColr(value)

    numberLabel.textColor = delegate.numberColor(value)

    numberLabel.text = "\(value)"

  }

}

TileView   MVC View , implement  protocol    AppearanceProvicerProtol

didSet    super.init

import UIKit

class GameboardView:UIView {

  var dimension:Int

  var tileWidth:CGFloat

  var titlePadding:CGFloat

  var cornerRadius:CGFloat

  var tiles:Dictionary(NSIndexPath,TileView)

  let provider = AppearanceProvider()

  let tilePopStartScale:CGFloat:0.1

  let tilePopMaxScale:CGFloat:1.1

  let tilePopDelay:NSTimeInterval=0.05

  let tileExpandTime:NSTimeInterval:0.18

  let tileContractTime:NStimeInterval:0.08

  let tileMergeStartScale:CGFloat=1.0

  let tileMergeExpandTIme:NSTImeInterval = 0.08

  let tileMergeContractTime:NSTimeINterval = 0.08

  let perSquareSlideDuration:NSTimeInterval = 0.08.

  init(dimension d:Int, tileWidth width:CGFLoat, tilePadding padding:CGFloat, cornerRadius radius:CGFloat, backgorund)

  {

    assert(d>0)

    dimension=d

    tileWidth = width

    tilePadding = padding

    cornerRedius = radius

    tiles = Dictionary()

    let sideLength = padding + CGFloat(dimension)*(width+padding)

    super.init(frame:CGRectMake(0,0,sideLength,sideLength))

    layer.cornerRadius = radius

    setupBackground(backgroundColor:backgroundColor,tileColor:foregroundCOlor)

  }

  required init(coder:NSCoder) {

    fatalError("NSCoding not supported")

  }

  

  func reset() {

    for(key,tile) in tiles {

      tile.removeFromSuperView()

    }

    tiles.removeAll(keepCapacity:true)

  }

  func positionIsValid(pos:(Int,Int))->Bool {

    let(x,y) = pos

    return (x>=0 && x < dimension && y >=0 && y < dimension)

  }

  func setupBackground(backgroundColor bgColor:UIColor, tileColor:UIColor) {

    backgroundColor = bgColor

    var xCursor = tilePadding

    var yCursor:CGFloat

    let bgRadius = (cornerRadius >-2)?cornerRadius-2:0

    for i in 0..<dimension {

      yCursor = tilePadding

      for j in 0..<dimmesion

      let bakcground= UIView(frame:CGRectMake(xCUrsor,yCursor,tileWidth,tileWidth))

      background.layer.cornerRadius

      background.backgrohndCOlor =

    }

  }

  

  func insertTile(pos:(Int, Int),value:Int) {

    assert(positionIsValid(pos))

    let(row,col) = pos

    let x = tilePadding  + CGFloat(col) *(tileWidth + tilePadding)

    let y = tilePadding  + CGFloat(row)*(tileWidth + tilePadding)

    let r = (cornerRidus > = 2) ?cornerRadius - 2:0

    let tile = TileView(position:CGPointMake(x,y),width:tileWidth,value:value,radius:r,delegate:provider)

    tile.layer.setAffineTransform(CGAffineTransformMakeScale(tilePopStartScale,tilePopStartScale)

    addSubView(tile)

    bringSubViewToFont(tile)

    tiles[NSIndexPath(forRow:row,inSection:col)] = tile

    UIView.animateWithDuration(tileExpandTime,delay:tilePopDelay,options:UIViewAnimationOPtions.TransitionNone,

    animations:{ ()-> Void in

    tile.layer.setAffineTransform(CGAffineTransformMakeScale(self.tilePopMaxScale,self.titlePopMaxScale))

      

    } ,

    completion:{(finshed:Bool)->Void in

    UIView.animateWithDuration(self.tileContractTIme,animations:{()->Void in

     tile.layer.setAffineTransform(CGAffineTransformIdentity)

    })

    }

    )        

  }

}

Dictionary(NSIndexPath, TileView)

2048 swift的更多相关文章

  1. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  2. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码

    源代码: 用IOS Swift语言实现的Flappy Bird源代码:http://download.csdn.net/detail/estellise/7449547 用IOS Swift实现的游戏 ...

  3. [swift实战入门]手把手教你编写2048(一)

    苹果设备越来越普及,拿着个手机就想捣鼓点啥,于是乎就有了这个系列,会一步一步教大家学习swift编程,学会自己做一个自己的app,github地址:https://github.com/scarlet ...

  4. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  5. Swift编程语言资料合集

    在本周二凌晨召开的苹果年度开发者大会WWDC上,苹果公司推出了全新的编程语言Swift.Swift 基于C和Objective-C,是供iOS和OS X应用编程的全新语言,更加高效.现代.安全,可以提 ...

  6. 12套swift学习资源分享

    虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...

  7. 21个高质量的Swift开源iOS App

    原文:21 Amazing Open Source iOS Apps Written in Swift 对Swift初学者来说,学习开源项目,阅读源码是个不错的方法.在这篇文章中,基于对代码质量和排名 ...

  8. Swift初学习

    距离swift发布10天了,也简单看了一下swift的语法,个人感觉相对于object-c很是简单明了.Swift的出现并不能说明iOS开发简单了很多,有可能会变得复杂,你需要学习两门编程语言,因为在 ...

  9. iOS - Swift String 字符串

    前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodin ...

随机推荐

  1. 点击Enter键,文本框焦点改变 分类: WinForm 2014-04-15 10:30 223人阅读 评论(0) 收藏

    一个例子: 一个简单的 登陆界面,有用户名.密码文本框.登陆按钮.  想要实现的效果是,用户输入用户名之后,点击Enter键进入到下一个文本框,同理,输入完密码之后,登陆按钮获得焦点,再次点击Ente ...

  2. 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程

    在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...

  3. 搭建自己的SIPserver:开源sipserveropensips的搭建及终端TwInkle的使用

    先下载源代码: 这里我下载的是1.8.2,由于这个是眼下的最稳定版本号,(尽管已经有1.9及2.0了) http://opensips.org/pub/opensips/1.8.2/src/opens ...

  4. Hadoop HDFS (3) JAVA訪问HDFS

    如今我们来深入了解一下Hadoop的FileSystem类. 这个类是用来跟Hadoop的文件系统进行交互的.尽管我们这里主要是针对HDFS.可是我们还是应该让我们的代码仅仅使用抽象类FileSyst ...

  5. SPOJ 4053 - Card Sorting 最长不下降子序列

    我们的男主现在手中有n*c张牌,其中有c(<=4)种颜色,每种颜色有n(<=100)张,现在他要排序,首先把相同的颜色的牌放在一起,颜色相同的按照序号从小到大排序.现在他想要让牌的移动次数 ...

  6. 一道在知乎很火的 Java 题——如何输出 ab【转】

    这是一个源自知乎的话题,原贴链接:一道百度的面试题,有大神会嘛? 虽然我不是大神,但我也点进去看了一下,思考了一会之后有了一些思路,然后去看其它人的答案的时候果然全都已经被各路大神们先想到并贴出来了, ...

  7. android studio上代码编译调试中遇到的一些异常记录

    下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...

  8. CSS3新增UI样式

    圆角,border-radius: 1-4个数字/1-4个数字,前面是水平,后面是垂直,不给“/”表示水平和垂直一样,举例如下: <head> <meta http-equiv=&q ...

  9. Dedecms当前位置{dede:field name='position'/}修改

    这个实在list_article.htm模板出现的,而这个模板通过loadtemplage等等一系列操作是调用的include 下的arc.archives.class.php $this->F ...

  10. Android开源项目 Universal imageloader 源码研究之项目框架

    Universal imageloader 的代码并不复杂 重点是缓存,线程池任务 下面都用UML图进行了绘制 基本使用流程就是 初始化配置,设置Options参数,最后Dispaly提交下载 pub ...