// ==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)
}
}
})();