背景
如下图,如何使用程序实现每个棋子在棋盘上的位置,如何记录上一步的棋盘盘面(回退),采用什么数据结构实现
思考:棋盘盘面是一个二维表,应该是一个二维数组,因为这个二维数组很多默认值是0,因此这里可以引入稀疏数组的概念
稀疏数组和二维数组的关系
思路
1.默认棋盘是空(一个默认值为0的二维数组)
2.下了黑棋的位置就改为1,白棋子的位置改为2
3.每一次的操作都记录为一个稀疏数组保存起来,为回退取值做准备
代码
package com.example.scala.data
import scala.collection.mutable.ArrayBuffer
object PieceDemo {
/**
* 打印棋盘盘面
*
* @param data
*/
def printArray(data: Array[Array[Int]]) = {
data.foreach(d => {
d.foreach(x => print(x + " "))
println()
})
}
/**
* 将棋盘的二维数组转换成稀疏数组
*
* @param data
* @return
*/
def toArrayBuffer(data: Array[Array[Int]]) = {
val records = ArrayBuffer[Record]()
records.append(Record(data.length, data(0).length, 0))
for (i <- 0 until data.length) {
val d = data(i)
for (e <- 0 until d.length) {
if (d(e) > 0) {
records.append(Record(i, e, d(e)))
}
}
}
records
}
/**
* 将稀疏数组转换回盘面
*
* @param records
* @return
*/
def toArray(records: ArrayBuffer[Record]): Array[Array[Int]] = {
val record = records(0)
val data = Array.ofDim[Int](record.row, record.col)
for (i <- 1 until records.length) {
val r = records(i)
data(r.row)(r.col) = r.value
}
data
}
/**
* 打印稀疏数组
*
* @param records
*/
def printBufferArray(records: ArrayBuffer[Record]) = {
records.foreach(x => {
println(x)
})
}
def main(args: Array[String]): Unit = {
val (rows, cols) = (7, 7)
var data = Array.ofDim[Int](rows, cols)
println("............原始棋盘..............")
printArray(data)
data(1)(1) = 1
data(3)(4) = 1
data(2)(3) = 1
data(4)(2) = 1
println("............改动后棋盘..............")
printArray(data)
//第一次更改
val records1 = toArrayBuffer(data)
println("............转换成稀疏存储棋盘数据..............")
printBufferArray(records1)
data = toArray(records1)
println("............转换回棋盘..............")
printArray(data)
//定义变量将每一步的操作都记录下来
val details = ArrayBuffer[ArrayBuffer[Record]]()
data(0)(0) = 2
data(3)(0) = 2
//第二次更改
val records2 = toArrayBuffer(data)
details.append(records1)
details.append(records2)
println("...................................")
println(".............当前棋盘................")
printArray(toArray(details(1)))
println(".............上一步棋盘................")
printArray(toArray(details(0)))
}
/**
* 记录每一个位置上的值
*
* @param row 行
* @param col 列
* @param value 对应的值
*/
case class Record(row: Int, col: Int, value: Int) {
override def toString: String = s"row:$row col:$col value:$value"
}
}
### 输出结果
............原始棋盘..............
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
............改动后棋盘..............
0 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
............转换成稀疏存储棋盘数据..............
row:7 col:7 value:0
row:1 col:1 value:1
row:2 col:3 value:1
row:3 col:4 value:1
row:4 col:2 value:1
............转换回棋盘..............
0 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
...................................
.............当前棋盘................
2 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0
2 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
.............上一步棋盘................
0 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0