说明:

  1. 因为没有学习Go语言的GUI开发-GTK,因此我们在后台完成迷宫问题.
  2. 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关
  3. 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化
  4. 思考:如何求出最短路径?

image.png

代码

  1. // 迷宫
  2. package main
  3. import "fmt"
  4. // 老鼠找路
  5. func SetWay(mazeMap *[8][7]int, i int, j int) bool {
  6. var flag bool = false
  7. if mazeMap[6][5] == 2 {
  8. // 终点
  9. flag = true
  10. } else {
  11. if mazeMap[i][j] == 0 {
  12. // 标记可以走
  13. mazeMap[i][j] = 2
  14. // 这个点可以探测, 上下左右四个方向 实际走的路线是 "W"形状
  15. /* if SetWay(mazeMap, i-1, j) { // 上
  16. flag = true
  17. } else if SetWay(mazeMap, i+1, j) { // 下
  18. flag = true
  19. } else if SetWay(mazeMap, i, j-1) { // 左
  20. flag = true
  21. } else if SetWay(mazeMap, i, j+1) { // 右
  22. flag = true
  23. } else {
  24. mazeMap[i][j] = 3
  25. flag = false
  26. } */
  27. // 更换 "下右上左" 的策略
  28. if SetWay(mazeMap, i+1, j) { // 下
  29. flag = true
  30. } else if SetWay(mazeMap, i, j+1) { // 右
  31. flag = true
  32. } else if SetWay(mazeMap, i+1, j) { // 上
  33. flag = true
  34. } else if SetWay(mazeMap, i, j-1) { // 左
  35. flag = true
  36. } else {
  37. mazeMap[i][j] = 3
  38. flag = false
  39. }
  40. } else if mazeMap[i][j] == 1 {
  41. // 这个点是墙,不能探测
  42. flag = false
  43. }
  44. }
  45. return flag
  46. }
  47. func main() {
  48. // 创建二维数组 地图迷宫
  49. /*
  50. 1. 如果元素为 1 代表墙
  51. 2. 0 代表没有走过的点
  52. 3. 2 代表可以行走
  53. 4. 3 代表走过的路,但是没有走通
  54. */
  55. var mazeMap [8][7]int // 8 行 7 列
  56. // 初始化地图上的墙
  57. // 上下的墙
  58. for i := 0; i < 7; i++ {
  59. mazeMap[0][i] = 1
  60. mazeMap[7][i] = 1
  61. }
  62. // 左右的墙
  63. for i := 0; i < 8; i++ {
  64. mazeMap[i][0] = 1
  65. mazeMap[i][6] = 1
  66. }
  67. // 设置墙
  68. mazeMap[3][1] = 1
  69. mazeMap[3][2] = 1
  70. // mazeMap[1][2] = 1
  71. // mazeMap[2][2] = 1
  72. // 输出查看
  73. for i := 0; i < 8; i++ {
  74. for j := 0; j < 7; j++ {
  75. fmt.Print(mazeMap[i][j], " ")
  76. }
  77. fmt.Println()
  78. }
  79. /*
  80. 1 1 1 1 1 1 1
  81. 1 0 0 0 0 0 1
  82. 1 0 0 0 0 0 1
  83. 1 0 0 0 0 0 1
  84. 1 0 0 0 0 0 1
  85. 1 0 0 0 0 0 1
  86. 1 0 0 0 0 0 1
  87. 1 1 1 1 1 1 1
  88. */
  89. // 测试
  90. fmt.Println("探测")
  91. SetWay(&mazeMap, 1, 1)
  92. // 输出查看
  93. for i := 0; i < 8; i++ {
  94. for j := 0; j < 7; j++ {
  95. fmt.Print(mazeMap[i][j], " ")
  96. }
  97. fmt.Println()
  98. }
  99. }
  100. /*
  101. // 没有设置任何墙, 上下左右的策略
  102. 1 1 1 1 1 1 1
  103. 1 2 2 2 2 2 1
  104. 1 2 2 2 2 2 1
  105. 1 2 2 2 2 2 1
  106. 1 2 2 2 2 2 1
  107. 1 2 2 2 2 2 1
  108. 1 1 1 1 1 1 1
  109. // 设置两个墙, 上下左右的策略
  110. 1 1 1 1 1 1 1
  111. 1 2 2 2 2 2 1
  112. 1 2 2 2 2 2 1
  113. 1 1 1 2 2 2 1
  114. 1 3 3 2 2 2 1
  115. 1 3 3 2 2 2 1
  116. 1 3 3 2 2 2 1
  117. 1 1 1 1 1 1 1
  118. // 设置两个墙,下右上左的策略
  119. 1 1 1 1 1 1 1
  120. 1 2 0 0 0 0 1
  121. 1 2 2 2 0 0 1
  122. 1 1 1 2 0 0 1
  123. 1 0 0 2 0 0 1
  124. 1 0 0 2 0 0 1
  125. 1 0 0 2 2 2 1
  126. 1 1 1 1 1 1 1
  127. // 设置墙堵死
  128. 1 1 1 1 1 1 1
  129. 1 3 1 0 0 0 1
  130. 1 3 1 0 0 0 1
  131. 1 1 1 0 0 0 1
  132. 1 0 0 0 0 0 1
  133. 1 0 0 0 0 0 1
  134. 1 0 0 0 0 0 1
  135. 1 1 1 1 1 1 1
  136. */