黑白棋及回退功能实现(scala)

背景

如下图,如何使用程序实现每个棋子在棋盘上的位置,如何记录上一步的棋盘盘面(回退),采用什么数据结构实现

思考:棋盘盘面是一个二维表,应该是一个二维数组,因为这个二维数组很多默认值是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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值