github snake

在github上玩贪吃蛇

Instalar este script¿?
Script recomendado por el autor

Puede que también te guste github rainmeter.

Instalar este script

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name           github snake
// @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://greasyfork.org/users/194747
// ==/UserScript==
(function () {
    'use strict';
  
    class Position {
      constructor(x, y) {
        this.x = x
        this.y = y      
      }
    }
  
    class SnakeNode extends Position {
      constructor(x, y, prev, next) {
        super(x, y)
        this.prev = prev
        this.next = next
      }
    }
  
    const CLEAR_COLOR = 0
    const SNAKE_COLOR = 2
    const FOOD_COLOR = 4
    
    var color_table = new Array()
    var snake_head, snake_tail
    var food
    var Screen_Width, Screen_Height
    var map
    
    $(function(){     
        get_color_table()
        full(0)
        init()
        var timer = setInterval(function() {
         if (!move_snake()) {
           clearInterval(timer)
           full(0)
           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 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 new_position() {
      while(1) {
        var x = Math.floor(Math.random() * Screen_Width)
        var y = Math.floor(Math.random() * Screen_Height)
        if (map[y][x] === undefined || map[y][x] == 0)
          break
      }        
      return new Position(x, y)
    }
  
    function same_position(a, b) {
      return a.x == b.x && a.y == b.y
    }
  
    function init() {
      var gs = document.getElementsByTagName('g')
      Screen_Width = gs.length
      Screen_Height = 7
      
      map = new Array()
      for (var y = 0; y < Screen_Height; y++) {
        map[y] = new Array()
        for (var x = 0; x < Screen_Width; x++)
          map[y][x] = 0
      }
      
      var pos = new_position()
      snake_head = new SnakeNode(pos.x, pos.y, undefined, undefined)
      snake_tail = snake_head
      draw_position(snake_head, SNAKE_COLOR)
      map[pos.y][pos.x] = 1
      
      food = new_position()
      draw_position(food, FOOD_COLOR)
    }
  
    function in_screen(x, y) {
      return (x >= 0 && x < Screen_Width) && (y >= 0 && y < Screen_Height)
    }
  
    function get_safe_x(x) {
      if (x < 0) 
          return Screen_Width - 1
      if (x >= Screen_Width)
          return 0
      return x
    }
  
    function get_safe_y(y) {
      if (y < 0) 
          return Screen_Height - 1
      if (y >= Screen_Height)
          return 0
      return y
    }
  
    function get_next_step() {
      var gap_x = [0, -1, 0, 1]
      var gap_y = [-1, 0, 1, 0]
      var min_score = Infinity
      var min_idx = 0
      for (var i = 0; i < 4; i++) {
        var x = get_safe_x(snake_head.x + gap_x[i])
        var y = get_safe_y(snake_head.y + gap_y[i])
        if (map[y][x] == 0) {
          var score = Math.abs(food.x - x) + Math.abs(food.y - y)
          if (score < min_score) {
            min_score = score
            min_idx = i
          }
        }
      }
      return new Position(get_safe_x(snake_head.x + gap_x[min_idx]), get_safe_y(snake_head.y + gap_y[min_idx]))
    }
   
    function move_snake() {
      var next_step = get_next_step()
      
      if (!judge_game(next_step)) {
        return false
      }
      
      var new_head = new SnakeNode(next_step.x, next_step.y, undefined, snake_head)
      snake_head.prev = new_head
      snake_head = new_head
      var discard_node = snake_tail
      snake_tail = snake_tail.prev
      snake_tail.next = undefined
      
      map[snake_head.y][snake_head.x] = 1
      map[discard_node.y][discard_node.x] = 0
      
      draw_position(discard_node, CLEAR_COLOR)
      draw_position(snake_head, SNAKE_COLOR)
      
      return true
    }
  
    function judge_game(next_step) {
      if (same_position(next_step, food)) {
          var pos = new_position()
          var node = new SnakeNode(pos.x, pos.y, snake_tail, undefined)
          snake_tail.next = node
          snake_tail = node
          map[snake_tail.y][snake_tail.x] = 1
        
          food = new_position()
          draw_position(food, FOOD_COLOR)
          return true
      }
      if (map[next_step.y][next_step.x] == 1) {
        return false
      }
      return true
    }
})();