徐老师搭的那个小图床不稳定。
<html>
<head>
<meta charset="utf-8">
<title>贪吃蛇</title>
<style>
#canvas{border: 4px blue}
</style>
</head>
<body>
<div align='center'>
<h1>贪吃蛇</h1>
<canvas id="canvas" width="400" height="400"></canvas>
<img id="apple" src="1.jpg" hidden="true">
<img id="banana" src="2.jpg" hidden="true">
<img id="watermelon" src="3.jpg" hidden="true">
<img id="boom" src="4.webp" hidden="true">
<Audio id="music"src="1.flac" hidden="true" loop="true" autostart="true" ></Audio>
<script>
var IMG1=document.getElementById("apple");
var IMG2=document.getElementById("banana");
var IMG3=document.getElementById("watermelon")
var canvas=document.getElementById("canvas");
var picture=canvas.getContext("2d")
var SNAKE= new Array();
var FOOD= new Array();
var NEED_FOOD= new Array();
var Basiclen=20,Score=0,ret;
var NEED_INTERVAL,FOOD_INTERVAL,SNAKE_INTERVAL,GG_Timeout;
function BasicNode(x,y,len){
var t=this;
t.x=x;
t.y=y;
t.len=len;
t.sum=1;
t.FOOD=function(){
if(Math.random()<0.5)
picture.drawImage(IMG1,x,y,len,len);
else{
t.sum=2;
picture.drawImage(IMG2,x,y,len,len);
}
}
t.NEED_FOOD=function(){
picture.drawImage(IMG3,x,y,len,len);
}
t.SNAKE_IN=function(){
picture.fillStyle='white';
picture.fillRect(x,y,len,len);
picture.beginPath();
picture.strokeStyle='black';
picture.arc(x+10,y+10,9,0,Math.PI*2,false);
picture.stroke();
}
t.SNAKE_HEAD_IN=function(){
picture.fillStyle='white';
picture.fillRect(x,y,len,len);
picture.beginPath();
picture.strokeStyle='red';
picture.arc(x+10,y+10,9,0,Math.PI*2,false);
picture.stroke();
}
t.SNAKE_OUT=function(){
picture.fillStyle='white';
picture.strokeStyle='white';
picture.fillRect(x,y,len,len);
picture.strokeRect(x,y,len,len);
picture.strokeStyle='red';
picture.strokeRect(0,0,400,400);
}
t.equal=function(tmp){return (this.x==tmp.x)&&(this.y==tmp.y);}
}
//
function DX(x){return ((x>-20)&&(x<400))?x:((x==-20)?380:0)}
function DY(y){return ((y>-20)&&(y<400))?y:((y==-20)?380:0)}
//
function GGcheck(){if(NEED_FOOD.length)gameover();}
function GGreport(){
ret--;
var pos=document.getElementById("Limit");
pos.innerHTML="请在"+ret+"s内吃掉西瓜";
GG_Timeout=setTimeout(GGreport,1000);
}
function CanvasNode(){//for a 400*400 canvas with 20*20 Nodes on it
var t=this;
picture.fillStyle='white';
picture.strokeStyle='red';
picture.fillRect(0,0,400,400);
picture.strokeRect(0,0,400,400);
t.ADDFOOD=function(){
var dx=Math.floor(20*Math.random())*20;
var dy=Math.floor(20*Math.random())*20;
var now=new BasicNode(dx,dy,Basiclen);
//console.log(dx,dy);
for(var i=0;i<SNAKE.length;i++){if(SNAKE[i].equal(now))return false;}
now.FOOD();
FOOD.push(now);
return true;
}
t.ADD_NEED_FOOD=function(){
var dx=Math.floor(20*Math.random())*20;
var dy=Math.floor(20*Math.random())*20;
var now=new BasicNode(dx,dy,Basiclen);
//console.log(dx,dy);
for(var i=0;i<SNAKE.length;i++){if(SNAKE[i].equal(now))return false;}
now.NEED_FOOD();
NEED_FOOD.push(now);
ret=20;
GGreport();
setTimeout(GGcheck,20000);
return true;
}
}
function SnakeNode(x,y,INTERNAL_SPEEED){
var t=this;
t.x=x;
t.y=y;
t.Direction='R';
t.OriginalDirection='R';//Avoid a turn back order
//Get a len 5 snake at the very beginning
t.init=function(){
var dx=x,dy=y;
for(var i=1;i<=5;i++){
var nowNode=new BasicNode(dx,dy,Basiclen);
dx-=Basiclen;
(i==1)?nowNode.SNAKE_HEAD_IN():nowNode.SNAKE_IN();
SNAKE.push(nowNode);
}
SNAKE_INTERVAL=setInterval(t.move,INTERNAL_SPEEED);
}
//keyboard
document.onkeydown=function(now){
var type=now.keyCode;
t.OriginalDirection=t.Direction;
switch(type){
case 37:
t.Direction='L';
break;
case 38:
t.Direction='U';
break;
case 39:
t.Direction='R';
break;
case 40:
t.Direction='D';
break;
}
}
//SIGNIFICANT, the move of SNAKE
t.move=function(){
var NewNode;
switch(t.Direction){
case 'R':
NewNode=new BasicNode(DX(SNAKE[0].x+Basiclen),DY(SNAKE[0].y),Basiclen);
break;
case 'L':
NewNode=new BasicNode(DX(SNAKE[0].x-Basiclen),DY(SNAKE[0].y),Basiclen);
break;
case 'U':
NewNode=new BasicNode(DX(SNAKE[0].x),DY(SNAKE[0].y-Basiclen),Basiclen);
break;
case 'D':
NewNode=new BasicNode(DX(SNAKE[0].x),DY(SNAKE[0].y+Basiclen),Basiclen);
break;
}
if(SNAKE[1].equal(NewNode)){//a turn back order
t.Direction=t.OriginalDirection;
return;
}
NewNode.SNAKE_HEAD_IN();
SNAKE.unshift(NewNode);
SNAKE[1].SNAKE_IN();
SNAKE[SNAKE.length-1].SNAKE_OUT();
console.log(SNAKE[SNAKE.length-1].x,SNAKE[SNAKE.length-1].y);
SNAKE.pop();
//FOODEAT
for(var i=0;i<FOOD.length;i++){
if(FOOD[i].equal(NewNode)){
t.ADD();
clearInterval(SNAKE_INTERVAL);
SNAKE_INTERVAL=setInterval(t.move,Math.floor(INTERNAL_SPEEED/2));
Score+=FOOD[i].sum*10;
Score_PRINT();
}
}
for(var i=0;i<NEED_FOOD.length;i++){
if(NEED_FOOD[i].equal(NewNode)){
NEED_FOOD.splice(i,1);
Score+=50;
Score_PRINT();
clearTimeout(GG_Timeout);
var pos=document.getElementById("Limit");
pos.innerHTML="";
}
}
//DIE
for(var i=1;i<SNAKE.length;i++){
if(SNAKE[i].equal(NewNode)){
gameover();
return;
}
}
t.ADD=function(){
var tailNode1=SNAKE[SNAKE.length-1];
var tailNode2=SNAKE[SNAKE.length-2];
var ADDtail;
if(tailNode1.x==tailNode2.x){
if(tailNode1.y<tailNode2.y){
ADDtail=new BasicNode(DX(tailNode1.x),DY(tailNode1.y-Basiclen));
}
else{
ADDtail=new BasicNode(DX(tailNode1.x),DY(tailNode1.y+Basiclen));
}
}
else{
if(tailNode1.x<tailNode2.x){
ADDtail=new BasicNode(DX(tailNode1.x-Basiclen),DY(tailNode1.y));
}
else{
ADDtail=new BasicNode(DX(tailNode1.x+Basiclen),DY(tailNode1.y));
}
}
ADDtail.SNAKE_IN();
SNAKE.push(ADDtail);
}
}
}
function gameover(){
clearInterval(SNAKE_INTERVAL);
clearInterval(FOOD_INTERVAL);//FOOD
clearInterval(NEED_INTERVAL);
clearTimeout(GG_Timeout);
alert("您的得分是 "+Score);
}
function Clear(){
clearInterval(SNAKE_INTERVAL);
clearInterval(FOOD_INTERVAL);//FOOD
clearInterval(NEED_INTERVAL);
clearTimeout(GG_Timeout);
var pos=document.getElementById("Limit");
pos.innerHTML="";
SNAKE=[];
FOOD=[];
NEED_FOOD=[];
Score=0;
Restart();
}
function Start(){
playmusic();
Clear();
var S=new SnakeNode(200,200,1000);
var C=new CanvasNode();
S.init();
FOOD_INTERVAL=setInterval(C.ADDFOOD,5000);
NEED_INTERVAL=setInterval(C.ADD_NEED_FOOD,40000);
Score_PRINT();
}
function Restart(){
picture.fillStyle='white';
picture.strokeStyle='red';
picture.fillRect(0,0,400,400);
picture.strokeRect(0,0,400,400);
}
function Score_PRINT(){
var pos=document.getElementById("Score");
pos.innerHTML="Score="+Score;
}
function playmusic(){
var myAudio=document.getElementById("music");
myAudio.play();
}
Restart();
</script>
<br>
<input type="button" value="开始" onclick="Start()">
<input type='button' value="结束" onclick="Clear()">
<br>
<h3 id='Score'>Score</h3>
<h3 id='Limit'></h3>
</div>
</body>
</html>