簡(jiǎn)略版的完整代碼,可以玩一哈~
<!DOCTYPE html>
<html>
<head>
? ? <meta charset="UTF-8">
? ? <title>Document</title>
? ? <style>
? ? #stage {
? ? ? ? width: 300px;
? ? ? ? height: 300px;
? ? ? ? position: relative;
? ? }
? ? #background {
? ? ? ? width: 300px;
? ? ? ? height: 300px;
? ? ? ? position: absolute;
? ? ? ? top: 0;
? ? ? ? left: 0;
? ? ? ? background: yellow;
? ? }
? ? #cannon {
? ? ? ? width: 20px;
? ? ? ? height: 20px;
? ? ? ? position: absolute;
? ? ? ? top: 270px;
? ? ? ? left: 140px;
? ? ? ? background: red;
? ? }
? ? #alien {
? ? ? ? width: 20px;
? ? ? ? height: 20px;
? ? ? ? position: absolute;
? ? ? ? top: 20px;
? ? ? ? left: 80px;
? ? ? ? background: blue;
? ? }
? ? #missile {
? ? ? ? width: 10px;
? ? ? ? height: 10px;
? ? ? ? position: absolute;
? ? ? ? top: 270px;
? ? ? ? left: 140px;
? ? ? ? background: black;
? ? }
? ? #explosion {
? ? ? ? width: 20px;
? ? ? ? height: 20px;
? ? ? ? position: absolute;
? ? ? ? top: 0;
? ? ? ? left: 0;
? ? ? ? background: pink;
? ? ? ? display: none;
? ? }
? ? </style>
</head>
<body>
? ? <div id="stage">
? ? ? ? <div id="background"></div>
? ? ? ? <div id="cannon"></div>
? ? ? ? <div id="missile"></div>
? ? ? ? <div id="alien"></div>
? ? ? ? <div id="explosion"></div>
? ? </div>
? ? <p id="output">請(qǐng)輸入x和y坐標(biāo)(0-300),然后點(diǎn)擊fire</p>
? ? <input type="text" id="inputX" placeholder="X...">
? ? <input type="text" id="inputY" placeholder="Y...">
? ? <button>fire</button>
? ? <script>
? ? function BinaryTree() {
? ? ? ? var Node = function(key) {
? ? ? ? ? ? this.key = key;
? ? ? ? ? ? this.left = null;
? ? ? ? ? ? this.right = null;
? ? ? ? ? ? this.selected = false;
? ? ? ? };
? ? ? ? var root = null;
? ? ? ? var insertNode = function(node, newNode) {
? ? ? ? ? ? if (newNode.key < node.key) {
? ? ? ? ? ? ? ? if (node.left === null) {
? ? ? ? ? ? ? ? ? ? node.left = newNode;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? insertNode(node.left, newNode);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (node.right === null) {
? ? ? ? ? ? ? ? ? ? node.right = newNode;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? insertNode(node.right, newNode);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? this.insert = function(key) {
? ? ? ? ? ? var newNode = new Node(key);
? ? ? ? ? ? if (root == null) {
? ? ? ? ? ? ? ? root = newNode;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? insertNode(root, newNode);
? ? ? ? ? ? }
? ? ? ? };
? ? ? ? var inOrderTraverseNode = function(node, callback) {
? ? ? ? ? ? if (node !== null) {
? ? ? ? ? ? ? ? inOrderTraverseNode(node.left, callback);
? ? ? ? ? ? ? ? callback(node.key);
? ? ? ? ? ? ? ? inOrderTraverseNode(node.right, callback);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? this.inOrderTraverse = function(callback) {
? ? ? ? ? ? inOrderTraverseNode(root, callback);
? ? ? ? }
? ? ? ? var searchNode = function(node, key) {
? ? ? ? ? ? if (node === null) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? if (key < node.key) {
? ? ? ? ? ? ? ? return searchNode(node.left, key);
? ? ? ? ? ? } else if (key > node.key) {
? ? ? ? ? ? ? ? return searchNode(node.right, key);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? return node;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? this.search = function(key) {
? ? ? ? ? ? return searchNode(root, key);
? ? ? ? }
? ? }
? ? var callback = function(key) {
? ? ? ? console.log(key);
? ? };
? ? // init alienSiteArray
? ? var nodesForAlien = [];
? ? for (var i = 0; i < 10; i++) {
? ? ? ? nodesForAlien.push(Math.floor(Math.random() * 281));
? ? }
? ? // nodesArray for selected
? ? var nodesForSelected = [];
? ? for (var i = 0; i < 10; i++) {
? ? ? ? nodesForSelected.push({selected: false});
? ? }
? ? // activate first alienSite
? ? var alienNodeSelect = Math.floor(Math.random() * 9);
? ? nodesForSelected[alienNodeSelect].selected = true;
? ? var binaryTree = new BinaryTree();
? ? nodesForAlien.forEach(function(key) {
? ? ? ? binaryTree.insert(key)
? ? });
? ? //Game section
? ? var alienX = 20;
? ? var alienY = 20;
? ? var guessX = 0,
? ? ? ? guessY = 0,
? ? ? ? shotsRemaning = 8,
? ? ? ? shotsMade = 0,
? ? ? ? gameState = "",
? ? ? ? gameWon = false;
? ? var cannon = document.querySelector("#cannon"),
? ? ? ? alien = document.querySelector("#alien"),
? ? ? ? missile = document.querySelector("#missile"),
? ? ? ? explosion = document.querySelector('#explosion');
? ? var inputX = document.querySelector('#inputX'),
? ? ? ? inputY = document.querySelector('#inputY'),
? ? ? ? output = document.querySelector('#output');
? ? var button = document.querySelector("button");
? ? button.style.cursor = "pointer";
? ? button.addEventListener("click", clickHandler, false);
? ? window.addEventListener("keydown", keydownHandler, false);
? ? function clickHandler() {
? ? ? ? validateInput();
? ? }
? ? function keydownHandler() {
? ? ? ? if (event.keyCode === 13) {
? ? ? ? ? ? validateInput();
? ? ? ? }
? ? }
? ? function validateInput() {
? ? ? ? guessX = parseInt(inputX.value);
? ? ? ? guessY = parseInt(inputY.value);
? ? ? ? if (isNaN(guessX) || isNaN(guessY)) {
? ? ? ? ? ? output.innerHTML = "請(qǐng)輸入數(shù)字坐標(biāo)";
? ? ? ? } else if (guessX > 300 || guessY > 300) {
? ? ? ? ? ? output.innerHTML = "坐標(biāo)不能大于300"
? ? ? ? } else {
? ? ? ? ? ? playGame();
? ? ? ? }
? ? }
? ? function playGame() {
? ? ? ? shotsRemaning--;
? ? ? ? shotsMade++;
? ? ? ? gameState = "炮彈:" + shotsMade + ",數(shù)量:" + shotsRemaning;
? ? ? ? guessX = parseInt(inputX.value);
? ? ? ? guessY = parseInt(inputY.value);
? ? ? ? var alienNode = binaryTree.search(guessX);
? ? ? ? var alienFlag = -1;
? ? ? ? if (alienNode) {
? ? ? ? ? ? nodesForAlien.forEach(function(val, index) {
? ? ? ? ? ? ? ? if (val === alienNode.key) {
? ? ? ? ? ? ? ? ? ? alienFlag = index;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? })
? ? ? ? }
? ? ? ? if (alienNode !== null && alienNodeSelect === alienFlag) {
? ? ? ? ? ? if (guessY >= alienY && guessY <= alienY + 20) {
? ? ? ? ? ? ? ? gameWon = true;
? ? ? ? ? ? ? ? endGame();
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? output.innerHTML = "沒有擊中" + "<br>" + gameState;
? ? ? ? ? ? if (shotsRemaning < 1) {
? ? ? ? ? ? ? ? endGame();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (!gameWon) {
? ? ? ? ? ? alienNodeSelect = Math.floor(Math.random() * 9);
? ? ? ? ? ? alienX = nodesForAlien[alienNodeSelect];
? ? ? ? ? ? alienY += 30;
? ? ? ? }
? ? ? ? render();
? ? ? ? console.log("X" + alienX);
? ? ? ? console.log("Y" + alienY);
? ? }
? ? function render() {
? ? ? ? alien.style.left = alienX + 'px';
? ? ? ? alien.style.top = alienY + 'px';
? ? ? ? cannon.style.left = guessX + 'px';
? ? ? ? missile.style.left = guessX + 'px';
? ? ? ? missile.style.top = guessY + 'px';
? ? ? ? if (gameWon) {
? ? ? ? ? ? explosion.style.display = 'block';
? ? ? ? ? ? explosion.style.left = alienX + 'px';
? ? ? ? ? ? explosion.style.top = alienY + 'px';
? ? ? ? ? ? alien.style.display = "none";
? ? ? ? ? ? missile.style.display = "none";
? ? ? ? }
? ? }
? ? function endGame() {
? ? ? ? if (gameWon) {
? ? ? ? ? ? output.innerHTML = "Hit! 你拯救了地球" + "<br>" + "你發(fā)射了炮彈" + shotsMade;
? ? ? ? } else {
? ? ? ? ? ? output.innerHTML = "失敗了!" + "<br>" + "地球被外星人侵略!";
? ? ? ? }
? ? ? ? button.removeEventListener("click", clickHandler, false);
? ? ? ? button.disabled = true;
? ? ? ? window.removeEventListener("keydown", keydownHandler, false);
? ? ? ? inputX.disabled = true;
? ? ? ? inputY.disabled = true;
? ? }
? ? </script>
</body>
</html>
2020-09-17
試一下
2018-11-14
其實(shí)js array對(duì)象有這些方法,這(二叉樹)有何優(yōu)勢(shì)?
2018-01-18
給樓主點(diǎn)贊。樓上慕粉的方法不可行,把callback函數(shù)內(nèi)容改為nodesForAlien.push(node)時(shí),只能成功將根結(jié)點(diǎn)復(fù)制進(jìn)新數(shù)組的[0]號(hào)元素,后面的復(fù)制都會(huì)報(bào)錯(cuò),因?yàn)槔蠋煒?gòu)造的二叉樹,結(jié)點(diǎn)之間的關(guān)系是靠node.left(或者node.righht)指向另一個(gè)node維系的,使用push并不能得到nodesForAlien的[0]號(hào)元素是一個(gè)結(jié)點(diǎn),[1]號(hào)元素是另一個(gè)結(jié)點(diǎn)。
2017-10-14
//生成一個(gè)隨機(jī)數(shù)的數(shù)組nodesArr[]
var nodesArr = [];
for(var i =0; i < 10 ; i++){
nodesArr[i] = Math.floor((Math.random() * (281-20))+20);
}
for(var i=0;i<10;i++){
console.log(nodesArr[i]);
}
var binaryTree = new BinaryTree();
nodesArr.forEach(function (key) {
binaryTree.insert(key);
});
var nodesForAlien = [];? //存放二叉樹節(jié)點(diǎn)的數(shù)組
var callback = function (node) {
nodesForAlien.push(node);
console.log(nodesForAlien);
}
var call = function(key){
console.log(key);
}
//binaryTree.inOrderTraverse(call);
binaryTree.preOrderTraverse(callback);? //通過前序遍歷復(fù)制二叉樹存入數(shù)組nodesForAlien中
//建立第一次外星人橫坐標(biāo)
var alienNodeSelect = Math.floor(Math.random() * 9);
nodesForAlien[alienNodeSelect].selected = true;
var alienX = nodesForAlien[alienNodeSelect].key;
2017-10-14
應(yīng)該不是給每個(gè)node另外附上selected:false 屬性,而是新建一個(gè)nodesForAlien數(shù)組,利用前序遍歷的方法復(fù)制二叉樹中的節(jié)點(diǎn)給nodesForAlien數(shù)組,這樣二叉樹中的node屬性(key,selected……)在nodesForAlien數(shù)組中的元素也有。
2017-10-06
試試可以采納我自己么O__O "…