1.需求: 编写五子棋程序存盘退出和续上盘功能

image.png

按照原始方式的二维数组问题

因为该二维数组很多值是默认值 0,因此记录了很多没有意义的数剧

2.基本介绍

当一个数组中大部分元素为 0 或者为同一个值的数组时候,可以使用稀疏数组来保存该数组

稀疏数组处理方法:

1 记录数组一共几行几列,有多少个不同值

2 思想: 把具有不同元素的行列记录在一个小规模数组中

image.png

实现

1. 使用稀疏数组,来保留二维数组(地图,棋盘等)

2. 把稀疏数组存盘, 并且可以重新恢复原来的二维码数组

3. 思路分析

代码实现

  1. package main
  2. import (
  3. "bufio"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "os"
  8. )
  9. type ValNode struct {
  10. Row int
  11. Col int
  12. Val int
  13. }
  14. func main() {
  15. var chessMap [11][11]int
  16. chessMap[1][2] = 1 // 黑子
  17. chessMap[2][3] = 2 // 白子
  18. // 源数组.
  19. for _, v := range chessMap {
  20. for _, v2 := range v {
  21. fmt.Printf("%d\t", v2)
  22. }
  23. fmt.Printf("\n")
  24. }
  25. // 存储到稀疏数组
  26. var sparseArr []ValNode
  27. valNode := ValNode{
  28. Row: 11,
  29. Col: 11,
  30. Val: 0,
  31. }
  32. sparseArr = append(sparseArr, valNode)
  33. for i, v := range chessMap {
  34. for j, v2 := range v {
  35. if v2 != 0 {
  36. valNode = ValNode{
  37. Row: i,
  38. Col: j,
  39. Val: v2,
  40. }
  41. sparseArr = append(sparseArr, valNode)
  42. }
  43. }
  44. }
  45. // 输出稀疏数组
  46. for i, node := range sparseArr {
  47. fmt.Printf("%v : %v \n", i, node)
  48. }
  49. // 存盘
  50. filePath := "/Users/mac/go/src/go_code/05/0501/exp1/chess.data"
  51. file, err := os.OpenFile(filePath, os.O_CREATE | os.O_RDWR, 0666)
  52. if err != nil {
  53. fmt.Printf("write open err : %v \n", err)
  54. }
  55. defer file.Close()
  56. wf := bufio.NewWriter(file)
  57. fmt.Printf("sparseArr = %v \n", sparseArr)
  58. cont, err := json.Marshal(sparseArr)
  59. if err != nil {
  60. fmt.Printf("json err: %v \n", err)
  61. }
  62. fmt.Printf("sparseArr json := %v \n", string(cont))
  63. wf.WriteString(string(cont))
  64. wf.Flush()
  65. // 读取数据
  66. file2, err := os.Open(filePath)
  67. if err != nil {
  68. fmt.Printf("read open err : %v \n", err)
  69. }
  70. defer file2.Close()
  71. rf := bufio.NewReader(file2)
  72. str := ""
  73. for {
  74. str, err = rf.ReadString('\n')
  75. if (err == io.EOF) {
  76. break
  77. }
  78. }
  79. fmt.Printf("str = %v \n", str)
  80. var arr1 []ValNode
  81. err = json.Unmarshal([]byte(str), &arr1)
  82. fmt.Printf("arr1 = %v \n", arr1)
  83. var chessCap ValNode
  84. chessCap = arr1[0]
  85. fmt.Printf("chess cap : %v \n", chessCap)
  86. // 恢复数组
  87. var chessMap2 [11][11]int
  88. //var chessMap2 [r][c]int
  89. for i, valNode := range sparseArr {
  90. if i == 0 {
  91. continue
  92. }
  93. chessMap2[valNode.Row][valNode.Col] = valNode.Val
  94. }
  95. // 源数组.
  96. for _, v := range chessMap2 {
  97. for _, v2 := range v {
  98. fmt.Printf("%d\t", v2)
  99. }
  100. fmt.Printf("\n")
  101. }
  102. }