IFE-2016-SP_task35_square_follow_directives_multi

by baishusama

HTML

<div class="panel">
	<div id="board">
		<!-- div.grid*100 -->
		<!-- <div id="square"></div> -->
	</div>
	<div class="controller">
		<div class="btnWrapper">
			<input type="button" value="Run" class="run" />
			<input type="button" value="Refresh" class="refresh" />
		</div>
		<div class="dirWrapper">
			<label for="directives">
				<ol id="lineNum">
					<li></li>
				</ol>
				<textarea name="directives" id="directives" cols="30" rows="10"></textarea>
			</label>
			<!-- <input type="text" id="directives" /> -->
		</div>
	</div>
</div>
<sidebar id="cheatSheet">
	<h4>Directive Cheat Sheet</h4>
	<ul>
		<li>GO - 前进</li>
		<li>TUN LEF - 向左转</li>
		<li>TUN RIG - 向右转</li>
		<li>TUN BAC - 向后转</li>
		<li>TRA TOP - 向上转并前进</li>
		<li>TRA RIG - 向右转并前进</li>
		<li>TRA BOT - 向下转并前进</li>
		<li>TRA LEF - 向左转并前进</li>
		<li>MOV TOP - 向上移动</li>
		<li>MOV RIG - 向右移动</li>
		<li>MOV BOT - 向下移动</li>
		<li>MOV LEF - 向左移动</li>
	</ul>
	<p>其中,GO 命令、TRA 命令和 MOV 命令可以添加一个数字做为参数,用来制定移动的步数。</p>
</sidebar>

CSS

@charset "UTF-8";
/* debug 'Invalid US-ASCII character' */
body {
  margin: 0; }

.panel {
  counter-reset: rowIndex; }

/*--------------------
    区域 & 小方块
--------------------*/
#board {
  position: relative;
  margin: 100px auto 20px;
  border: 2px solid;
  width: 398px;
  height: 398px;
  counter-reset: colIndex; }

.grid {
  position: relative;
  float: left;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  border-right: 2px solid #ddd;
  border-bottom: 2px solid #ddd;
  width: 40px;
  height: 40px;
  background-color: mistyrose;
  /* [!!note] 注意 nth-child 里的 n 必须写在最前,否则不会生效 */
  /* 添加数字 */ }
  .grid.clearfix {
    clear: both; }
  .grid:nth-child(-n + 10):before {
    position: absolute;
    top: -24px;
    left: 8px;
    display: block;
    /* counter-reset by #board */
    counter-increment: colIndex;
    content: counter(colIndex);
    width: 24px;
    height: 24px;
    line-height: 24px;
    text-align: center;
    font-family: Helvetica; }
  .grid:nth-child(10n + 1):after {
    position: absolute;
    top: 8px;
    left: -24px;
    display: block;
    /* counter-reset by .panel */
    counter-increment: rowIndex;
    content: counter(rowIndex);
    width: 24px;
    height: 24px;
    line-height: 24px;
    text-align: center;
    font-family: Helvetica; }
  .grid.downmost {
    border-bottom: none;
    height: 38px; }
  .grid.rightmost {
    border-right: none;
    width: 38px; }

#square {
  position: absolute;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  border-top: 8px solid salmon;
  width: 40px;
  height: 40px;
  background-color: lightpink;
  transition: all .5s; }
  #square:before, #square:after {
    position: absolute;
    top: -6px;
    display: block;
    content: '\a0';
    border-radius: 5px / 15px;
    width: 10px;
    height: 30px;
    background-color: salmon; }
  #square:before {
    left: 6px;
    transform: rotate(5deg); }
  #square:after {
   ...

JavaScript

// 解决 IE 和非 IE 浏览器在事件绑定方面的兼容性
function addEventHandler(elem, event, handler) {
    if (elem.addEventListener) {
        elem.addEventListener(event, handler, false);
    } else if (elem.attachEvent) {
        elem.attachEvent("on" + event, handler);
    } else {
        elem["on" + event] = handler;
    }
}

// 以下关于 css 前缀的处理方法借鉴自 jQuery :jquery-3.1.0.js
function getProperName(cssPropertyName) {
    var name = cssPropertyName;
    var cssPrefixes = ["Webkit", "Moz", "ms"];
    var emptyStyle = document.createElement("div").style;
    if (name in emptyStyle) {
        return name;
    }

    var capName = name[0].toUpperCase + name.slice(1);
    var i = cssPrefixes.length;
    while (i--) {
        name = cssPrefixes[i] + capName;
        if (name in emptyStyle) {
            return name;
        }
    }
}

function generateInlineStyle(degree) {
    var deg = degree || 0;
    return 'rotate(' + deg + 'deg)';
}

// 用于偷懒的 $ 方法
function $(selector) {
    var elem = null;
    if (selector.indexOf('#') === 0) {
        elem = document.getElementById(selector.slice(1));
    } else if (selector.indexOf('.') === 0) {
        elem = document.getElementsByClassName(selector.slice(1));
    }
    return elem;
}

// 用于添加类名
function addClassName(elem, clsname) {
    var names = elem.className.split(/\s/);
    var index = names.indexOf(clsname);
    if (index === -1) {
        names.push(clsname);
        elem.className = names.join(' ');
        return true;
    }
    return false;
}
// 用于删除类名
function removeClassName(elem, clsname) {
    var names = elem.className.split(/\s/);
    var index = names.indexOf(clsname);
    if (index !== -1) {
        names.splice(index, 1);
        elem.className = names.join(' ');
        return true;
    }
    return false;
}

// DOM
// var squareDOM = document.getElementById("square");
var boardDOM = $("#board");
var directivesDOM = $("#directives");
var runBtnDOM = $(".run")[0];
var refreshBtnDOM = $(".refresh")[0];

// 区域
var board =...