- // ==UserScript==
- // @name github maze
- // @author wusuluren
- // @description 在github上玩迷宫
- // @require http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js
- // @match *://github.com/*
- // @supportURL https://github.com/Wusuluren
- // @version 0.0.1
- // @grant None
- // @namespace https://gf.qytechs.cn/users/194747
- // ==/UserScript==
- (function () {
- 'use strict';
-
- class Position {
- constructor(x, y) {
- this.x = x
- this.y = y
- }
- }
-
- const CLEAR_COLOR = 0
- const WALL_COLOR = 2
- const PATH_COLOR = 4
-
- var color_table = new Array()
- var Screen_Width, Screen_Height
- var map = new Array()
- var accessed = new Array()
- var unAccessed = new Array()
- var row, column
- var visit_path = new Array()
- var visited = new Array()
- var cur_x, cur_y
-
- $(function(){
- get_color_table()
- clear_screen()
- init()
- var timer = setInterval(function() {
- move()
- if (cur_x >= Screen_Width - 2) {
- clearInterval(timer)
- clear_screen()
- return
- }
- }, 1000)
- })
-
- function get_color_table () {
- var lis = $('.legend').children()
- for (var i = 0; i < lis.length; i++) {
- color_table[i] = lis[i].style.backgroundColor
- }
- }
-
- function draw_point(x, y, depth) {
- var gs = document.getElementsByTagName('g')
- if (x < gs.length) {
- var days = gs[x].getElementsByClassName('day')
- if (y < days.length) {
- days[y].setAttribute('fill', color_table[depth])
- }
- }
- }
-
- function draw_position(pos, depth) {
- var gs = document.getElementsByTagName('g')
- if (pos.x < gs.length) {
- var days = gs[pos.x].getElementsByClassName('day')
- if (pos.y < days.length) {
- days[pos.y].setAttribute('fill', color_table[depth])
- }
- }
- }
-
- function draw_path(x, y) {
- draw_point(x, y, PATH_COLOR)
- }
-
- function clear_path(x, y) {
- draw_point(x, y, CLEAR_COLOR)
- }
-
- function full (depth) {
- var gs = document.getElementsByTagName('g')
- if (gs === undefined)
- return false
- for (var x = 1; x < gs.length; x++) {
- for (var y = 0; y < 7; y++)
- draw_point(x, y, depth)
- }
- return true
- }
-
- function clear_screen() {
- full(CLEAR_COLOR)
- }
-
- function draw_map() {
- for (var x = 0; x < Screen_Width; x++) {
- for (var y = 0; y < Screen_Height; y++) {
- if (map[y][x] == 1)
- draw_point(x, y, WALL_COLOR)
- else
- draw_point(x, y, CLEAR_COLOR)
- }
- }
- }
-
- function new_position(x, y) {
- return new Position(x, y)
- }
-
- function new_random(max) {
- return Math.floor(Math.random() * max)
- }
-
- function init_map() {
- map = new Array()
- row = 3
- column = (Screen_Width - 1) / 2
- for (var y = 0; y < Screen_Height; y++) {
- map[y] = new Array()
- for (var x = 0; x < Screen_Width-1; x++) {
- if (y%2 == 0) {
- map[y][x] = 1
- } else {
- if (x%2 == 1) {
- map[y][x] = 1
- } else {
- map[y][x] = 0
- unAccessed.push(0)
- }
- }
- }
- }
- }
-
- function init_visit_path() {
- visit_path = new Array()
- for (var y = 0; y < Screen_Height; y++) {
- visit_path[y] = new Array()
- for (var x = 0; x < Screen_Width-1; x++) {
- visit_path[y][x] = 0
- }
- }
- }
-
- // reference: https://www.cnblogs.com/xxhuan/p/6947651.html
- function generate_maze() {
- const offs = [-column, column, -1, 1]
- const offr = [-1, 1, 0, 0]
- const offc = [0, 0, -1, 1]
-
- var count = unAccessed.length
- var cur = new_random(count)
- accessed.push(cur)
- unAccessed[cur] = 1
-
- while (accessed.length < count) {
- var r = Math.floor(cur / column)
- var c = cur % column
- var num = 0
- var off = -1
-
- while (++num < 5) {
- var around = new_random(5)
- var nr = r + offr[around]
- var nc = c + offc[around]
- if ((nr >= 0 && nr < row) &&
- (nc >= 0 && nc < column) &&
- (unAccessed[cur + offs[around]] === 0)) {
- off = around
- break
- }
- }
-
- if (off < 0) {
- cur = accessed[new_random(accessed.length)]
- } else {
- r = 2 * r + 1
- c = 2 * c + 2
- map[r + offr[off]][c + offc[off]] = 0
- cur += offs[off]
- unAccessed[cur] = 1
- accessed.push(cur)
- }
- }
-
- // make entry point
- map[1][1] = 0
- cur_x = 1
- cur_y = 1
- }
-
- function init() {
- var gs = document.getElementsByTagName('g')
- Screen_Width = gs.length - 1
- Screen_Height = 7
-
- init_map()
- generate_maze()
- draw_map()
- draw_path(cur_x, cur_y)
-
- init_visit_path()
- }
-
- function move() {
- const off_x = [0, -1, 0, 1]
- const off_y = [-1, 0, 1, 0]
-
- clear_path(cur_x, cur_y)
-
- for (var i = 0; i < 4; i++) {
- var x = cur_x + off_x[i]
- var y = cur_y + off_y[i]
- if (map[y][x] == 0 && visit_path[y][x] == 0) {
- cur_x = x
- cur_y = y
- visit_path[y][x] = 1
- visited.push(new_position(x, y))
- draw_path(cur_x, cur_y)
- return
- }
- }
-
- if (i >= 4) {
- var last = visited.pop()
- cur_x = last.x
- cur_y = last.y
- draw_path(cur_x, cur_y)
- }
- }
- })();