Swift - 几种使用数组的数据存储模型

在iOS游戏开发中,比如2048游戏。有时会需要存储N×N数组的数据模型(如3×3,4×4等)。这里我们演示了三种实现方式,分别是:一维数组、仿二维数组、自定义二维数组(即矩阵结构)。
功能是根据传入维度初始化数组,同时提供设置值和打印输出所有值的功能,判断数组是否已满(全不为0),以及目前空位的坐标集。

1,使用一维数组实现


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

import Foundation

class GameModel

{

    var dimension:Int = 0

    var tiles:Array<Int>

    

    init(dimension:Int)

    {

        self.dimension = dimension

        self.tiles = Array<Int>(count:self.dimension*self.dimension, repeatedValue:0)

        

    }

    

    //找出空位置

    func emptyPositions()-> [Int]

    {

        

        var emptytiles = Array<Int>()

        //var index:Int

        for i in 0..<(dimension*dimension)

        {

            if(tiles[i] == 0)

            {

                emptytiles.append(i)

            }

        }

        return emptytiles

    }

    

    //位置是否已满

    func isFull()-> Bool

    {

        if(emptyPositions().count == 0)

        {

            return true

        }

        return false

    }

    

    //输出当前数据模型

    func printTiles()

    {

        println(tiles)

        println("输出数据模型数据")

        var count = tiles.count

        for var i=0; i<count; i++

        {

            if (i+1) % Int(dimension) == 0

            {

                println(tiles[i])

            }

            else

            {

                print("\(tiles[i])\t")

            }

        }

        println("")

        

    }

    

    //如果返回 false ,表示该位置 已经有值

    func setPosition(row:Int, col:Int, value:Int) -> Bool

    {

        assert(row >= 0 && row < dimension)

        assert(col >= 0 && col < dimension)

        //3行4列,即  row=2 , col=3  index=2*4+3 = 11

        //4行4列,即  3*4+3 = 15

        var index = self.dimension * row + col

        var val = tiles[index]

        if(val > 0)

        {

            println("该位置(\(row), \(col))已经有值了")

            return false

        }

        tiles[index] = value

        return true

    }

}

2,使用二维数组实现


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

import Foundation

class GameModelBA

{

    var dimension:Int = 0

    var tiles:Array<Array<Int>>

    

    //由外部来传入维度值

    init(dimension:Int)

    {

        self.dimension = dimension

        self.tiles = Array(count:self.dimension,

            repeatedValue:Array(count:self.dimension, repeatedValue:0))

    }

    

    //找出空位置

    func emptyPositions()-> [Int]

    {

        var emptytiles = Array<Int>()

        //var index:Int

        for row in 0..<self.dimension

        {

            for col in 0..<self.dimension

            {

                if(tiles[row][col] == 0)

                {

                    emptytiles.append(tiles[row][col])

                }

            }

        }

        return emptytiles

    }

    

    //如果返回 false ,表示该位置 已经有值

    func setPosition(row:Int, col:Int, value:Int) -> Bool

    {

        assert(row >= 0 && row < dimension)

        assert(col >= 0 && col < dimension)

        

        var val = tiles[row][col]

        if(val > 0)

        {

            println("该位置(\(row), \(col))已经有值了")

            return false

        }

        printTiles()

        //tiles[row][col] = value

        var rdata = Array(count:self.dimension, repeatedValue:0)

        for i in 0..<self.dimension

        {

            rdata[i] = tiles[row][i]

        }

        rdata[col] = value

        tiles[row] = rdata

        return true

    }

    

    //位置是否已满

    func isFull()-> Bool

    {

        if(emptyPositions().count == 0)

        {

            return true

        }

        return false

    }

    

    //输出当前数据模型

    func printTiles()

    {

        println(tiles)

        println("输出数据模型数据")

        var count = tiles.count

        for row in 0..<self.dimension

        {

            for col in 0..<self.dimension

            {

                print("\(tiles[row][col])\t")

            }

            println("")

        }

        println("")

    }

}

3,使用自定义二维数组(即矩阵结构)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

import Foundation

//自定义矩阵数据结构

struct Matrix {

    let rows: Int, columns: Int

    var grid: [Int]

    

    init(rows: Int, columns: Int) {

        self.rows = rows

        self.columns = columns

        grid = Array(count: rows * columns, repeatedValue: 0)

    }

    

    func indexIsValidForRow(row: Int, column: Int) -> Bool {

        return row >= 0 && row < rows && column >= 0 && column < columns

    }

    

    subscript(row: Int, column: Int) -> Int {

        get {

            assert(indexIsValidForRow(row, column: column), "超出范围")

            return grid[(row * columns) + column]

        }

        set {

            assert(indexIsValidForRow(row, column: column), "超出范围")

            grid[(row * columns) + column] = newValue

        }

    }

}

class GameModelMatrix

{

    var dimension:Int = 0

    var tiles:Matrix

    

    //由外部来传入维度值

    init(dimension:Int)

    {

        self.dimension = dimension

        self.tiles = Matrix(rows: self.dimension, columns: self.dimension)

    }

    

    //找出空位置

    func emptyPositions()-> [Int]

    {

        var emptytiles = Array<Int>()

        //var index:Int

        for row in 0..<self.dimension

        {

            for col in 0..<self.dimension

            {

                var val = tiles[row,col]

                if(val == 0)

                {

                    emptytiles.append(tiles[row, col])

                }

            }

        }

        return emptytiles

    }

    

    //如果返回 false ,表示该位置已经有值

    func setPosition(row:Int, col:Int, value:Int) -> Bool

    {

        assert(row >= 0 && row < dimension)

        assert(col >= 0 && col < dimension)

        

        var val = tiles[row,col]

        if(val > 0)

        {

            println("该位置(\(row), \(col))已经有值了")

            return false

        }

        printTiles()

        tiles[row, col] = value

        printTiles()

        return true

    }

    

    //位置是否已满

    func isFull()-> Bool

    {

        if(emptyPositions().count == 0)

        {

            return true

        }

        return false

    }

    

    //输出当前数据模型

    func printTiles()

    {

        println(tiles)

        println("输出数据模型数据")

        for row in 0..<self.dimension

        {

            for col in 0..<self.dimension

            {

                print("\(tiles[row, col])\t")

            }

            println("")

        }

        println("")

    }

}

时间: 2024-12-08 18:36:17

Swift - 几种使用数组的数据存储模型的相关文章

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

Android 数据存储之 SQLiteDatabase

? 惯例:安卓的三种本地的典型数据存储方式 SharedPreferences 以文件格式保存在本地存储中 SQL数据库 本节学习的是 SQLiteDatabase 的使用方式,而在使用方面也只是展示了如何创建数据库,创建表,写入数据.然后查询出来. 因为之前在 word 中操作以表格的形式插入多行代码时遇到了无法高亮,模糊不清的状况,所以本节并不会写出使用方法. 详情请直接访问我的 GitHub 项目:https://github.com/Chenstyle/AndroidTraining 具

Android开发实践 数据存储

所有应用程序必然有数据的输入输出,Android也是一样的,Android应用程序的参数设置.运行状态数据这些都需要保存到外部存储器上,保证关机后数据不丢失,如下是几种Android常见的数据存储方式: SharedPreferences:适合保存少量数据(一些配置信息.积分之类): SQLite:一个真正轻量级数据库,没有后台进程,整个数据库就对应于一个文件,适合大量数据需要存储.访问的情况. 下来详细来看看它们的用法. 1.SharedPreferences SharedPreference

大数据存储到底出了什么问题

当大数据现象在三年前刚刚兴起时,其对于存储企业而言,机房环境监控系统就如同久旱逢甘霖一样,许多存储厂商纷纷积极的投入该领域,并开启最大分贝的营销扬声器鼓吹大数据存储. 然而到了今天,存储行业的现实状况并不乐观. 一方面,大数据发展的潮流不断地全速前进.尽管企业对于大数据的Volume(大批量).Velocity(高速传递).Variety(多样性)等 特征一直保持着高度的兴致,但企业对于大数据技术的采用率仍然很低,主要仍集中在实验阶段.同时,一些大数据初创企业继续吸引着大量的资金,并认为这些大

Android开发工程师文集-提示框,菜单,数据存储,组件篇

提示框,菜单,数据存储,组件篇 Toast Toast.makeText(context, text, 时间).show(); setDuration();//设置时间 setGravity();//位置 获取: 添加toast.getView(); imageView添加到toast中,addView(); LayoutInflater inflater = LayoutInflater.from(this); View toast_view=inflater.inflate(R.id.,nu

计算机数据存储模型

数据存储模型 当今社会,计算机无处不在,我们知道在计算机CPU用来计算数据,内存和Flash用来存储数据.计算机中的数据是现实社会中的内容在计算机中以另外一种方式来存储.我们的图片.文字.视频等资料都可以保存到计算机中.那么计算机又是如何保存这些数据的呢?在计算机中的这些数据到底是以什么方式存在?本节课将会为大家解答这些疑问,让大家从底层理解什么是计算机中的数据. 计算机电路模型 当我们拆开计算机,可以看到里面是一块电路板,上面有各种各位的元器件,有很多绕老绕去的线路,看起来很复杂.所有的计算都

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

(转载)Android数据存储三种方式总结

本文转载自:http://www.cnblogs.com/ITtangtang/p/3920916.html 本文介绍Android平台进行数据存储的三大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 其他: 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据     适用范围:保存少量的数据,且这些数据的格式非常简单:字符

iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core Data--这里暂且不讲 一.应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示 二.应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 Do