键盘事件
// document.onkeydown=function(){
// console.log('keydown');
// //不抬起按键会一直触发
// }
// document.onkeyup=function() {
// console.log('keyup')
// }
// document.onkeypress=function() {
// console.log('keypress');
// }
//keydown->keypress->keyup
//所有按键都可以触发
document.onkeydown=function(e){
console.log(e);
console.log(e.charCode)//0 无数字
console.log(e.keyCode)//键盘顺位码
//keyCode有上下左右
}
//只能触发字符类按键,上下左右不行
document.onkeypress=function(e) {
console.log(e);
console.log(e.charCode)//1 有数字 ascii码
console.log(e.keyCode);//一样 有
var str=String.fromCharCode(e.charCode)
console.log(str);
//能得到大写的G、H、L,keyCode不行
//只能触发字符类,别的不行,shift、上下左右
//keyCode没有上下左右
}
keyCode表
例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<style>
.box {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-color: green;
}
</style>
</head>
<body>
<div class="box"></div>
<script src="./js/utils.js"></script>
<script>
var box = document.getElementsByClassName('box')[0];
document.onkeydown = function (e) {
var e = e || window.event,
code = e.keyCode,
bLeft = getStyles(box, 'left'),
bTop = getStyles(box, 'top');
switch (code) {
case 37:
box.style.left = bLeft - 5 + 'px';
break;
case 39:
box.style.left = bLeft + 5 + 'px';
break;
case 38:
box.style.top = bTop -5 + 'px';
break;
case 40:
box.style.top = bTop + 5 + 'px';
break;
default:
break;
}
}
</script>
</body>
</html>
贪吃蛇
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.wrap{
position: relative;
width: 500px;
height: 500px;
margin: 50px auto;
background-color: #000;
overflow: hidden;
}
.round{
display: block;
position: absolute;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: green;
z-index: 1;
}
.round.head{
background-color: red;
}
.food{
display: block;
position: absolute;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: yellow;
z-index: 2;
}
</style>
</head>
<body>
<div class="wrap"></div>
<script src="./js/untils.js"></script>
<script src="./js/index.js"></script>
</body>
</html>
window.onload = function () {
init();
}
function init() {
initGame();
}
var initGame = (function () {
var wrap = document.getElementsByClassName('wrap')[0],
wrapW = getStyles(wrap, 'width'),
wrapH = getStyles(wrap, 'height'),
t = null;
var Snake = function () {
this.bodyArr = [{
x: 0,
y: 0
},
{
x: 0,
y: 20
},
{
x: 0,
y: 40
},
{
x: 0,
y: 60
},
{
x: 0,
y: 80
},
{
x: 0,
y: 100
}
];
this.dir = 'DOWN'
}
Snake.prototype = {
init: function () {
this.bindEvent();
this.createFood();
this.initSnake();
this.run();
},
bindEvent: function () {
var _self = this;
addEvent(document, 'keydown', function () {
_self.changeDir();
});
},
initSnake: function () {
var arr = this.bodyArr,
len = arr.length,
frag = document.createDocumentFragment(),
item;
for (var i = 0; i < len; i++) {
item = arr[i];
var round = document.createElement('i'); //i标签
// console.log(round);
// 此处i是循坏中的i 查找数组中最后一项
round.className = i === len - 1 ? 'round head' : 'round';
round.style.left = item.x + 'px';
round.style.top = item.y + 'px';
frag.appendChild(round);
}
wrap.appendChild(frag);
},
run: function () {
var _self = this
t = setInterval(function () {
_self.move();
}, 500);
},
move: function () {
var arr = this.bodyArr,
len = arr.length;
for (var i = 0; i < len; i++) {
if (i === len - 1) {
this.setHeadXY(arr);
} else {
arr[i].x = arr[i + 1].x;
arr[i].y = arr[i + 1].y;
}
}
this.eatFood(arr);
this.removeSnake();
this.initSnake();
this.headInBody(arr);
},
setHeadXY: function (arr) {
var head = arr[arr.length - 1];
switch (this.dir) {
case 'LEFT':
if (head.x <= 0) {
head.x = wrapW - 20;
} else {
head.x -= 20;
}
break;
case 'RIGHT':
if (head.x >= wrapW - 20) {
head.x = 0;
} else {
head.x += 20;
}
break;
case 'UP':
if (head.y <= 0) {
head.y = wrapH - 20;
} else {
head.y -= 20;
}
break;
case 'DOWN':
if (head.y >= wrapH - 20) {
head.y = 0;
} else {
head.y += 20;
}
break;
default:
break;
}
},
headInBody: function (arr) {
var headX = arr[arr.length - 1].x,
headY = arr[arr.length - 1].y;
for (var i = 0; i < arr.length - 2; i++) {
item = arr[i];
if (headX === item.x && headY === item.y) {
var _self = this;
setTimeout(function () {
alert('游戏结束');
clearInterval(t);
_self.removeSnake();
_self.removeFood();
}, 100)
}
}
},
removeSnake: function () {
var bodys = document.getElementsByClassName('round');
while (bodys.length > 0) {
bodys[0].remove();
}
},
changeDir: function () {
var e = e || window.event;
code = e.keyCode;
this.setDir(code);
},
setDir: function () {
switch (code) {
case 37:
if (this.dir !== 'RIGHT' && this.dir !== 'LEFT') {
this.dir = 'LEFT';
}
break;
case 39:
if (this.dir !== 'RIGHT' && this.dir !== 'LEFT') {
this.dir = 'RIGHT';
}
break;
case 38:
if (this.dir !== 'UP' && this.dir !== 'DOWN') {
this.dir = 'UP';
}
break;
case 40:
if (this.dir !== 'UP' && this.dir !== 'DOWN') {
this.dir = 'DOWN';
}
break;
default:
break;
}
},
createFood: function () {
var food = document.createElement('i');
food.className = 'food';
food.style.left = this.setRandomPos(wrapW) * 20 + 'px';
food.style.top = this.setRandomPos(wrapH) * 20 + 'px';
wrap.appendChild(food);
},
setRandomPos: function (size) {
return Math.floor(Math.random() * (size / 20))
},
eatFood: function (arr) {
var food = document.getElementsByClassName('food')[0],
foodX = getStyles(food, 'left'),
foodY = getStyles(food, 'top'),
headX = arr[arr.length - 1].x,
headY = arr[arr.length - 1].y,
x,
y;
if (headX === foodX && headY === foodY) {
this.removeFood();
this.createFood();
if (arr[0].x == arr[1].x) {
x = arr[0].x;
if (arr[0].y > arr[1].y) {
y = arr[0].y + 20;
} else if (arr[0].y < arr[1].y) {
y = arr[0].y - 20;
}
} else if (arr[0].y === arr[1].y) {
y = arr[0].y;
if (arr[0].x > arr[1].x) {
x = arr[0].x + 20;
} else if (arr[0].x < arr[1].x) {
x = arr[0].x - 20;
}
}
arr.unshift({
x,
y
})
}
},
removeFood: function () {
var food = document.getElementsByClassName('food')[0];
food.remove();
}
}
return new Snake().init();
});