贪吃蛇游戏总结

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇游戏</title>
    <style type="text/css">
        body{
            margin: 0px;
        }
    </style>
</head>
<body>

</body>
</html>
<script type="text/javascript">
    //创建绘地图 创建一个类
    function Map(){
        //创建类的私有成员
        var w=800;
        var h=400;
        //成员方法 用来绘制地图
        this.showmap=function(){
            //创建div 设置css样式 追加给body
            var tu=document.createElement('div');
            tu.style.width=w+"px";
            tu.style.height=h+"px";
            tu.style.backgroundImage="url(12.jpg)";
            document.body.appendChild(tu);
        }
    }


    //绘制食物 创建一个类
    function Food(){
        //创建私有成员  代表移动的步进值
        var len=20;
        //创建成员方法 将食物坐标设置成公开的 以便在外部访问
        var xFood=0;
        var yFood=0;
        //设置初始时食物为空以便能够判断
        this.piece=null;
        this.showfood=function(){
            //创建div 设置css样式 追加给body
            //判断piece为空时进行创建
            if (this.piece==null) {
                this.piece=document.createElement('div');
                this.piece.style.width=this.piece.style.height=len+"px";
                this.piece.style.backgroundColor="green";
                this.piece.style.position="absolute";//设置绝对定位
                 document.body.appendChild(this.piece);
            }
            this.xFood=Math.floor(Math.random()*40);//0-39之间的随机数
            this.yFood=Math.floor(Math.random()*20);//0-19之间的随机数
           this.piece.style.left= this.xFood*len+"px";//食物之间的真实坐标是:权值坐标+步数
            this.piece.style.top= this.yFood*len+"px";

        }
    }



    //绘制贪食蛇 设置贪食蛇的类
    function Snake(){
        var len=20;
        //设置默认移动位置为向右
        this.redirect='right';
        //绘制蛇身 一个二位数组 分别代表x坐标 y坐标 颜色
        //增加null用来表示此蛇节是否被创建过 创建过移动后就不会重新创建了
        this.snakebody=[[0,1,'gray',null],[1,1,'gray',null],[2,1,'gray',null],[3,1,'red',null]];
        this.showsnake=function(){
            //遍历各个蛇节,并依次创建即可
            for(var i=0;i<this.snakebody.length;i++){
                if (this.snakebody[i][3]==null) {
                    this.snakebody[i][3]=document.createElement('div');
                    this.snakebody[i][3].style.width=this.snakebody[i][3].style.height=len+'px';
                    this.snakebody[i][3].style.backgroundColor=this.snakebody[i][2];
                    this.snakebody[i][3].style.position='absolute';
                    this.snakebody[i][3].style.left=this.snakebody[i][0]*len+"px";
                    this.snakebody[i][3].style.top=this.snakebody[i][1]*len+"px";
                    document.body.appendChild(this.snakebody[i][3]);
                }
                //如果被创建过则就选择直接改变坐标
                this.snakebody[i][3].style.left=this.snakebody[i][0]*len+"px";
                this.snakebody[i][3].style.top=this.snakebody[i][1]*len+"px";
            }



            //设置蛇移动时的方法 分为蛇节坐标 蛇头坐标分别设置
            this.movesnake=function(){
            //蛇节坐标在移动时的新坐标是前边蛇节坐标的旧坐标
                for(var i=0;i<this.snakebody.length-1;i++){
                    this.snakebody[i][0]=this.snakebody[i+1][0];
                    this.snakebody[i][1]=this.snakebody[i+1][1];
                }
                //设置蛇头的变化情况
                if (this.redirect=='right') {
                    this.snakebody[this.snakebody.length-1][0] +=1;
                }
                 if (this.redirect=='left') {
                    this.snakebody[this.snakebody.length-1][0] -=1;
                }
                 if (this.redirect=='up') {
                    this.snakebody[this.snakebody.length-1][1] -=1;
                }
                 if (this.redirect=='down') {
                    this.snakebody[this.snakebody.length-1][1] +=1;
                }


                //吃食物
                //首先获得食物和蛇头的位置
                var xSnake=this.snakebody[this.snakebody.length-1][0];
                var ySnake=this.snakebody[this.snakebody.length-1][1];
                console.log(xSnake);
                if (xSnake == food.xFood && ySnake == food.yFood) {
                    //复制最后一个节点
                    var newjie=[this.snakebody[0][0],this.snakebody[0][1],'gray',null];
                    //将最后一个节点放入二维数组中
                    this.snakebody.unshift(newjie);
                    //重新创建食物
                    food.showfood();
                }



                //判断小蛇的移动范围
                if (xSnake<0 || xSnake>39 || ySnake<0 ||ySnake>19) {
                    alert('game over!');
                    clearInterval(mytime);
                    return false;
                }
                //判断自己的蛇头是否和自己的蛇节的某个坐标相重
                for(var k=0;k<this.snakebody.length-1;k++){
                    if (this.snakebody[k][0]==xSnake && this.snakebody[k][1]==ySnake) {
                        alert('game over!');
                        clearInterval('mytime');
                        return false;
                    }
                }

                //调用显示函数 使得在坐标改变后可以 重新显示蛇 既重新绘制
                this.showsnake();
            }


        }
    }




    //实例化这个类
    window.onload=function(){
        //实例化地图的对象
        var map=new Map();
        map.showmap();


        //实例化食物的对象 将食物设置成全局的 以便函数外访问
        food=new Food();
        food.showfood();


        //实例化蛇的对象
        snake=new Snake();
        //调用显示蛇的方法来绘制蛇
        snake.showsnake();
        //调用蛇的移动方法 开控制蛇的移动 使得蛇可以连续的移动 必须将snake设置成全局变量才可以使用
        mytime=setInterval("snake.movesnake()",200);        
        //设置上下左右来控制 判断用== 不能用=
        document.onkeydown=function(evt){
            var num=evt.keyCode;
            if (num==38) {
                //设置向上
                snake.redirect='up';
                snake.movesnake();
            }
            if (num==40) {
                //设置向下
                snake.redirect='down';
                snake.movesnake();
            }
            if (num==37) {
                //设置向左
                snake.redirect='left';
                snake.movesnake();
            }
            if (num==39) {
                //设置向右
                snake.redirect='right';
                snake.movesnake();
            }

        }

    }


</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值