此贪吃蛇小项目是只用js开发的,在学习它的过程中,刷新了我对前后端的认知,我单纯的以为前端做的只是页面,没想到也能实现这么多功能,主要完成功能有:创建画布-创建蛇头和食物-蛇头移动-按下上下左右键进行改变方向-蛇头与食物重合食物重新刷新位置-吃到食物身体自动增加-身体跟随前一个进行移动-死亡条件等等。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>贪吃蛇</title>
<style>
*{
margin: 0;
padding: 0;
}
#map{
width: 500px;
height: 500px;
background-color: #6495ED;
position:relative
}
table{
position: absolute;
top: 64px;
left: 0;
}
td{
width: 48px;
height: 48px;
}
</style>
</head>
<body>
<h1 id="score">Score:0</h1>
<button id="bt1">快</button>
<button id="bt2">中</button>
<button id="bt3">慢</button>
<div id="map">
</div>
<script>
var s=0
var sc=document.getElementById("score")
document.write("<table border='1' cellspacing='0'")
for(var n=0;n<10;n++){
document.write("<tr>")
for(var j=0;j<10;j++)
document.write("<td></td>")
document.write("</tr>")
}
document.write("</table>")
// 创建div随机位置,函数实现
function createDiv(color){
var div=document.createElement("div")
div.style.width="50px"
div.style.height="50px"
div.style.backgroundColor=color
// 设置位置随机出现
div.style.position="absolute"
div.style.left=parseInt(Math.random()*10)*50+"px"
div.style.top=parseInt(Math.random()*10)*50+"px"
var map=document.getElementById("map")
map.appendChild(div)
return div
// // 创建蛇头
// var headNode=document.createElement("div")
// headNode.style.width="50px"
// headNode.style.height="50px"
// headNode.style.backgroundColor="red"
// // 设置位置随机出现
// headNode.style.position="absolute"
// headNode.style.left=parseInt(Math.random()*10)*50+"px"
// headNode.style.top=parseInt(Math.random()*10)*50+"px"
// var map=document.getElementById("map")
// map.appendChild(headNode)
// // 蛇尾
// var footNode=document.createElement("div")
// footNode.style.width="50px"
// footNode.style.height="50px"
// footNode.style.backgroundColor="yellow"
// footNode.style.position="absolute"
// footNode.style.left=parseInt(Math.random()*10)*50+"px"
// footNode.style.top=parseInt(Math.random()*10)*50+"px"
// var map=document.getElementById("map")
// map.appendChild(footNode)
}
var headNode=createDiv("red")
var footNode=createDiv("blue")
// 规定一个蛇头方向
headNode.dirtion="左"
var bodyNode=[]
var t
var bt1=document.getElementById("bt1")
bt1.onclick=function(){
window.t=setInterval(function(){
if(bodyNode.length>0){
// 循环跟随
for(var n=bodyNode.length-1;n>=0;n--){
switch(bodyNode[n].dirtion){
case "左":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l-50+"px"
break
case "右":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l+50+"px"
break
case "上":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l-50+"px"
break
case "下":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l+50+"px"
break
}
if(n==0){
bodyNode[n].dirtion=headNode.dirtion
}else{
bodyNode[n].dirtion=bodyNode[n-1].dirtion
}
}
}
switch(headNode.dirtion){
case "左":
var l=parseInt(headNode.style.left)
headNode.style.left=l-50+"px"
break
case "右":
var l=parseInt(headNode.style.left)
headNode.style.left=l+50+"px"
break
case "上":
var l=parseInt(headNode.style.top)
headNode.style.top=l-50+"px"
break
case "下":
var l=parseInt(headNode.style.top)
headNode.style.top=l+50+"px"
break
}
// 判断蛇头是否出界
if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
{
clearInterval(window.t)
alert('撞到边界,死亡')
}
// 当蛇头移动后,进行与身体碰撞检测
for(var n=0;n<bodyNode.length;n++){
if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
clearInterval(window.t)
alert("咬到尾巴了")
return
}
}
// 进行碰撞检测 蛇头和食物重合,食物位置刷新
// 重合到一起表示
if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
s=s+10
sc.innerHTML='Score:'+s
var newNode=createDiv("yellow")
var lastNode
if(bodyNode.length==0){
lastNode=headNode
}else{
lastNode=bodyNode[bodyNode.length-1]
}
switch(lastNode.dirtion){
case "左":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l+50+"px"
break
case "右":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l-50+"px"
break
case "上":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l+50+"px"
break
case "下":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l-50+"px"
break
}
// 新身体产生,移动方向
newNode.dirtion=lastNode.dirtion
// 放入数组
bodyNode.push(newNode)
// 尾重新随机出现
var px=parseInt(Math.random()*10)*50+"px"
var py=parseInt(Math.random()*10)*50+"px"
while(true){
for(var n=0;n<bodyNode.length;n++){
if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
px=parseInt(Math.random()*10)*50+"px"
py=parseInt(Math.random()*10)*50+"px"
break
}
}
if(n==bodyNode.length){
break
}
}
footNode.style.left=px
footNode.style.top=py
}
},300)
}
var bt2=document.getElementById("bt2")
bt2.onclick=function(){
window.t=setInterval(function(){
if(bodyNode.length>0){
// 循环跟随
for(var n=bodyNode.length-1;n>=0;n--){
switch(bodyNode[n].dirtion){
case "左":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l-50+"px"
break
case "右":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l+50+"px"
break
case "上":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l-50+"px"
break
case "下":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l+50+"px"
break
}
if(n==0){
bodyNode[n].dirtion=headNode.dirtion
}else{
bodyNode[n].dirtion=bodyNode[n-1].dirtion
}
}
}
switch(headNode.dirtion){
case "左":
var l=parseInt(headNode.style.left)
headNode.style.left=l-50+"px"
break
case "右":
var l=parseInt(headNode.style.left)
headNode.style.left=l+50+"px"
break
case "上":
var l=parseInt(headNode.style.top)
headNode.style.top=l-50+"px"
break
case "下":
var l=parseInt(headNode.style.top)
headNode.style.top=l+50+"px"
break
}
// 判断蛇头是否出界
if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
{
clearInterval(window.t)
alert('撞到边界,死亡')
}
// 当蛇头移动后,进行与身体碰撞检测
for(var n=0;n<bodyNode.length;n++){
if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
clearInterval(window.t)
alert("咬到尾巴了")
return
}
}
// 进行碰撞检测 蛇头和食物重合,食物位置刷新
// 重合到一起表示
if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
var newNode=createDiv("yellow")
var lastNode
if(bodyNode.length==0){
lastNode=headNode
}else{
lastNode=bodyNode[bodyNode.length-1]
}
switch(lastNode.dirtion){
case "左":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l+50+"px"
break
case "右":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l-50+"px"
break
case "上":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l+50+"px"
break
case "下":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l-50+"px"
break
}
// 新身体产生,移动方向
newNode.dirtion=lastNode.dirtion
// 放入数组
bodyNode.push(newNode)
// 尾重新随机出现
var px=parseInt(Math.random()*10)*50+"px"
var py=parseInt(Math.random()*10)*50+"px"
while(true){
for(var n=0;n<bodyNode.length;n++){
if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
px=parseInt(Math.random()*10)*50+"px"
py=parseInt(Math.random()*10)*50+"px"
break
}
}
if(n==bodyNode.length){
break
}
}
footNode.style.left=px
footNode.style.top=py
// 加分
score+=10
document.getElementById("score").innerHTML=score
}
},500)
}
var bt3=document.getElementById("bt3")
bt3.onclick=function(){
window.t=setInterval(function(){
if(bodyNode.length>0){
// 循环跟随
for(var n=bodyNode.length-1;n>=0;n--){
switch(bodyNode[n].dirtion){
case "左":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l-50+"px"
break
case "右":
var l=parseInt(bodyNode[n].style.left)
bodyNode[n].style.left=l+50+"px"
break
case "上":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l-50+"px"
break
case "下":
var l=parseInt(bodyNode[n].style.top)
bodyNode[n].style.top=l+50+"px"
break
}
if(n==0){
bodyNode[n].dirtion=headNode.dirtion
}else{
bodyNode[n].dirtion=bodyNode[n-1].dirtion
}
}
}
switch(headNode.dirtion){
case "左":
var l=parseInt(headNode.style.left)
headNode.style.left=l-50+"px"
break
case "右":
var l=parseInt(headNode.style.left)
headNode.style.left=l+50+"px"
break
case "上":
var l=parseInt(headNode.style.top)
headNode.style.top=l-50+"px"
break
case "下":
var l=parseInt(headNode.style.top)
headNode.style.top=l+50+"px"
break
}
// 判断蛇头是否出界
if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
{
clearInterval(window.t)
alert('撞到边界,死亡')
}
// 当蛇头移动后,进行与身体碰撞检测
for(var n=0;n<bodyNode.length;n++){
if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
clearInterval(window.t)
alert("咬到尾巴了")
return
}
}
// 进行碰撞检测 蛇头和食物重合,食物位置刷新
// 重合到一起表示
if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
var newNode=createDiv("yellow")
var lastNode
if(bodyNode.length==0){
lastNode=headNode
}else{
lastNode=bodyNode[bodyNode.length-1]
}
switch(lastNode.dirtion){
case "左":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l+50+"px"
break
case "右":
newNode.style.top=lastNode.style.top
var l=parseInt(lastNode.style.left)
newNode.style.left=l-50+"px"
break
case "上":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l+50+"px"
break
case "下":
newNode.style.left=lastNode.style.left
var l=parseInt(lastNode.style.top)
newNode.style.top=l-50+"px"
break
}
// 新身体产生,移动方向
newNode.dirtion=lastNode.dirtion
// 放入数组
bodyNode.push(newNode)
// 尾重新随机出现
var px=parseInt(Math.random()*10)*50+"px"
var py=parseInt(Math.random()*10)*50+"px"
while(true){
for(var n=0;n<bodyNode.length;n++){
if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
px=parseInt(Math.random()*10)*50+"px"
py=parseInt(Math.random()*10)*50+"px"
break
}
}
if(n==bodyNode.length){
break
}
}
footNode.style.left=px
footNode.style.top=py
// 加分
score+=10
document.getElementById("score").innerHTML=score
}
},800)
}
// 定时器使用
// setInterval(function(){
// console.log(1)
// },1000)
// 按下键盘onkeydown上下左右时,改变蛇头方向
// 事件处理函数中:事件对象event
// event.keyCode键盘对应的键值
document.onkeydown=function(event){
// 根据按键改变方向
switch(event.keyCode){
case 37:
if(!(headNode.dirtion=='右'&&bodyNode.length>0))
headNode.dirtion="左"
break
case 38:
if(!(headNode.dirtion=='下'&&bodyNode.length>0))
headNode.dirtion="上"
break
case 39:
if(!(headNode.dirtion=='左'&&bodyNode.length>0))
headNode.dirtion="右"
break
case 40:
if(!(headNode.dirtion=='上'&&bodyNode.length>0))
headNode.dirtion="下"
break
}
}
</script>
<!-- 定时器的shiyong
<button id="bt1">开始定时器</button>
<button id="bt2">停止定时器</button>
<script>
var bt1=document.getElementById("bt1")
var t
bt1.onclick=function(){
t=setInterval(function(){
console.log("hello world")
},500)
}
var bt2=document.getElementById("bt2")
bt2.onclick=function(){
clearInterval(t)
}
</script> -->
</body>
</html>