计算机科学导论课结课的时候写的HTML贪吃蛇

徐老师搭的那个小图床不稳定。

<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值