swift 实战项目之 2048游戏

之前看过网上很多写小项目的文章,但大多是旧版或者不全的,这里推出swift5  项目之2048给大家分享

【2020年更新,建议直接看源码:源码地址】

本文将要使用的思路和上面2020更新的源码思路不一样,本文的思路清晰但是代码复杂。

1.首先新建一个项目,自动生成我们的viewController,添加如下代码,构造最简单的起始页面:

class ViewController:UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

view.backgroundColor = UIColor.black

let wid =view.bounds.width

let hei =view.bounds.height

// 想点button跳转入游戏界面,因此

let startButton1 =UIButton(frame:CGRect(x:0, y:hei/3, width: wid, height:20))

startButton1.setTitleColor(UIColor.red, for: .normal)

startButton1.setTitle("2048",for: .normal)

//文字居中

startButton1.contentHorizontalAlignment = .center

startButton1.addTarget(self,action:#selector(start1),for: .touchUpInside)

view.addSubview(startButton1)

}

// 点击事件:需要新建一个swift文件:GamePanel.swift ,继承UIViewController。点击按钮后就进这个ViewController界面。

func start1(){

self.present( GamePanel(),  animated: false, completion: nil)

}

GamePanel.swift:

import Foundation

import UIKit

class GamePanel:UIViewController{

let dimension:Int =4   // 四行四列,等项目做完,试试自定义行列数。

let boardwidth:CGFloat!    //  游戏区域宽度

let scorewidth:CGFloat=50    // 记分板垂直方向的宽度

let thinPadding:CGFloat=5   // 最小滑块的间距

var unit:CGFloat!   //  最小滑块的边长

var x:CGFloat!    //  包容小方块的大正方形的位置 x,y,也就是游戏区域

var y:CGFloat!

说到这,我们有大正方形,有最小滑块,有记分板,那就得先新建三个类:

1、新建: GameView.swift,是大正方形,里面包着16个小正方形

然后:

var game:GameView!

2、新建: ScoreView.swift,是记分板,显示分数

然后:

var scoreBoard:ScoreView!

3、一会再说,大正方形还没写呢,何谈小块?

构造方法

init( ) {

boardwidth = 400 // 设成多宽随意

super.init(nibName: nil, bundle: nil)   // 这句没意思 可照抄

}

override func viewDidLoad() {

super.viewDidLoad()

准备好游戏区域大正方形的位置 x,y,为了居中,下面是简单的计算

x = (view.bounds.width-boardwidth)/2

y = (view.bounds.height-boardwidth+scorewidth)/2

self.view.backgroundColor =UIColor(red:0.95, green:0.83, blue:1, alpha:1)

展示大正方形和积分板的俩方法:

showGridView()

showScoreBoard()

}

requiredinit?(coderaDecoder:NSCoder) {

fatalError("init(coder:) has not beenimplemented")

}

GamePanel是负责控制游戏的(Controller),其他view要单设类重写

这两个方法可以在写完那两个类的构造方法再来写,现在先写个方法头扔这就行

1 展示大正方形:

func showGridView(){

unit = (boardwidth-thinPadding*CGFloat(dimension+1))/CGFloat(dimension)

game =GameView(unit:unit,dime:dimension,x:x,y:y,thin:thinPadding)  //一会写

view.addSubview(game)

}

2 展示记分板,

func showScoreBoard(){

scoreBoard =ScoreView(unit:unit,y:y,screenX:view.bounds.width) //一会写

scoreBoard.score =0

view.addSubview(scoreBoard)

}

}

大方块GameView.swift:

import Foundation

import UIKit

class GameView:UIView {

var dimension:Int!

var unitwidth:CGFloat!

var thinPadding:CGFloat!

var x:CGFloat!

var y:CGFloat!    // 这几个属性看之前注释 一样的意思

构造方法

init(unit:CGFloat,dime:Int,x:CGFloat,y:CGFloat,thin:CGFloat){

self.x= x

self.y= y

self.thinPadding= thin

self.dimension= dime

self.unitwidth= unit

let wid = thinPadding!*CGFloat(dime+1)+unit*CGFloat(dime)

确定frame位置:

super.init(frame:CGRect(x:x, y: y, width: wid, height: wid))

调用下面的方法初始化小单元方格 :

setGrid()

}

required init?(coderaDecoder: NSCoder) {

fatalError("init(coder:) has not beenimplemented")

}

//初始化空的小单元们  PS。这只是初始化单元的位置,不是最小块。

func setGrid(){

layer.cornerRadius =10

clipsToBounds = true

backgroundColor =UIColor(red: 0.73, green: 1, blue: 0.85, alpha: 1)

两个for循环初始化位置:

var tempy:CGFloat= 0

for _ in  0..<dimension{

var tempx:CGFloat =0

for _ in 0..<dimension{

let viewUnit=UIView(frame:CGRect(x:thinPadding+tempx, y:thinPadding+tempy, width:unitwidth,height: unitwidth))

viewUnit.layer.cornerRadius =8

viewUnit.clipsToBounds =true

viewUnit.backgroundColor=UIColor(red: 0.9, green: 1, blue: 0.97, alpha: 1)

addSubview(viewUnit)

tempx += unitwidth+thinPadding

}

tempy += unitwidth+thinPadding

}

}

下面是记分板类ScoreView.swift  继承 UILabel 。你也可以继承UIView。我为了省事就这样了。。

import Foundation

import UIKit

class ScoreView:UILabel{

属性观察者 传score值

var score:Int =0{

didSet{

text ="SCORE:\(score)"

}

}

初始化

init(unit:CGFloat,y:CGFloat,screenX:CGFloat){

let height:CGFloat=68   // 随便

let width =2.5*unit    // 自己定

根据屏幕和游戏区位置确定记分板位置:

let localX = (screenX-width)/2

let localY = (y-height)/2

super.init(frame:CGRect(x: localX, y: localY, width: width,height: height))

backgroundColor =UIColor(red: 0.47, green: 0.84, blue: 0.97, alpha: 1)

textColor = UIColor.red

textAlignment = .center

}

required init?(coderaDecoder: NSCoder) {

fatalError("init(coder:) has not beenimplemented")

}

}

写完排排错 运行看看什么样子

iOS swift 2048小游戏开发教程(一)相关推荐

  1. 微信小游戏开发教程-游戏实现3

    微信小游戏开发教程-游戏实现3 对象池 由于游戏过程中会创建很多临时对象,这些对象很快又不再使用,垃圾回收器也能帮我们主动回收这部分垃圾,但是回收时间不可控制,同时增大了创建对象的开销,所以我们使用对 ...

  2. 微信小游戏开发教程-游戏实现2

    微信小游戏开发教程-游戏实现2 绘制地面 类似于绘制背景,读者自行完成代码.src/runtime/land.js 简易View系统 坐标布局对于复杂的页面来说维护相当困难,因此这里我们引入布局的概念 ...

  3. 微信小游戏开发教程-游戏实现1

    微信小游戏开发教程-游戏实现1 概述 微信开发者工具官方提供一个飞机大战的游戏Demo,这里我们不再使用这个demo,我们以FlappyBird为例,为了让读者更加容易理解. 源码 https://g ...

  4. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  5. 微信小游戏开发教程-新建项目

    微信小游戏开发教程-新建项目 1. 新建小游戏项目 我们这回使用空项目,不要勾选使用模板创建. 2. 添加小游戏必要文件 项目创建好以后我们发现缺少一些必要的文件,我们手动添加即可: game.jso ...

  6. 【cocos 2d微信小游戏开发教程】基础使用笔记分享(三)

    富文本(RichText) 优点:自定义颜色,大小,描边,还能加图片.对于复杂的文本表现力更好. 缺点:cocos的富文本是由Label组件拼装实现的.低版本会打断合批.Label太多导致卡顿. 常用 ...

  7. 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享

    今天带来的是塔防游戏制作攻略! 点击这里来下载工程文件, 点击这里可以下载工程中所用的素材哦~ 预览状态时敌人会从四个生成点随机生成,并且会自动寻路绕过黑色墙体走向红色终点.点击黑色墙体可以创建炮塔, ...

  8. Flash网页小游戏开发教程

    架设服务器 地图 程序员 转载于:https://www.cnblogs.com/2008nmj/p/10593355.html

  9. 一文梳理2048小游戏从开发到上云全流程

    摘要:本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实践的全流程 前言 本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实 ...

  10. Swift实战之2048小游戏

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

最新文章

  1. JavaScript学习--闭包
  2. Access数据库操作软件研究
  3. 「软件测试基础」理论篇之软件测试概论
  4. iOS 处理键盘遮挡TextField、TextView问题
  5. 虚拟机ping不通百度等外部网络
  6. 扫地机器人欠压检测电路_扫地机器人智能家居必备!靠传感器感知外界环境?...
  7. EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本...
  8. 918国际导航网V4.2版整站源码
  9. 面向消费者的自动文本分析(Automated Text Analysis for Consumer Research) 2017 JCR 论文阅读
  10. php学习笔记0001 变量作用域
  11. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
  12. 从队列、二叉树到优先队列
  13. C++ 内存分配(new,operator new)详解
  14. 博弈论算法常见模型整理
  15. mysql数据库如何查看表空间_MYSQL:查看的数据库表空间
  16. Python2—0704笔记
  17. unity打包的安卓游戏在某些设备显示异常问题解决
  18. java中String s=abc及String s=new String(abc)详解
  19. java打字训练课程设计_JavaFX+Java打字练习软件(布局篇)
  20. 嵌入式系统概述及特点

热门文章

  1. [ 4w字 ] JavaSE总结(基础+高级+多线程+面试题)
  2. VMware - 虚拟机系统中无法使用键盘
  3. java爬虫乱码_网络爬虫的乱码处理
  4. 博弈论笔记:重复博弈
  5. mysql ocp 题库部分解析
  6. 疫情地图 | 低代码制作全国重点管控地区行政区地图(截至4月16日)
  7. 网关 架构演进及实践
  8. 把html转换成word,怎么把html转换成word
  9. 项目日报模板_能力再强也要常向领导汇报工作,掌握万能模板,不做职场小透明...
  10. 【Excel技巧必知必会】