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

这篇文章须要大家了解一些swift基本的语法。这里注重实践,就不讲太多基本的语法了。不懂的大家能够Google一下,swift开发环境也非常easy,直接在mac上安装一个XCode就可以,首先我们来看下终于我们要实现的效果:

当然你也能够将当中的数字换成文字给你女票安手机上,还能够给个小惊喜,效果例如以下:

从上图能够看出来。终于效果事实上主要分为计分板和游戏面板。游戏面板里是一个背景和非常多的小块,小块中间有间隔。今天先教大家编写出游戏面板。

首先新建一个swiftproject。这里就不多说了。然后新建文件NumbertailGameController.swift。这个文件主要处理游戏的初始化等逻辑

新建一个NumbertailGameController类继承UIViewController,当中包括例如以下属性:

class NumbertailGameController : UIViewController {
var demension : Int //2048游戏中每行每列含有多少个块
var threshold : Int //最高分数,推断输赢时使用,今天临时不会用到。预留
let boardWidth: CGFloat = 260.0 //游戏区域的长度和高度
let thinPadding: CGFloat = 3.0 //游戏区里面小块间的间距
let viewPadding: CGFloat = 10.0 //计分板和游戏区块的间距
let verticalViewOffset: CGFloat = 0.0 //一个初始化属性,后面会有地方用到
}

接下来给NumbertailGameController加入init方法

init(demension d : Int , threshold t : Int) {
demension = d < 2 ? 2 : d
threshold = t < 8 ? 8 : t
super.init(nibName: nil, bundle: nil)
view.backgroundColor = UIColor(red : 0xE6/255, green : 0xE2/255, blue : 0xD4/255, alpha : 1)
}

这里主要是限制了最少两个块以及最低分数为8分,另外设置了整个面板的背景色,关于颜色,大家能够取自己喜欢的色和直接换掉上面的十六进制数值就可以。

接下来我们在Main.storyboard里加入一个開始游戏的button,然后在默认的ViewController.swift中加入例如以下响应方法:

@IBAction func setupGame(sender: UIButton) {
let game = NumbertailGameController(demension: 4 , threshold: 2048)
self.presentViewController(game, animated: true , completion: nil)
}

然后我们点击XCode中的执行。就能够看到效果了,点击開始游戏,效果例如以下:

大家能够看到此处出现了背景色为我们设置的背景色的视图,以下我们来加入游戏区块:

新建GamebordView.swift文件,这个文件就是我们游戏区块的视图文件。在文件里加入例如以下代码:

import UIKit
class GamebordView : UIView {
var demension : Int //每行(列)区块个数
var tileWidth : CGFloat //每一个小块的宽度
var tilePadding : CGFloat //每一个小块间的间距
//初始化,当中backgroundColor是游戏区块的背景色。foregroundColor是小块的颜色
init(demension d : Int, titleWidth width : CGFloat, titlePadding padding : CGFloat, backgroundColor : UIColor, foregroundColor : UIColor ) {
demension = d
tileWidth = width
tilePadding = padding
let totalWidth = tilePadding + CGFloat(demension)*(tilePadding + tileWidth)
super.init(frame : CGRectMake(0, 0, totalWidth, totalWidth))
self.backgroundColor = backgroundColor
}
}

在这里我们是创建了一个游戏区块的模板,接下来我们在游戏的主控制器NumbertailGameController中加入例如以下代码来初始化一个游戏区块对象并加入到我们的面板中:

override func viewDidLoad() {
super.viewDidLoad()
setupGame()
} func setupGame(){
let viewWidth = view.bounds.size.width
let viewHeight = view.bounds.size.height
//获取游戏区域左上角那个点的x坐标
func xposition2Center(view v : UIView) -> CGFloat{
let vWidth = v.bounds.size.width
return 0.5*(viewWidth - vWidth) }
//获取游戏区域左上角那个点的y坐标
func yposition2Center(order : Int , views : [UIView]) -> CGFloat {
assert(views.count > 0)
let totalViewHeigth = CGFloat(views.count - 1)*viewPadding +
views.map({$0.bounds.size.height}).reduce(verticalViewOffset, combine: {$0 + $1})
let firstY = 0.5*(viewHeight - totalViewHeigth) var acc : CGFloat = 0
for i in 0..<order{
acc += viewPadding + views[i].bounds.size.height
}
return acc + firstY
}
//获取具体每一个区块的边长,即:(游戏区块长度-间隙总和)/块数
let width = (boardWidth - thinPadding*CGFloat(demension + 1))/CGFloat(demension)
//初始化一个游戏区块对象
let gamebord = GamebordView(
demension : demension,
titleWidth: width,
titlePadding: thinPadding,
backgroundColor: UIColor(red : 0x90/255, green : 0x8D/255, blue : 0x80/255, alpha : 1),
foregroundColor:UIColor(red : 0xF9/255, green : 0xF9/255, blue : 0xE3/255, alpha : 0.5)
)
//如今面板中全部的视图对象。眼下仅仅有游戏区块,兴许加入计分板
let views = [gamebord]
//设置游戏区块在整个面板中的的绝对位置。即左上角第一个点
var f = gamebord.frame
f.origin.x = xposition2Center(view: gamebord)
f.origin.y = yposition2Center(0, views: views)
gamebord.frame = f
//将游戏对象加入当前面板中
view.addSubview(gamebord) }

上面的代码中凝视已经非常具体了。大家可能疑问的就是x和y坐标的计算,x坐标非常easy,事实上就是:当前面板总宽度减去游戏区块宽度,剩下的就是空余的宽度,再除以2就是x点的坐标了。y坐标略微复杂点在于,以后会加入计分面板,所以他的值应该是:当前面板总高度减去全部视图的总高度除以2然后在加上在游戏区块之前的视图的总高度,就是游戏区域的y坐标值

其它地方都非常easy,当中的foregroundColor是凝视中有,是以下给游戏区块加入默认小方块时用的颜色。

我们来执行看效果:

能够看到面板已经有了,接下来我们要给面板中加入初始化的半透明小方块,我们在GamebordView中加入例如以下方法:

func setColor(backgroundColor bgcolor : UIColor, foregroundColor forecolor : UIColor){
self.backgroundColor = bgcolor
var xCursor = tilePadding
var yCursor : CGFloat for _ in 0..<demension{
yCursor = tilePadding
for _ in 0..<demension {
let tileFrame = UIView(frame : CGRect(x: xCursor, y: yCursor, width: tileWidth, height: tileWidth))
tileFrame.backgroundColor = forecolor
tileFrame.layer.cornerRadius = 8
addSubview(tileFrame)
yCursor += tilePadding + tileWidth
}
xCursor += tilePadding + tileWidth
} }

这种方法事实上就是在游戏区块中加入了demension*demension个小块。每一个小块的颜色是我们传入的foregroundColor

来执行下看效果:

能够看到基本的游戏面板已经有了,今天先说到这里。大家能够尝试自己把计分板加入进来,当然兴许我也会讲到。

我的博客:blog.scarlettbai.com

我的微信公众号:读书健身编程

欢迎扫码关注我的公众号查看很多其它文章

[swift实战入门]手把手教你编写2048(一)的更多相关文章

  1. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  2. Flutter实战:手把手教你写Flutter Plugin

    前言 如果你对移动端有所关注,那么你一定会听说过Flutter.得益于Google,Flutter一经推出便得受到了广泛关注.很多开发者跃跃欲试,国内部分大厂,诸如美团.闲鱼等团队已经开始了Flutt ...

  3. Apache Beam实战指南 | 手把手教你玩转KafkaIO与Flink

    https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247492538&idx=2&sn=9a2bd9fe2d7fd6 ...

  4. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  5. 手把手教你编写Logstash插件

    使用过Logstash的朋友都知道,它强大的插件生态几乎覆盖了所有的开源框架.从基本的http.tcp.udp.file,到强大的kafa.redis.ganglia,还有丰富的解析工具,比如date ...

  6. 手把手教你编写一个具有基本功能的shell(已开源)

    刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell) ...

  7. 手把手教你编写一个简单的PHP模块形态的后门

    看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web ...

  8. Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件

    Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github ...

  9. Apache Beam实战指南 | 手把手教你玩转大数据存储HdfsIO

    https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247494843&idx=2&sn=0dd20caec76e25 ...

随机推荐

  1. cesium primitive方式 ————http://blog.sina.com.cn/s/blog_15e866bbe0102y0ji.html

    Cesium学习笔记-工具篇17-PrimitivePoint自定义渲染-点 (2018-08-28 16:12:06) 转载▼ 标签: cesium primitive 自定义渲染 shader c ...

  2. winpcap编程设置过滤器之指定获取某个网站的数据

    下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址.  42.62.0.14 我玩的游戏服是84区.网 ...

  3. 常用的HTTP方法有哪些?

    GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器POST:用于传输数据给服务器,主要功能与GET方法类似,但一般推荐使用POST方式.PUT: 传输数据,报文 ...

  4. 第一天 初识Python

    Python基础 一 编程语言     什么是编程语言?    上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人 ...

  5. 只允许特定IP访问本网站的前端写法

    在开发的过程中,有时会遇到只允许特定的几个IP访问.今天来记录一下前端的写法. 首先,引入 <script src="http://pv.sohu.com/cityjson?ie=ut ...

  6. P1387 最大正方形&&P1736 创意吃鱼法

    P1387 最大正方形 P1736 创意吃鱼法 两道类似的$DP$ 转移方程基本上类似于$f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))$ 考虑构成 ...

  7. C++链表STL

    #include <iostream> #include <list> #include <algorithm> #include <stdlib.h> ...

  8. CSU2188: Substring

    Description FST 是一名可怜的 ACMer,他很强,但是经常 fst,所以 rating 一直低迷. 但是重点在于,他真的很强!他发明了一种奇特的加密方式,这种加密方式只有 ACMer ...

  9. String与常量池(JDK1.8)

    ---- 基础知识 String是final类, 并且其方法都被final修饰 String通过char数组来保存字符串 对String对象的任何操作都不会影响到原来的String对象, 所有的改变都 ...

  10. 零基础入门学习Python(14)--字符串:各种奇葩的内置方法

    前言 这节课我们回过头来,再谈一下字符串,或许我们现在再来谈字符串,有些朋友可能觉得没必要了,甚至有些朋友就会觉得,不就是字符串吗,哥闭着眼也能写出来,那其实关于字符串还有很多你不知道的秘密哦.由于字 ...