html+css+js比较完整的简单贪吃蛇

网页贪吃蛇@君山

html+css+js比较完整的简单贪吃蛇

小菜鸡写的第一个完整地js小东西,参考的是大佬的贪吃蛇代码,然后在源代码的基础上完善的,添加了难度选择功能,蛇撞到自己也会死亡,蛇不能回头,有分数显示,可以重置和暂停,分数段分为0,30,100(玩到100有小惊喜hhhhhhhh)具体看代码吧,关键地方都写了注释,不懂的可以留言询问。
大佬代码:
链接: https://blog.csdn.net/bingocoder/article/details/85868814.贪吃蛇开始展示

代码可直接复制使用

版本1:适合大屏幕电脑,小屏幕可能布局有问题建议运行下面第二个代码。 发现放两个版本的代码导致页面打开会卡住,还是只留下改进版的吧555

发现同学的小屏幕电脑会导致布局出现问题,小改了一下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        button {
            /* 默认有灰色边框我们需要手动去掉 */
            width: 100%;
            height: 100%;
            line-height: 100%;
            font-size: 150%;
            cursor: pointer;
            border: 0; 
            outline: none;
            background-color: rgb(206, 214, 248);
        }
        .map {
            margin: 30px auto;
            width: 900px;
            height: 600px;
            background: rgb(142, 204, 245);
            border: 10px solid rgb(177, 183, 240);
            border-radius: 8px;
        }
        .show {
            float: left;
            overflow: hidden;
            /* 修改了一下,兼容一下小屏幕,因为懒得修改别的部分就偷懒用了百分比,大屏幕看效果就不太行了 */
            margin: 10% 0 0 2%;
            width: 10%;
            height: 200px;
            background-color: rgb(186, 203, 240);
            border-radius: 10px;
            text-align: center;
        }
        .show .choose {
            padding: 0;
        }
        li {
            list-style: none;
            text-align: center;
        }
        .show .choose li {
            height: 30px;
            border-bottom: 3px solid rgb(155, 183, 243);
        }
        .show .choose ul #title{
            height: 50px;
            line-height: 50px;
            font-size: 150%;
        }
        .show .score {
            width: 100%;
            height: 50px;
            line-height: 50px;
            font-size: 200%;
        }
        .Degree {
            position: absolute;
            left: 30%;
            top: 200px;
            width: 18%;
            height: 250px;
            z-index: 2;
        }
        .Degree .degree {
            width: 100%;
            height: 250px;
        }
        .Degree .degree li {
            width: 100%;
            height: 60px;
            line-height: 60px;
            border-bottom: 3px solid rgb(155, 183, 243);            
        }
        .Degree .degree #dg {
            font-size: 200%;
            color: rgb(2, 152, 252);
            background-color: rgb(206, 214, 248);
        }
    </style>
</head>
<body>
    <div class="Degree">
        <ul class="degree">
            <li id="dg">难度</li>
            <li id="d1"><button type="submit">简单</button></li>
            <li id="d2"><button type="submit">一般</button></li>
            <li id="d3"><button type="submit">困难</button></li>
        </ul>            
    </div>
    <div class="main">
        <div class="show">
            <div class="choose">
                <ul>
                <li id="title">机智的贪吃蛇</li>
                <li><button type="submit" id="Reset">重置</button></li>
                <li><button type="submit" id="Stop">暂停</button></li>
                <li><button type="submit" id="Continue">
                            <span style="font-size:xx-small;">无用的</span>继续</button></li> 
                </ul>
            </div>
            <div class="score">
            </div>
        </div>
    <div class="map">
        <canvas id="canvas" height="600" width="900">
            <!--贪吃蛇活动部分-->
        </canvas>
    </div>                
    </div>

    <!--贪吃蛇js部分 -->
    <script type="text/javascript">
        //获取画布
        var c=document.getElementById("canvas");
        var ctx=c.getContext("2d");
        //初始化蛇和食物,分数
        var snake=[];
        var snakeCount=6;
        var foodx=0;
        var foody=0;
        var togo=3;//移动方向
        var score=0;//分数
        var flag=1;//是否死亡标记
        var Sspeed=100;//速度
        var x=1;//积分倍数
        var Timer="初始化定时器";

        //绘制地图
        function drawtable(){
            //画竖线
            for(var i=0;i<60;i++){
                ctx.strokeStyle="royalblue";
                ctx.beginPath();
                ctx.moveTo(15*i,0);
                ctx.lineTo(15*i,600);
                ctx.closePath();
                ctx.stroke();
            }
            //画横线
            for(var j=0;j<40;j++){
                ctx.strokeStyle="royalblue";
                ctx.beginPath();
                ctx.moveTo(0,15*j);
                ctx.lineTo(900,15*j);
                ctx.closePath();
                ctx.stroke();
            }
            //绘制蛇的身体
            for(var k=0;k<snakeCount;k++){
                ctx.fillStyle="#fff";
                if(k==snakeCount-1){
                    ctx.fillStyle="purple";
                }
                ctx.fillRect(snake[k].x,snake[k].y,15,15);
            }
            //绘制食物
            ctx.fillStyle="pink";
            ctx.fillRect(foodx,foody,15,15);
            ctx.fill();
        }

        //定义蛇的初始坐标
        function start(){
            snake=[];
            snakeCount=6;
            foodx=0;
            foody=0;
            togo=3;//移动方向
            score=0;//分数
            flag=1;//是否死亡标记
            for(var k=0;k<snakeCount;k++){
                snake[k]={x:k*15,y:0};
            }
            var Score=document.querySelector(".score");
            Score.innerHTML=score;
            drawtable();
            addfood();
        }

        //随机生成食物函数
        function addfood(){
            //产生随机数
            foodx=Math.floor(Math.random()*60)*15;
            foody=Math.floor(Math.random()*40)*15;
            //判断是否与蛇身体重合
            for(var k=0;k<snakeCount;k++){
                if(foodx==snake[k].x&&foody==snake[k].y){
                    addfood();
                }
            }
        }

        //判断键盘输入
        function keydown(e){
            //if语句判断输入方向的是否和当前前进方向相反
            switch(e.keyCode){
                case 37:{
                    if(togo!=3){
                        togo=1;
                    }
                    break;
                }  
                case 38:{
                    if(togo!=4){
                        togo=2;
                    }
                    break;
                }
                case 39:{
                    if(togo!=1){
                        togo=3;
                    }
                    break;
                }
                case 40:{
                    if(togo!=2){
                        togo=4;
                    }
                    break;
                }
                case 65:{
                    if(togo!=3){
                        togo=1;
                    }
                    break;
                }
                case 87:{
                    if(togo!=4){
                        togo=2;
                    }
                    break;
                }
                case 68:{
                    if(togo!=1){
                        togo=3;
                    }
                    break;
                }
                case 83:{
                    if(togo!=2){
                        togo=4;
                    }
                    break;
                }
                default:break;
            }
        }

        //吃到食物身体变长
        function isEat(){
            if(snake[snakeCount-1].x==foodx&& snake[snakeCount-1].y==foody){
                addfood();
                snakeCount++;
                score=score+10*x;
                snake.unshift({x:-15,y:-15});
                var Score=document.querySelector(".score");
                Score.innerHTML=score;
            }
        }

        //移动部分
        function move(){
            switch(togo){
                //左
                case 1:snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y});break;
                //上
                case 2:snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y-15});break;
                //右
                case 3:snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});break;
                //下
                case 4:snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y+15});break;
                //此处不可删除!!!!!!!!
                //初始状态无操作时默认往右移动
                default:snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});
            }            
            //删除数组第一个元素,即蛇尾
            snake.shift();
            //清除画布重新绘制
            ctx.clearRect(0,0,900,600);
            isEat();
            isDead();
            drawtable();
        }

        //判断是否结束游戏
        function isDead(){
            //暂停判断
            console.log(flag);
            var Stop=document.querySelector("#Stop");
            Stop.onclick=function(){
                alert("目前您的得分是"+score+"\n点击确认继续游戏");
            } //没什么用的继续判断
            var Continue=document.querySelector("#Continue");
            Continue.onclick=function() {
                flag=1;
            }//重置
            var reset=document.querySelector("#Reset");
            reset.onclick=function() {
                flag=-1;
                //isDead();
            }            
            if(snake[snakeCount-1].x>885||snake[snakeCount-1].y>585
            ||snake[snakeCount-1].x<0||snake[snakeCount-1].y<0){
                flag=0;
            }
            if(flag<=0){
                clearInterval(Timer);
                x=0;
                if(flag==0){
                if(score==0){
                    alert("太遗憾了,您的得分是"+score);
                }
                else if(score<100){
                    alert("太棒了,您的得分是"+score);
                }
                else{
                    alert("绝了,您的得分居然是"+score+"!\n❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀");
                }  
                }
                Choose();
                start();
                setMove();//setInterval(move, 500-Sspeed);
                drawtable(); 
            }
        }

        function setMove(){
            if(x!=0){
                //非防止清除时的定时器不是这个一个,提前定义全局变量Timmer
                //清除定时器clearInterval(Timer);
                //setInterval会导致加速问题,最好使用setTimeout
                Sspeed=250-Sspeed;
                Timer=setInterval(move,Sspeed);
            }
            // function timeoutt(){
            //     if(flag!=0&&x!=0){
            //     move();
            //     setTimeout(timeoutt,(500-Sspeed) );               
            //     }
            // }
        }

        //为键盘按下赋值
        document.onkeydown=function(e){
            keydown(e);
        }

        function Choose(){
            Sspeed=100;
            x=0;
            flag=1;
            var degree=document.querySelector(".degree");
            var button=degree.querySelectorAll("button");
            var Degree=document.querySelector(".Degree");
            Degree.style.left="40%";
            //方法1.此处可直接用let,避免用var
            for(let i=0;i<button.length;i++){
                //方法2.需提前存入i的值,否则点击出现的是最后总数量+1
                //button[i].setAttribute('i',i+1);
                //x=this.getAttribute('i');
                button[i].onclick=function(){
                    //console.log(i);//测试
                    x=i+1;
                    Sspeed=Sspeed*(i);
                    Degree.style.left="-999px";
                    start();
                    setMove();
                    drawtable(); 
                }
            }           
        }
        //加载动画
        window.onload=function(){
            Choose()
            start();
            setMove();//setInterval(move, 500-Sspeed);
            drawtable(); 
            //Choose();         
            }
    </script>
</body>
</html>
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值