安恒杯部分writeup【2】

Input


<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title>Input</title>
</head>
<body>
<div align="center">
 <input type="text" id="flag" style="width: 200px;margin-left: 100px;" value="" />
 <input type="button" name="" id="" onclick="check();" value="提交"/>
</div>
</body>
<script>
  function check(){
    var flag = document.getElementById("flag").value;
    var str = "d84d9657e5e5e" || 0;
    var str = str + ("ad2ad3fe" && 2);
    var str = str + "a2da9494b8" + "ddea4fd4";
    var str = str.split("").reverse().join("");
    if (str == flag){
      alert("恭喜你已经找到flag!");
    }
  }
</script>
</html>
PayLoad

var str = "d84d9657e5e5e" || 0;
var str = str + ("ad2ad3fe" && 2);
var str = str + "a2da9494b8" + "ddea4fd4";
var str = str.split("").reverse().join("");
console.log(str);

Game


<!DOCTYPE html>
<html>
 <head>
  <title>Game</title>
  <link rel="stylesheet" type="text/css" href="./css/game.css" />
 </head>
  <body>
   <div id="game-area" tabindex="0"></div>
   <script type="text/javascript" src="./js/game.js"></script>
   <script type="text/javascript">
     var mySnakeBoard = new SNAKE.Board({
       boardContainer: "game-area",
       fullScreen: true
     });
  </script>
 </body>
</html>
./css/game.css

/*
JavaScript Snake
By Patrick Gillespie
http://patorjk.com/games/snake
*/
body {
	margin:0px;
	padding:0px;
}
#game-area {
	margin:0px;
	padding:0px;
}
#game-area:focus {
	outline:none;
}
a.snake-link,a.snake-link:link,a.snake-link:visited {
	color:#FCFC54;
}
a.snake-link:hover {
	color:#FfFf54;
}
.snake-panel-component {
	position:absolute;
	font-family:Verdana,arial,helvetica,sans-serif;
	font-size:14px;
	color:#ffffff;
	text-align:center;
	background-color:#FC5454;
	padding:8px;
	margin:0px;
}
.snake-snakebody-block {
	margin:0px;
	padding:0px;
	background-color:#FF0000;
	position:absolute;
	border:0px solid #000080;
	background-repeat:no-repeat;
}
.snake-snakebody-alive {
	background-image:url('data:image/png;
	base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAABGdBTUEAALGPC/xhBQAAAC5JREFUOE9jZGBYwUABWPHnTwgZCGLrqGaiA280wIgOKkhyHA2woRZg4BgjBwEAYYUNxwyvHTQAAAAASUVORK5CYII=');
}
.snake-snakebody-dead {
	background-image:url('data:image/png;
	base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6AAAdTAAAOpgAAA6lwAAF2+XqZnUAAAAe0lEQVR4nGJkYFjBQC4ACCAWID5wQIIMnQ4OLwACiIlsa4EAIIAo0gwQQBRpBgggijQDBBBFmgECiCLNAAFEkWaAAKJIM0AAUaQZIIAo0gwQQBRpBgggijQDBBBFmgECiCLNAAFEkWaAAKJIM0AAUaQZIIAYKSmGAAIMAOydBHklgXKUAAAAAElFTkSuQmCC');
}
.snake-food-block {
	margin:0px;
	padding:0px;
	background-color:#FF0000;
	border:0px solid #000080;
	position:absolute;
}
.snake-playing-field {
	margin:0px;
	padding:0px;
	position:absolute;
	background-color:#0000A8;
	border:0px solid #0000A8;
}
.snake-game-container {
	margin:0px;
	padding:0px;
	border-width:0px;
	border-style:none;
	zoom:1;
	background-color:#FC5454;
	position:relative;
}
.snake-welcome-dialog {
	padding:8px;
	margin:0px;
	background-color:#000000;
	color:#ffffff;
	font-family:Verdana,arial,helvetica,sans-serif;
	font-size:14px;
	position:absolute;
	top:50%;
	left:50%;
	width:300px;
	height:150px;
	margin-top:-100px;
	margin-left:-158px;
	text-align:center;
	display:block;
}
.snake-try-again-dialog {
	padding:8px;
	margin:0px;
	background-color:#000000;
	color:#ffffff;
	font-family:Verdana,arial,helvetica,sans-serif;
	font-size:14px;
	position:absolute;
	top:50%;
	left:50%;
	width:300px;
	height:100px;
	margin-top:-75px;
	margin-left:-158px;
	text-align:center;
	display:none;
}
./js/game.js

var SNAKE = SNAKE || {};

/**
* @method addEventListener
* @param {Object} obj The object to add an event listener to.
* @param {String} event The event to listen for.
* @param {Function} funct The function to execute when the event is triggered.
* @param {Boolean} evtCapturing True to do event capturing, false to do event bubbling.
*/

SNAKE.addEventListener = (function() {
  if (window.addEventListener) {
    return function(obj, event, funct, evtCapturing) {
      obj.addEventListener(event, funct, evtCapturing);
    };
  } else if (window.attachEvent) {
    return function(obj, event, funct) {
      obj.attachEvent("on" + event, funct);
    };
  }
})();

/**
* @method removeEventListener
* @param {Object} obj The object to remove an event listener from.
* @param {String} event The event that was listened for.
* @param {Function} funct The function that was executed when the event is triggered.
* @param {Boolean} evtCapturing True if event capturing was done, false otherwise.
*/

SNAKE.removeEventListener = (function() {
  if (window.removeEventListener) {
    return function(obj, event, funct, evtCapturing) {
      obj.removeEventListener(event, funct, evtCapturing);
    };
  } else if (window.detachEvent) {
    return function(obj, event, funct) {
      obj.detachEvent("on" + event, funct);
    };
  }
})();

/**
* This class manages the snake which will reside inside of a SNAKE.Board object.
* @class Snake
* @constructor
* @namespace SNAKE
* @param {Object} config The configuration object for the class. Contains playingBoard (the SNAKE.Board that this snake resides in), startRow and startCol.
*/
SNAKE.Snake = SNAKE.Snake || (function() {

  // -------------------------------------------------------------------------
  // Private static variables and methods
  // -------------------------------------------------------------------------
  var instanceNumber = 0;
  var blockPool = [];

  var SnakeBlock = function() {
    this.elm = null;
    this.elmStyle = null;
    this.row = -1;
    this.col = -1;
    this.xPos = -1000;
    this.yPos = -1000;
    this.next = null;
    this.prev = null;
  };

  // this function is adapted from the example at http://greengeckodesign.com/blog/2007/07/get-highest-z-index-in-javascript.html
  function getNextHighestZIndex(myObj) {
    var highestIndex = 0,
    currentIndex = 0,
    ii;
    for (ii in myObj) {
      if (myObj[ii].elm.currentStyle) {
        currentIndex = parseFloat(myObj[ii].elm.style["z-index"], 10);
      } else if (window.getComputedStyle) {
        currentIndex = parseFloat(document.defaultView.getComputedStyle(myObj[ii].elm, null).getPropertyValue("z-index"), 10);
      }
      if (!isNaN(currentIndex) && currentIndex > highestIndex) {
        highestIndex = currentIndex;
      }
    }
    return (highestIndex + 1);
  }

  // -------------------------------------------------------------------------
  // Contructor + public and private definitions
  // -------------------------------------------------------------------------
  /*
        config options:
            playingBoard - the SnakeBoard that this snake belongs too.
            startRow - The row the snake should start on.
            startCol - The column the snake should start on.
    */
  return function(config) {

    if (!config || !config.playingBoard) {
      return;
    }

    // ----- private variables -----
    var me = this,
    playingBoard = config.playingBoard,
    myId = instanceNumber++,
    growthIncr = 5,
    moveQueue = [],
    // a queue that holds the next moves of the snake
    currentDirection = 1,
    // 0: up, 1: left, 2: down, 3: right
    columnShift = [0, 1, 0, -1],
    rowShift = [ - 1, 0, 1, 0],
    xPosShift = [],
    yPosShift = [],
    snakeSpeed = 75,
    isDead = false;

    // ----- public variables -----
    me.snakeBody = {};
    me.snakeBody["b0"] = new SnakeBlock(); // create snake head
    me.snakeBody["b0"].row = config.startRow || 1;
    me.snakeBody["b0"].col = config.startCol || 1;
    me.snakeBody["b0"].xPos = me.snakeBody["b0"].row * playingBoard.getBlockWidth();
    me.snakeBody["b0"].yPos = me.snakeBody["b0"].col * playingBoard.getBlockHeight();
    me.snakeBody["b0"].elm = createSnakeElement();
    me.snakeBody["b0"].elmStyle = me.snakeBody["b0"].elm.style;
    playingBoard.getBoardContainer().appendChild(me.snakeBody["b0"].elm);
    me.snakeBody["b0"].elm.style.left = me.snakeBody["b0"].xPos + "px";
    me.snakeBody["b0"].elm.style.top = me.snakeBody["b0"].yPos + "px";
    me.snakeBody["b0"].next = me.snakeBody["b0"];
    me.snakeBody["b0"].prev = me.snakeBody["b0"];

    me.snakeLength = 1;
    me.snakeHead = me.snakeBody["b0"];
    me.snakeTail = me.snakeBody["b0"];
    me.snakeHead.elm.className = me.snakeHead.elm.className.replace(/\bsnake-snakebody-dead\b/, '');
    me.snakeHead.elm.className += " snake-snakebody-alive";

    // ----- private methods -----
    function createSnakeElement() {
      var tempNode = document.createElement("div");
      tempNode.className = "snake-snakebody-block";
      tempNode.style.left = "-1000px";
      tempNode.style.top = "-1000px";
      tempNode.style.width = playingBoard.getBlockWidth() + "px";
      tempNode.style.height = playingBoard.getBlockHeight() + "px";
      return tempNode;
    }

    function createBlocks(num) {
      var tempBlock;
      var tempNode = createSnakeElement();

      for (var ii = 1; ii < num; ii++) {
        tempBlock = new SnakeBlock();
        tempBlock.elm = tempNode.cloneNode(true);
        tempBlock.elmStyle = tempBlock.elm.style;
        playingBoard.getBoardContainer().appendChild(tempBlock.elm);
        blockPool[blockPool.length] = tempBlock;
      }

      tempBlock = new SnakeBlock();
      tempBlock.elm = tempNode;
      playingBoard.getBoardContainer().appendChild(tempBlock.elm);
      blockPool[blockPool.length] = tempBlock;
    }

    // ----- public methods -----
    /**
        * This method is called when a user presses a key. It logs arrow key presses in "moveQueue", which is used when the snake needs to make its next move.
        * @method handleArrowKeys
        * @param {Number} keyNum A number representing the key that was pressed.
        */
    /*
            Handles what happens when an arrow key is pressed. 
            Direction explained (0 = up, etc etc)
                    0
                  3   1
                    2
        */
    me.handleArrowKeys = function(keyNum) {
      if (isDead) {
        return;
      }

      var snakeLength = me.snakeLength;
      var lastMove = moveQueue[0] || currentDirection;

      switch (keyNum) {
      case 37:
        if (lastMove !== 1 || snakeLength === 1) {
          moveQueue.unshift(3); //SnakeDirection = 3;
        }
        break;
      case 38:
        if (lastMove !== 2 || snakeLength === 1) {
          moveQueue.unshift(0); //SnakeDirection = 0;
        }
        break;
      case 39:
        if (lastMove !== 3 || snakeLength === 1) {
          moveQueue.unshift(1); //SnakeDirection = 1;
        }
        break;
      case 40:
        if (lastMove !== 0 || snakeLength === 1) {
          moveQueue.unshift(2); //SnakeDirection = 2;
        }
        break;
      }
    };

    /**
        * This method is executed for each move of the snake. It determines where the snake will go and what will happen to it. This method needs to run quickly.
        * @method go
        */
    me.go = function() {

      var oldHead = me.snakeHead,
      newHead = me.snakeTail,
      myDirection = currentDirection,
      grid = playingBoard.grid; // cache grid for quicker lookup
      me.snakeTail = newHead.prev;
      me.snakeHead = newHead;

      // clear the old board position
      if (grid[newHead.row] && grid[newHead.row][newHead.col]) {
        grid[newHead.row][newHead.col] = 0;
      }

      if (moveQueue.length) {
        myDirection = currentDirection = moveQueue.pop();
      }

      newHead.col = oldHead.col + columnShift[myDirection];
      newHead.row = oldHead.row + rowShift[myDirection];
      newHead.xPos = oldHead.xPos + xPosShift[myDirection];
      newHead.yPos = oldHead.yPos + yPosShift[myDirection];

      if (!newHead.elmStyle) {
        newHead.elmStyle = newHead.elm.style;
      }

      newHead.elmStyle.left = newHead.xPos + "px";
      newHead.elmStyle.top = newHead.yPos + "px";

      // check the new spot the snake moved into
      if (grid[newHead.row][newHead.col] === 0) {
        grid[newHead.row][newHead.col] = 1;
        setTimeout(function() {
          me.go();
        },
        snakeSpeed);
      } else if (grid[newHead.row][newHead.col] > 0) {
        me.handleDeath();
      } else if (grid[newHead.row][newHead.col] === playingBoard.getGridFoodValue()) {
        grid[newHead.row][newHead.col] = 1;
        me.eatFood();
        setTimeout(function() {
          me.go();
        },
        snakeSpeed);
      }
    };

    /**
        * This method is called when it is determined that the snake has eaten some food.
        * @method eatFood
        */
    me.eatFood = function() {
      if (blockPool.length <= growthIncr) {
        createBlocks(growthIncr * 2);
      }
      var blocks = blockPool.splice(0, growthIncr);

      var ii = blocks.length,
      index, prevNode = me.snakeTail;
      while (ii--) {
        index = "b" + me.snakeLength++;
        me.snakeBody[index] = blocks[ii];

        if (me.snakeLength > 2500) {゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
        }

        me.snakeBody[index].prev = prevNode;
        me.snakeBody[index].elm.className = me.snakeHead.elm.className.replace(/\bsnake-snakebody-dead\b/, '') me.snakeBody[index].elm.className += " snake-snakebody-alive";
        prevNode.next = me.snakeBody[index];
        prevNode = me.snakeBody[index];

      }
      me.snakeTail = me.snakeBody[index];
      me.snakeTail.next = me.snakeHead;
      me.snakeHead.prev = me.snakeTail;

      playingBoard.foodEaten();
    };

    /**
        * This method handles what happens when the snake dies.
        * @method handleDeath
        */
    me.handleDeath = function() {
      me.snakeHead.elm.style.zIndex = getNextHighestZIndex(me.snakeBody);
      me.snakeHead.elm.className = me.snakeHead.elm.className.replace(/\bsnake-snakebody-alive\b/, '') me.snakeHead.elm.className += " snake-snakebody-dead";

      isDead = true;
      playingBoard.handleDeath();
      moveQueue.length = 0;
    };

    /**
        * This method sets a flag that lets the snake be alive again.
        * @method rebirth
        */
    me.rebirth = function() {
      isDead = false;
    };

    /**
        * This method reset the snake so it is ready for a new game.
        * @method reset
        */
    me.reset = function() {
      if (isDead === false) {
        return;
      }

      var blocks = [],
      curNode = me.snakeHead.next,
      nextNode;
      while (curNode !== me.snakeHead) {
        nextNode = curNode.next;
        curNode.prev = null;
        curNode.next = null;
        blocks.push(curNode);
        curNode = nextNode;
      }
      me.snakeHead.next = me.snakeHead;
      me.snakeHead.prev = me.snakeHead;
      me.snakeTail = me.snakeHead;
      me.snakeLength = 1;

      for (var ii = 0; ii < blocks.length; ii++) {
        blocks[ii].elm.style.left = "-1000px";
        blocks[ii].elm.style.top = "-1000px";
        blocks[ii].elm.className = me.snakeHead.elm.className.replace(/\bsnake-snakebody-dead\b/, '') blocks[ii].elm.className += " snake-snakebody-alive";
      }

      blockPool.concat(blocks);
      me.snakeHead.elm.className = me.snakeHead.elm.className.replace(/\bsnake-snakebody-dead\b/, '') me.snakeHead.elm.className += " snake-snakebody-alive";
      me.snakeHead.row = config.startRow || 1;
      me.snakeHead.col = config.startCol || 1;
      me.snakeHead.xPos = me.snakeHead.row * playingBoard.getBlockWidth();
      me.snakeHead.yPos = me.snakeHead.col * playingBoard.getBlockHeight();
      me.snakeHead.elm.style.left = me.snakeHead.xPos + "px";
      me.snakeHead.elm.style.top = me.snakeHead.yPos + "px";
    };

    // ---------------------------------------------------------------------
    // Initialize
    // ---------------------------------------------------------------------
    createBlocks(growthIncr * 2);
    xPosShift[0] = 0;
    xPosShift[1] = playingBoard.getBlockWidth();
    xPosShift[2] = 0;
    xPosShift[3] = -1 * playingBoard.getBlockWidth();

    yPosShift[0] = -1 * playingBoard.getBlockHeight();
    yPosShift[1] = 0;
    yPosShift[2] = playingBoard.getBlockHeight();
    yPosShift[3] = 0;
  };
})();

/**
* This class manages the food which the snake will eat.
* @class Food
* @constructor
* @namespace SNAKE
* @param {Object} config The configuration object for the class. Contains playingBoard (the SNAKE.Board that this food resides in).
*/

SNAKE.Food = SNAKE.Food || (function() {

  // -------------------------------------------------------------------------
  // Private static variables and methods
  // -------------------------------------------------------------------------
  var instanceNumber = 0;

  function getRandomPosition(x, y) {
    return Math.floor(Math.random() * (y + 1 - x)) + x;
  }

  // -------------------------------------------------------------------------
  // Contructor + public and private definitions
  // -------------------------------------------------------------------------
  /*
        config options:
            playingBoard - the SnakeBoard that this object belongs too.
    */
  return function(config) {

    if (!config || !config.playingBoard) {
      return;
    }

    // ----- private variables -----
    var me = this;
    var playingBoard = config.playingBoard;
    var fRow, fColumn;
    var myId = instanceNumber++;

    var elmFood = document.createElement("div");
    elmFood.setAttribute("id", "snake-food-" + myId);
    elmFood.className = "snake-food-block";
    elmFood.style.width = playingBoard.getBlockWidth() + "px";
    elmFood.style.height = playingBoard.getBlockHeight() + "px";
    elmFood.style.left = "-1000px";
    elmFood.style.top = "-1000px";
    playingBoard.getBoardContainer().appendChild(elmFood);

    // ----- public methods -----
    /**
        * @method getFoodElement
        * @return {DOM Element} The div the represents the food.
        */
    me.getFoodElement = function() {
      return elmFood;
    };

    /**
        * Randomly places the food onto an available location on the playing board.
        * @method randomlyPlaceFood
        */
    me.randomlyPlaceFood = function() {
      // if there exist some food, clear its presence from the board
      if (playingBoard.grid[fRow] && playingBoard.grid[fRow][fColumn] === playingBoard.getGridFoodValue()) {
        playingBoard.grid[fRow][fColumn] = 0;
      }

      var row = 0,
      col = 0,
      numTries = 0;

      var maxRows = playingBoard.grid.length - 1;
      var maxCols = playingBoard.grid[0].length - 1;

      while (playingBoard.grid[row][col] !== 0) {
        row = getRandomPosition(1, maxRows);
        col = getRandomPosition(1, maxCols);

        // in some cases there may not be any room to put food anywhere
        // instead of freezing, exit out
        numTries++;
        if (numTries > 20000) {
          row = -1;
          col = -1;
          break;
        }
      }

      playingBoard.grid[row][col] = playingBoard.getGridFoodValue();
      fRow = row;
      fColumn = col;
      elmFood.style.top = row * playingBoard.getBlockHeight() + "px";
      elmFood.style.left = col * playingBoard.getBlockWidth() + "px";
    };
  };
})();

/**
* This class manages playing board for the game.
* @class Board
* @constructor
* @namespace SNAKE
* @param {Object} config The configuration object for the class. Set fullScreen equal to true if you want the game to take up the full screen, otherwise, set the top, left, width and height parameters.
*/

SNAKE.Board = SNAKE.Board || (function() {

  // -------------------------------------------------------------------------
  // Private static variables and methods
  // -------------------------------------------------------------------------
  var instanceNumber = 0;

  // this function is adapted from the example at http://greengeckodesign.com/blog/2007/07/get-highest-z-index-in-javascript.html
  function getNextHighestZIndex(myObj) {
    var highestIndex = 0,
    currentIndex = 0,
    ii;
    for (ii in myObj) {
      if (myObj[ii].elm.currentStyle) {
        currentIndex = parseFloat(myObj[ii].elm.style["z-index"], 10);
      } else if (window.getComputedStyle) {
        currentIndex = parseFloat(document.defaultView.getComputedStyle(myObj[ii].elm, null).getPropertyValue("z-index"), 10);
      }
      if (!isNaN(currentIndex) && currentIndex > highestIndex) {
        highestIndex = currentIndex;
      }
    }
    return (highestIndex + 1);
  }

  /*
        This function returns the width of the available screen real estate that we have
    */
  function getClientWidth() {
    var myWidth = 0;
    if (typeof window.innerWidth === "number") {
      myWidth = window.innerWidth; //Non-IE
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
      myWidth = document.documentElement.clientWidth; //IE 6+ in 'standards compliant mode'
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
      myWidth = document.body.clientWidth; //IE 4 compatible
    }
    return myWidth;
  }
  /*
        This function returns the height of the available screen real estate that we have
    */
  function getClientHeight() {
    var myHeight = 0;
    if (typeof window.innerHeight === "number") {
      myHeight = window.innerHeight; //Non-IE
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
      myHeight = document.documentElement.clientHeight; //IE 6+ in 'standards compliant mode'
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
      myHeight = document.body.clientHeight; //IE 4 compatible
    }
    return myHeight;
  }

  // -------------------------------------------------------------------------
  // Contructor + public and private definitions
  // -------------------------------------------------------------------------
  return function(inputConfig) {

    // --- private variables ---
    var me = this,
    myId = instanceNumber++,
    config = inputConfig || {},
    MAX_BOARD_COLS = 250,
    MAX_BOARD_ROWS = 250,
    blockWidth = 20,
    blockHeight = 20,
    GRID_FOOD_VALUE = -1,
    // the value of a spot on the board that represents snake food, MUST BE NEGATIVE
    myFood, mySnake, boardState = 1,
    // 0: in active; 1: awaiting game start; 2: playing game
    myKeyListener,
    // Board components
    elmContainer, elmPlayingField, elmAboutPanel, elmLengthPanel, elmWelcome, elmTryAgain;

    // --- public variables ---
    me.grid = [];

    // ---------------------------------------------------------------------
    // private functions
    // ---------------------------------------------------------------------
    function createBoardElements() {
      elmPlayingField = document.createElement("div");
      elmPlayingField.setAttribute("id", "playingField");
      elmPlayingField.className = "snake-playing-field";

      SNAKE.addEventListener(elmPlayingField, "click",
      function() {
        elmContainer.focus();
      },
      false);

      elmAboutPanel = document.createElement("div");
      elmAboutPanel.className = "snake-panel-component";
      elmAboutPanel.innerHTML = "";

      elmLengthPanel = document.createElement("div");
      elmLengthPanel.className = "snake-panel-component";
      elmLengthPanel.innerHTML = "";

      elmWelcome = createWelcomeElement();
      elmTryAgain = createTryAgainElement();

      SNAKE.addEventListener(elmContainer, "keyup",
      function(evt) {
        if (!evt) var evt = window.event;
        evt.cancelBubble = true;
        if (evt.stopPropagation) {
          evt.stopPropagation();
        }
        if (evt.preventDefault) {
          evt.preventDefault();
        }
        return false;
      },
      false);

      elmContainer.className = "snake-game-container";

      elmContainer.appendChild(elmPlayingField);
      elmContainer.appendChild(elmAboutPanel);
      elmContainer.appendChild(elmLengthPanel);
      elmContainer.appendChild(elmWelcome);
      elmContainer.appendChild(elmTryAgain);

      mySnake = new SNAKE.Snake({
        playingBoard: me,
        startRow: 2,
        startCol: 2
      });
      myFood = new SNAKE.Food({
        playingBoard: me
      });

      elmWelcome.style.zIndex = 1000;
    }
    function maxBoardWidth() {
      return MAX_BOARD_COLS * me.getBlockWidth();
    }
    function maxBoardHeight() {
      return MAX_BOARD_ROWS * me.getBlockHeight();
    }

    function createWelcomeElement() {
      var tmpElm = document.createElement("div");
      tmpElm.id = "sbWelcome" + myId;
      tmpElm.className = "snake-welcome-dialog";

      var welcomeTxt = document.createElement("div");
      var fullScreenText = "";
      if (config.fullScreen) {
        fullScreenText = "2.请使用Firefox或者chrome运行";
      }
      welcomeTxt.innerHTML = "1.按箭头开始游戏,祝君好运 :) " + "
" + fullScreenText + "

"; var welcomeStart = document.createElement("button"); welcomeStart.appendChild(document.createTextNode("Play Game")); var loadGame = function() { SNAKE.removeEventListener(window, "keyup", kbShortcut, false); tmpElm.style.display = "none"; me.setBoardState(1); me.getBoardContainer().focus(); }; var kbShortcut = function(evt) { if (!evt) var evt = window.event; var keyNum = (evt.which) ? evt.which: evt.keyCode; if (keyNum === 32 || keyNum === 13) { loadGame(); } }; SNAKE.addEventListener(window, "keyup", kbShortcut, false); SNAKE.addEventListener(welcomeStart, "click", loadGame, false); tmpElm.appendChild(welcomeTxt); tmpElm.appendChild(welcomeStart); return tmpElm; } function createTryAgainElement() { var tmpElm = document.createElement("div"); tmpElm.id = "sbTryAgain" + myId; tmpElm.className = "snake-try-again-dialog"; var tryAgainTxt = document.createElement("div"); tryAgainTxt.innerHTML = "啧啧,你out了! :(

"; var tryAgainStart = document.createElement("button"); tryAgainStart.appendChild(document.createTextNode("Play Again?")); var reloadGame = function() { tmpElm.style.display = "none"; me.resetBoard(); me.setBoardState(1); me.getBoardContainer().focus(); }; var kbTryAgainShortcut = function(evt) { if (boardState !== 0 || tmpElm.style.display !== "block") { return; } if (!evt) var evt = window.event; var keyNum = (evt.which) ? evt.which: evt.keyCode; if (keyNum === 32 || keyNum === 13) { reloadGame(); } }; SNAKE.addEventListener(window, "keyup", kbTryAgainShortcut, true); SNAKE.addEventListener(tryAgainStart, "click", reloadGame, false); tmpElm.appendChild(tryAgainTxt); tmpElm.appendChild(tryAgainStart); return tmpElm; } // --------------------------------------------------------------------- // public functions // --------------------------------------------------------------------- /** * Resets the playing board for a new game. * @method resetBoard */ me.resetBoard = function() { SNAKE.removeEventListener(elmContainer, "keydown", myKeyListener, false); mySnake.reset(); elmLengthPanel.innerHTML = "Length: 1"; me.setupPlayingField(); }; /** * Gets the current state of the playing board. There are 3 states: 0 - Welcome or Try Again dialog is present. 1 - User has pressed "Start Game" on the Welcome or Try Again dialog but has not pressed an arrow key to move the snake. 2 - The game is in progress and the snake is moving. * @method getBoardState * @return {Number} The state of the board. */ me.getBoardState = function() { return boardState; }; /** * Sets the current state of the playing board. There are 3 states: 0 - Welcome or Try Again dialog is present. 1 - User has pressed "Start Game" on the Welcome or Try Again dialog but has not pressed an arrow key to move the snake. 2 - The game is in progress and the snake is moving. * @method setBoardState * @param {Number} state The state of the board. */ me.setBoardState = function(state) { boardState = state; }; /** * @method getGridFoodValue * @return {Number} A number that represents food on a number representation of the playing board. */ me.getGridFoodValue = function() { return GRID_FOOD_VALUE; }; /** * @method getPlayingFieldElement * @return {DOM Element} The div representing the playing field (this is where the snake can move). */ me.getPlayingFieldElement = function() { return elmPlayingField; }; /** * @method setBoardContainer * @param {DOM Element or String} myContainer Sets the container element for the game. */ me.setBoardContainer = function(myContainer) { if (typeof myContainer === "string") { myContainer = document.getElementById(myContainer); } if (myContainer === elmContainer) { return; } elmContainer = myContainer; elmPlayingField = null; me.setupPlayingField(); }; /** * @method getBoardContainer * @return {DOM Element} */ me.getBoardContainer = function() { return elmContainer; }; /** * @method getBlockWidth * @return {Number} */ me.getBlockWidth = function() { return blockWidth; }; /** * @method getBlockHeight * @return {Number} */ me.getBlockHeight = function() { return blockHeight; }; /** * Sets up the playing field. * @method setupPlayingField */ me.setupPlayingField = function() { if (!elmPlayingField) { createBoardElements(); } // create playing field // calculate width of our game container var cWidth, cHeight; if (config.fullScreen === true) { cTop = 0; cLeft = 0; cWidth = getClientWidth() - 5; cHeight = getClientHeight() - 5; document.body.style.backgroundColor = "#FC5454"; } else { cTop = config.top; cLeft = config.left; cWidth = config.width; cHeight = config.height; } // define the dimensions of the board and playing field var wEdgeSpace = me.getBlockWidth() * 2 + (cWidth % me.getBlockWidth()); var fWidth = Math.min(maxBoardWidth() - wEdgeSpace, cWidth - wEdgeSpace); var hEdgeSpace = me.getBlockHeight() * 3 + (cHeight % me.getBlockHeight()); var fHeight = Math.min(maxBoardHeight() - hEdgeSpace, cHeight - hEdgeSpace); elmContainer.style.left = cLeft + "px"; elmContainer.style.top = cTop + "px"; elmContainer.style.width = cWidth + "px"; elmContainer.style.height = cHeight + "px"; elmPlayingField.style.left = me.getBlockWidth() + "px"; elmPlayingField.style.top = me.getBlockHeight() + "px"; elmPlayingField.style.width = fWidth + "px"; elmPlayingField.style.height = fHeight + "px"; // the math for this will need to change depending on font size, padding, etc // assuming height of 14 (font size) + 8 (padding) var bottomPanelHeight = hEdgeSpace - me.getBlockHeight(); var pLabelTop = me.getBlockHeight() + fHeight + Math.round((bottomPanelHeight - 30) / 2) + "px"; elmAboutPanel.style.top = pLabelTop; elmAboutPanel.style.width = "450px"; elmAboutPanel.style.left = Math.round(cWidth / 2) - Math.round(450 / 2) + "px"; elmLengthPanel.style.top = pLabelTop; elmLengthPanel.style.left = cWidth - 120 + "px"; // if width is too narrow, hide the about panel if (cWidth < 700) { elmAboutPanel.style.display = "none"; } else { elmAboutPanel.style.display = "block"; } me.grid = []; var numBoardCols = fWidth / me.getBlockWidth() + 2; var numBoardRows = fHeight / me.getBlockHeight() + 2; for (var row = 0; row < numBoardRows; row++) { me.grid[row] = []; for (var col = 0; col < numBoardCols; col++) { if (col === 0 || row === 0 || col === (numBoardCols - 1) || row === (numBoardRows - 1)) { me.grid[row][col] = 1; // an edge } else { me.grid[row][col] = 0; // empty space } } } myFood.randomlyPlaceFood(); // setup event listeners myKeyListener = function(evt) { if (!evt) var evt = window.event; var keyNum = (evt.which) ? evt.which: evt.keyCode; if (me.getBoardState() === 1) { if (! (keyNum >= 37 && keyNum <= 40)) { return; } // if not an arrow key, leave // This removes the listener added at the #listenerX line SNAKE.removeEventListener(elmContainer, "keydown", myKeyListener, false); myKeyListener = function(evt) { if (!evt) var evt = window.event; var keyNum = (evt.which) ? evt.which: evt.keyCode; mySnake.handleArrowKeys(keyNum); evt.cancelBubble = true; if (evt.stopPropagation) { evt.stopPropagation(); } if (evt.preventDefault) { evt.preventDefault(); } return false; }; SNAKE.addEventListener(elmContainer, "keydown", myKeyListener, false); mySnake.rebirth(); mySnake.handleArrowKeys(keyNum); me.setBoardState(2); // start the game! mySnake.go(); } evt.cancelBubble = true; if (evt.stopPropagation) { evt.stopPropagation(); } if (evt.preventDefault) { evt.preventDefault(); } return false; }; // Search for #listenerX to see where this is removed SNAKE.addEventListener(elmContainer, "keydown", myKeyListener, false); }; /** * This method is called when the snake has eaten some food. * @method foodEaten */ me.foodEaten = function() { elmLengthPanel.innerHTML = "Length: " + mySnake.snakeLength; myFood.randomlyPlaceFood(); }; /** * This method is called when the snake dies. * @method handleDeath */ me.handleDeath = function() { var index = Math.max(getNextHighestZIndex(mySnake.snakeBody), getNextHighestZIndex({ tmp: { elm: myFood.getFoodElement() } })); elmContainer.removeChild(elmTryAgain); elmContainer.appendChild(elmTryAgain); elmTryAgain.style.zIndex = index; elmTryAgain.style.display = "block"; me.setBoardState(0); }; // --------------------------------------------------------------------- // Initialize // --------------------------------------------------------------------- config.fullScreen = (typeof config.fullScreen === "undefined") ? false: config.fullScreen; config.top = (typeof config.top === "undefined") ? 0 : config.top; config.left = (typeof config.left === "undefined") ? 0 : config.left; config.width = (typeof config.width === "undefined") ? 400 : config.width; config.height = (typeof config.height === "undefined") ? 400 : config.height; if (config.fullScreen) { SNAKE.addEventListener(window, "resize", function() { me.setupPlayingField(); }, false); } me.setBoardState(0); if (config.boardContainer) { me.setBoardContainer(config.boardContainer); } }; // end return function })();
PayLoad

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_')
//PS:具体是什么自己运行
//PSS:如果解出'Flag{ hahahah wrong!! :(}'就说明方法错了
//PSSS:这道题的中文名字叫做玩个蛇皮
//PSSSS:我当初就真的把他当蛇皮玩了
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注