用jquery写贪吃蛇

须要具有学问:
1.html、css基本
2.jquery基本

详细完成要领:

  • 建立游戏界面
.bts
        {
            display: flex;
        }
        .bt
        {
            width: 60px;
            height: 24px;
            line-height: 24px;
            font-size: 18px;
            text-align: center;
            background: #ede;
            margin-left: 20px;
        }
        .bg
        {
            width: 400px;
            height: 400px;
            background: #ddd;
            margin-top: 30px;
            position: relative;
        }


    <div class="bts">
        <div class="start bt" onclick="start()">最先</div>
        <!-- <div class="pause bt" onclick="pause()">停息</div> -->
    </div>
    <div class="bg">
        
    </div>

个中bts是按钮组,因为最先盘算写个停息,背面摒弃了,bt是按钮,bg是游戏界面(大小最好为10,15,20的倍数,比较轻易盘算游戏内方块的),个中bg(游戏界面背景)是才用relative定位,蛇与食品采纳用absolute定位。

  • 定义游戏重要函数

    起首,假定游戏内方块的个数为2020,每一个方块的大小为20px20px(固然为了适配手机,能够转换为rem去适配网页大小),蛇与食品的大小为一个方块的大小(food为食品,snakes为蛇)
    个中因为border会在div的表面去衬着,所以,大小为20的方块,现实宽高为18px,加上高低各1px的边框,一个食品与蛇的大小为20px*20px

.snakes,.food
        {
            position: absolute;
            width: 18px;
            height: 18px;
            border: solid 1px #444;
        }
        .snakes
        {
            background: red;
        }
        .food
        {
            background: yellow;
        }
  • 定义游戏中的变量,
    var snakes = [];    //存储蛇的位置
    var stepX = 20;    //默许向X行走的像素
    var stepY = 0;    //默许向Y行走的像素
    var live = false;    //是不是存活
    var isPause = false;    //是不是停息 ,未用
    var food = {};    //食品的位置
    var keydown = 'right';    //默许方向为右
start()函数,点击最先游戏时刻,实行的操纵
start = function(){    //最先
        if(!live)
        {
            stepX = 20;
            stepY = 0;
            keydown = 'right';
            live = true;
            $(".snakes").remove();
            snakes = [];
            drawSnake(3);    //初始化蛇
            snakeMove();    //挪动蛇,游戏重要历程
            createFood();    //建立食品
        }
        isPause = false;
        
    }
起首点击游戏最先的时刻,须要去初始化一下蛇,让他天生在游戏区域内的左上角,因为采纳的是absolute定位,所以,默许的第一个点的位置为top:0;left:0; (算作坐标轴的话,右上角的原点为0,0),定义一个蛇的方块,经由过程for轮回,将蛇画在屏幕的左上角,个中num为默许蛇的长度。然后将建立的元素存成json花样的,push在snakes数组内里。因为push()是往最背面去增加元素,所以蛇的头是snakes内里末了的一个元素
drawSnake = function(num){        //初始化蛇身材
        var item = '<div class="snakes"></div>'
        for(var i=0;i<num;i++)
        {
            $(".bg").append(item)
            $(".snakes").eq(i).css({
                top:0,
                left:20*i
            })
            item1 = {
                top:0,
                left:20*i
            }
            snakes.push(item1)
            //console.log(snakes);
        }
    }
运用setTimeout(),去驱动蛇,因为蛇头是存在数组的末了一名,所以蛇头现实上是snakes[snakes.length-1]这个元素,然后,经由过程for轮回,去让蛇的第i个元素的值即是第i+1个值(蛇头是末了一个,所以假如蛇长度为三个的话,先把第一个的位置挪动到第第二个的位置,第二个的位置挪动到第一个的位置,然后再将蛇头往其他地方挪动,就申明蛇挪动了),然后setTimeout内里继承递归挪用该函数,蛇就会最先挪动
snakeMove = function(){        //挪动蛇
        if(live){    //推断蛇是不是存活,假如存活,则挪动蛇,不然弹出游戏完毕
            for(var i=0;i<snakes.length-1;i++)
            {
                $(".snakes").eq(i).css({
                    top:snakes[i+1].top,
                    left:snakes[i+1].left
                })
                snakes[i].top = snakes[i+1].top
                snakes[i].left = snakes[i+1].left
            }
            var first = snakes.length-1
            $(".snakes").eq(first).css({
                    top:snakes[first].top+stepY,
                    left:snakes[first].left+stepX
                })
            snakes[first].top = snakes[first].top+stepY;
            snakes[first].left = snakes[first].left+stepX;
            if(!isLive(snakes[first].top,snakes[first].left))
            {
                live = false;
                alert("游戏完毕");
            }
            else
            {
                eatFood(snakes[first].top,snakes[first].left);
                setTimeout("snakeMove()",100);        
            }    
        }
    }

将蛇驱动后,最先掌握蛇的挪动与游戏完毕。
isLive = function(top,left){
        if(top>380||top<0||left>380||left<0)    //假如蛇挪动到画布表面,则游戏完毕,最先坐标是0,0,所以边境值是380,380
        {
            return false;
        }
        else
        {    
            for(var i=0;i<snakes.length-1;i++)    //轮回蛇每一个元素,推断蛇头是不是与他们重合,重合的话,则申明蛇撞到本身,游戏完毕
            {
                
                if(top==snakes[i].top&&left==snakes[i].left)    
                {
                    return false;
                    break;
                }
            }
            return true;
        }
    }
    document.onkeydown = function(event) {    //推断点击的按钮,让蛇往差别的方向去走(注重右上角是坐标原点,往下是Y,往右是X)
        //console.log(event);
        if(event.keyCode==38)    //上
        {    
            if(keydown!='down')    //假如往下走,就不能只能摁上,假如直接倒着走,会撞到本身,完毕游戏
            {
                keydown='up';
                stepX=0;
                stepY=-20;
            }
        }
        else if(event.keyCode==40)    //下
        {
            if(keydown!='up')
            {
                keydown='down';
                stepX=0;
                stepY=20;
            }
        }
        else if(event.keyCode==37)    //左
        {
            if(keydown!='right')
            {
                keydown='left';
                stepX=-20;
                stepY=0;
            }
        }
        else if(event.keyCode==39)    //右
        {
            if(keydown!='left')
            {
                keydown='right'
                stepX=20;
                stepY=0;
            }
        }
    }
将完毕游戏与蛇挪动处置惩罚完后,最先处置惩罚建立食品与推断是不是吃掉食品
createFood = function(){    //建立食品
        $(".food").remove();    //起首清算掉最先默许的食品(背面吃掉食品的时刻,也会用该函数举行建立)
        isCreate = true    //设置一个状况去推断食品是不是建立胜利
        do
        {
            food={    //天生食品的位置,用随机数天生(边境值为380,380 上面说过)
                top:Math.round(Math.random()*19)*20,    
                left:Math.round(Math.random()*19)*20
            }
            for(var i=0;i<snakes.length;i++)    //轮回蛇身材,让天生的食品不能天生在蛇身上,假如天生胜利了,就跳出do while (没有做通关的推断,因为觉得没人能玩到通关)
            {
                if(food.top==snakes[i].top&&food.left==snakes[i].left)
                {    
                    isCreate = false;
                    break;
                }
                else
                {
                    isCreate = true;
                }
            }
        }
        while(!isCreate)
        var foodItem ='<div class="food"></div>'
        $(".bg").append(foodItem);
        $(".food").css({
            top:food.top,
            left:food.left
        })
    }
    eatFood = function(top,left){    //是不是吃到食品
        if(top==food.top&&left==food.left)    //假如蛇吃到食品,那末蛇头的坐标与食品坐标重合,然后将食品谁人点作为蛇头,append一个蛇元素到游戏内里,再把坐标push到蛇内里,然后建立一个新的食品
        {
            var item = '<div class="snakes"></div>'
            snakes.push({top:top,left:left})
            $(".bg").append(item)
            $(".snakes").last().css({
                top:top,
                left:left
            })
            createFood();
        }
    }
项目源码:
<!DOCTYPE html>
<html>
<head>
    <title>贪吃蛇</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <style type="text/css" media="screen">
        .bts
        {
            display: flex;
        }
        .bt
        {
            width: 60px;
            height: 24px;
            line-height: 24px;
            font-size: 18px;
            text-align: center;
            background: #ede;
            margin-left: 20px;
        }
        .bg
        {
            width: 400px;
            height: 400px;
            background: #ddd;
            margin-top: 30px;
            position: relative;
        }
        .snakes,.food
        {
            position: absolute;
            width: 18px;
            height: 18px;
            border: solid 1px #444;
        }
        .snakes
        {
            background: red;
        }
        .food
        {
            background: yellow;
        }
    </style>
</head>
<body>
    <div class="bts">
        <div class="start bt" onclick="start()">最先</div>
        <!-- <div class="pause bt" onclick="pause()">停息</div> -->
    </div>
    <div class="bg">
        
    </div>
</body>
<script type="text/javascript">
    var snakes = [];
    var stepX = 20;
    var stepY = 0;
    var live = false;
    var isPause = false;
    var food = {};
    var keydown = 'right';    //默许方向为右
    start = function(){    //最先
        if(!live)
        {
            stepX = 20;
            stepY = 0;
            keydown = 'right';
            live = true;
            $(".snakes").remove();
            snakes = [];
            drawSnake(5);
            snakeMove();
            createFood();
        }
        isPause = false;
        
    }
    pause = function(){    //停息
        isPause = true;
    }
    drawSnake = function(num){        //初始化蛇身材
        var item = '<div class="snakes"></div>'
        for(var i=0;i<num;i++)
        {
            $(".bg").append(item)
            $(".snakes").eq(i).css({
                top:0,
                left:20*i
            })
            item1 = {
                top:0,
                left:20*i
            }
            snakes.push(item1)
            //console.log(snakes);
        }
    }
    snakeMove = function(){        //挪动蛇
        if(live){
            for(var i=0;i<snakes.length-1;i++)
            {
                $(".snakes").eq(i).css({
                    top:snakes[i+1].top,
                    left:snakes[i+1].left
                })
                snakes[i].top = snakes[i+1].top
                snakes[i].left = snakes[i+1].left
            }
            var first = snakes.length-1
            $(".snakes").eq(first).css({
                    top:snakes[first].top+stepY,
                    left:snakes[first].left+stepX
                })
            snakes[first].top = snakes[first].top+stepY;
            snakes[first].left = snakes[first].left+stepX;
            if(!isLive(snakes[first].top,snakes[first].left))
            {
                live = false;
                alert("游戏完毕");
            }
            else
            {
                eatFood(snakes[first].top,snakes[first].left);
                setTimeout("snakeMove()",100);        
            }    
        }
    }
    isLive = function(top,left){
        if(top>380||top<0||left>380||left<0)
        {
            return false;
        }
        else
        {    
            for(var i=0;i<snakes.length-1;i++)
            {
                
                if(top==snakes[i].top&&left==snakes[i].left)
                {
                    return false;
                    break;
                }
            }
            return true;
        }
    }
    createFood = function(){    //建立食品
        $(".food").remove();
        isCreate = true
        do
        {
            food={
                top:Math.round(Math.random()*19)*20,
                left:Math.round(Math.random()*19)*20
            }
            for(var i=0;i<snakes.length;i++)
            {
                if(food.top==snakes[i].top&&food.left==snakes[i].left)
                {    
                    isCreate = false;
                    break;
                }
                else
                {
                    isCreate = true;
                }
            }
        }
        while(!isCreate)
        var foodItem ='<div class="food"></div>'
        $(".bg").append(foodItem);
        $(".food").css({
            top:food.top,
            left:food.left
        })
    }
    eatFood = function(top,left){    //是不是吃到食品
        if(top==food.top&&left==food.left)
        {
            var item = '<div class="snakes"></div>'
            snakes.push({top:top,left:left})
            $(".bg").append(item)
            $(".snakes").last().css({
                top:top,
                left:left
            })
            createFood();
        }
    }
    document.onkeydown = function(event) {
        //console.log(event);
        if(event.keyCode==38)    //上
        {    
            if(keydown!='down')
            {
                keydown='up';
                stepX=0;
                stepY=-20;
            }
        }
        else if(event.keyCode==40)    //下
        {
            if(keydown!='up')
            {
                keydown='down';
                stepX=0;
                stepY=20;
            }
        }
        else if(event.keyCode==37)    //左
        {
            if(keydown!='right')
            {
                keydown='left';
                stepX=-20;
                stepY=0;
            }
        }
        else if(event.keyCode==39)    //右
        {
            if(keydown!='left')
            {
                keydown='right'
                stepX=20;
                stepY=0;
            }
        }
    }

</script>
</html>
    原文作者:恃爱行凶
    原文地址: https://segmentfault.com/a/1190000017537322
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞