前端那些事之原生 js实现贪吃蛇篇

原生js实现贪吃蛇

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇游戏</title>
    <style>
        body, div, img {
            margin: 0 auto;
            padding: 0;
        }
        body{
            background-color: #fff;
            color:#b35208;
        }
        .wrapper{
            width: 800px;
            height: 400px;
            background: url("./images/bg.png") no-repeat center center;
            padding: 80px;
        }
        .score{
            margin: 10px auto;
            text-align: center;
            font-size: 30px;
            font-weight: 900;
        }
        .col{
            width: 40px;
            height: 40px;
            float: left;
            display: inline-block;

        }
        .row{

        }
        .snake{
            background: url("./images/box.png") no-repeat center center;
            background-size: 100% 100%;
        }
        .egg{
            background: url("./images/circle.png") no-repeat center center;
            background-size: 100% 100%;
        }
        .gameover{
            position: fixed;
            top: 50%;
            left: 50%;
            width: 408px;
            height: 90px;
            margin-top: -90px;
            margin-left:-204px;
            background: url("./images/gameover.png") no-repeat center center;
            opacity:0;
            transform: scale(0);
            transition: all .5s;
            z-index: -1;
        }
        .show{
            opacity:1;
            transform: scale(1);
            z-index: 1;
        }
        
    </style>
</head>
<body>
<div class="gameover" id="gameover">

</div>
<div class="score">得分:0</div>
<div class="wrapper">
    <!--<div class="row">-->
        <!--<div class="col snake"></div>-->
        <!--<div class="col"></div>-->
        <!--<div class="col egg"></div>-->
    <!--</div>-->
</div>
<script>
    /*
    * 1.创建基础
    * 2.蛇的初始化,实物的初始化(随机)
    * 3.开始游戏
    *   1.键盘事件切换
    *   2.开始之后,判断是否碰到墙
    *   3.判断是否碰到自己
    *   4.判断是否吃了实物
    * 4.游戏结束
    * */
    var scoreDiv = document.querySelector(".score"); //取得分的div对象
    var score = 0;//得分
    var rows = 9; //行
    var cols = 20; //列
    var snakeArr = []; //存储所有对象
    var time = 400; //毫秒

    var snakebody = []; //定义一个数组存放蛇身
    var direction = "right"; //操作蛇移动的方向
    var changeDir = true; //添加键盘事件监听方向键来改变蛇的移动方向

    function createModel(){//创建基础
        var wrapperDiv = document.querySelector(".wrapper");
        for(var i = 0; i < rows; i++) {
            var rowDiv = document.createElement("div");
            var rowArry = [];
            for(var j = 0; j < cols; j++) {
                var colDiv = document.createElement("div");
                colDiv.className = "col";
                rowArry.push(colDiv);
                rowDiv.appendChild(colDiv);
            }
            snakeArr.push(rowArry);
            wrapperDiv.appendChild(rowDiv);
        }
        wrapperDiv.style.width = cols * 40 + "px";
        wrapperDiv.style.margin = "auto";
    }
    //创建蛇的初始模型
    function snake() {
        for(var i = 0; i < 3; i++) {
            snakeArr[0][i].className = "col snake";
            snakebody.push(snakeArr[0][i]);
        }
    }
    createModel();
    snake();

    document.onkeydown = function(event) {
        event = event || window.event; //判断是否需要改变方向,true表示需要 false不需要
        if(!changeDir) {
            return; //表示直接结束函数,后续代码不执行
        }
        //假设蛇在向右移动,按键左右都不起作用
        if(direction == "right" && event.keyCode == "37") {
            return;
        }
        if(direction == "left" && event.keyCode == "39") {
            return;
        }
        if(direction == "down" && event.keyCode == "38") {
            return;
        }
        if(direction == "up" && event.keyCode == "40") {
            return;
        }
        //更据按键操作,设置方向
        switch(event.keyCode) {
            case 37:
                direction = "left"; //方向向左
                break;
            case 38:
                direction = "up";
                break;
            case 39:
                direction = "right";
                break;
            case 40:
                direction = "down";
                break;
        }
        //按键后变为false
        changeDir = false;
        //延迟
        var delayTime = setTimeout(function() {
            changeDir = true;
            clearTimeout(delayTime);
        }, time);
    }
    //蛇的移动偏移量
    var x = 2;
    var y = 0;
    //蛇的移动函数
    function snakeMove() {
        var snameTimer = setInterval(function() {
            //更据设置的方向设置蛇头的方向
            switch(direction) {
                case "right":
                    x++;
                    break;
                case "left":
                    x--;
                    break;
                case "up":
                    y--;
                    break;
                case "down":
                    y++;
                    break;
            }
            //判断游戏结束--碰壁

            if(x < 0 || x >= cols || y < 0 || y >= rows) {
                document.getElementById("gameover").style.display = "block";
                clearInterval(snameTimer);
                return;
            }
            //判断蛇吃到自己
            for(var i = 0; i < snakebody.length; i++) {
                if(snakebody[i] == snakeArr[y][x]) {
                    document.getElementById("gameover").style.display = "block";
                    clearInterval(snameTimer);
                    return;
                }
            }
            //判断蛇头移动的位置是否有蛋
            if(eggX == x && eggY == y) {
                snakeArr[eggY][eggX].className = "col snake";
                snakebody.push(snakeArr[eggY][eggX]);//加入到蛇身
                score++;
                scoreDiv.innerHTML = "得分:" + score;
                food();
            } else {
                snakebody[0].className = "col";
                snakebody.shift();
                snakeArr[y][x].className = "col snake";
                snakebody.push(snakeArr[y][x]);
            }
        }, time);
    }
    snakeMove();
    //随机函数
    function randomNumber(max) {
        var ran = Math.floor(Math.random() * max);
        return ran;
    }
    //生成蛋的函数
    var eggX = 0;
    var eggY = 0;
    function food() {
        //随机出新的egg的下标的x和y
        eggX = randomNumber(cols);
        eggY = randomNumber(rows);
        //如果即将生蛋的位置和蛇身重合
        if(snakeArr[eggY][eggX].className == "col snake") {
            food(); //重新生成
        } else {
            //否则 新生生蛋的位置并改样式
            snakeArr[eggY][eggX].className = "col egg";
        }
    }
    food();
</script>
</body>
</html>

转载于:https://my.oschina.net/yongxinke/blog/852277

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值