github maze

在github上玩迷宫

  1. // ==UserScript==
  2. // @name github maze
  3. // @author wusuluren
  4. // @description 在github上玩迷宫
  5. // @require http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js
  6. // @match *://github.com/*
  7. // @supportURL https://github.com/Wusuluren
  8. // @version 0.0.1
  9. // @grant None
  10. // @namespace https://gf.qytechs.cn/users/194747
  11. // ==/UserScript==
  12. (function () {
  13. 'use strict';
  14. class Position {
  15. constructor(x, y) {
  16. this.x = x
  17. this.y = y
  18. }
  19. }
  20. const CLEAR_COLOR = 0
  21. const WALL_COLOR = 2
  22. const PATH_COLOR = 4
  23. var color_table = new Array()
  24. var Screen_Width, Screen_Height
  25. var map = new Array()
  26. var accessed = new Array()
  27. var unAccessed = new Array()
  28. var row, column
  29. var visit_path = new Array()
  30. var visited = new Array()
  31. var cur_x, cur_y
  32. $(function(){
  33. get_color_table()
  34. clear_screen()
  35. init()
  36. var timer = setInterval(function() {
  37. move()
  38. if (cur_x >= Screen_Width - 2) {
  39. clearInterval(timer)
  40. clear_screen()
  41. return
  42. }
  43. }, 1000)
  44. })
  45. function get_color_table () {
  46. var lis = $('.legend').children()
  47. for (var i = 0; i < lis.length; i++) {
  48. color_table[i] = lis[i].style.backgroundColor
  49. }
  50. }
  51. function draw_point(x, y, depth) {
  52. var gs = document.getElementsByTagName('g')
  53. if (x < gs.length) {
  54. var days = gs[x].getElementsByClassName('day')
  55. if (y < days.length) {
  56. days[y].setAttribute('fill', color_table[depth])
  57. }
  58. }
  59. }
  60. function draw_position(pos, depth) {
  61. var gs = document.getElementsByTagName('g')
  62. if (pos.x < gs.length) {
  63. var days = gs[pos.x].getElementsByClassName('day')
  64. if (pos.y < days.length) {
  65. days[pos.y].setAttribute('fill', color_table[depth])
  66. }
  67. }
  68. }
  69. function draw_path(x, y) {
  70. draw_point(x, y, PATH_COLOR)
  71. }
  72. function clear_path(x, y) {
  73. draw_point(x, y, CLEAR_COLOR)
  74. }
  75. function full (depth) {
  76. var gs = document.getElementsByTagName('g')
  77. if (gs === undefined)
  78. return false
  79. for (var x = 1; x < gs.length; x++) {
  80. for (var y = 0; y < 7; y++)
  81. draw_point(x, y, depth)
  82. }
  83. return true
  84. }
  85. function clear_screen() {
  86. full(CLEAR_COLOR)
  87. }
  88. function draw_map() {
  89. for (var x = 0; x < Screen_Width; x++) {
  90. for (var y = 0; y < Screen_Height; y++) {
  91. if (map[y][x] == 1)
  92. draw_point(x, y, WALL_COLOR)
  93. else
  94. draw_point(x, y, CLEAR_COLOR)
  95. }
  96. }
  97. }
  98. function new_position(x, y) {
  99. return new Position(x, y)
  100. }
  101. function new_random(max) {
  102. return Math.floor(Math.random() * max)
  103. }
  104. function init_map() {
  105. map = new Array()
  106. row = 3
  107. column = (Screen_Width - 1) / 2
  108. for (var y = 0; y < Screen_Height; y++) {
  109. map[y] = new Array()
  110. for (var x = 0; x < Screen_Width-1; x++) {
  111. if (y%2 == 0) {
  112. map[y][x] = 1
  113. } else {
  114. if (x%2 == 1) {
  115. map[y][x] = 1
  116. } else {
  117. map[y][x] = 0
  118. unAccessed.push(0)
  119. }
  120. }
  121. }
  122. }
  123. }
  124. function init_visit_path() {
  125. visit_path = new Array()
  126. for (var y = 0; y < Screen_Height; y++) {
  127. visit_path[y] = new Array()
  128. for (var x = 0; x < Screen_Width-1; x++) {
  129. visit_path[y][x] = 0
  130. }
  131. }
  132. }
  133. // reference: https://www.cnblogs.com/xxhuan/p/6947651.html
  134. function generate_maze() {
  135. const offs = [-column, column, -1, 1]
  136. const offr = [-1, 1, 0, 0]
  137. const offc = [0, 0, -1, 1]
  138. var count = unAccessed.length
  139. var cur = new_random(count)
  140. accessed.push(cur)
  141. unAccessed[cur] = 1
  142. while (accessed.length < count) {
  143. var r = Math.floor(cur / column)
  144. var c = cur % column
  145. var num = 0
  146. var off = -1
  147. while (++num < 5) {
  148. var around = new_random(5)
  149. var nr = r + offr[around]
  150. var nc = c + offc[around]
  151. if ((nr >= 0 && nr < row) &&
  152. (nc >= 0 && nc < column) &&
  153. (unAccessed[cur + offs[around]] === 0)) {
  154. off = around
  155. break
  156. }
  157. }
  158. if (off < 0) {
  159. cur = accessed[new_random(accessed.length)]
  160. } else {
  161. r = 2 * r + 1
  162. c = 2 * c + 2
  163. map[r + offr[off]][c + offc[off]] = 0
  164. cur += offs[off]
  165. unAccessed[cur] = 1
  166. accessed.push(cur)
  167. }
  168. }
  169. // make entry point
  170. map[1][1] = 0
  171. cur_x = 1
  172. cur_y = 1
  173. }
  174. function init() {
  175. var gs = document.getElementsByTagName('g')
  176. Screen_Width = gs.length - 1
  177. Screen_Height = 7
  178. init_map()
  179. generate_maze()
  180. draw_map()
  181. draw_path(cur_x, cur_y)
  182. init_visit_path()
  183. }
  184. function move() {
  185. const off_x = [0, -1, 0, 1]
  186. const off_y = [-1, 0, 1, 0]
  187. clear_path(cur_x, cur_y)
  188. for (var i = 0; i < 4; i++) {
  189. var x = cur_x + off_x[i]
  190. var y = cur_y + off_y[i]
  191. if (map[y][x] == 0 && visit_path[y][x] == 0) {
  192. cur_x = x
  193. cur_y = y
  194. visit_path[y][x] = 1
  195. visited.push(new_position(x, y))
  196. draw_path(cur_x, cur_y)
  197. return
  198. }
  199. }
  200. if (i >= 4) {
  201. var last = visited.pop()
  202. cur_x = last.x
  203. cur_y = last.y
  204. draw_path(cur_x, cur_y)
  205. }
  206. }
  207. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址