JS贪吃蛇

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="tcs.css">
</head>

<body>
    <div class="startPage" id="startPage">
        <div class="startBtn" id = "startBtn"></div>
    </div>
    <div class="wrapper">
        <div class="left-side">
            <img src="img/start.png" alt="" class="startPaush" id="startPaush">
        </div>
        <div class="main">
            <div class="header">
                <div class="score">
                    分数:
                    <span id="score"></span>
                </div>
            </div>
            <div class="content" id="content"></div>
        </div>
    </div>
    <div class="loser" id="loser">
        <div class="con">
            <div class="close" id="close"></div>
            <span class="loserScore" id="loserScore"></span>
        </div>
    </div>
    <script src="tcs.js"></script>
</body>

</html>
*{
    margin:0;
    padding:0;
    list-style:none;
}
.startPage{
    width:100%;
    z-index:999;
    height:800px;
    position:absolute;
    top:0;
    left:0;
}
.startBtn{
    position:absolute;
    height:170px;
    width:200px;
    background-image: url('img/startGame.png');
    background-size:100% 100%;
    cursor: pointer;
    left:0;
    top:0;
    right:0;
    bottom:0;
    margin:auto;
}
.wrapper{
    height:800px;
    width:100%;
    position:relative;
    background-image:url('img/bg.jpg');
    background-size: 100% 100%;    
}
.left-side{
    position: absolute;
    width:24%;
    height:800px;
}
.left-side img{
    margin-left:50px;
    margin-top:50px;
    display:none;
}
.main{
    position:absolute;
    left:25%;
    display: inline-block;
    width:50%;
    height:90%;
}
.header{
    width:100%;
    height:80px;
    text-align:center;
}
.score{
    line-height:40px;
    color:#ddd;
    font-size:20px;
    font-weight:bolder;
}
.score span{
    display:inline-block;
    height:80px;
    width:30px;
    line-height:80px;
    
}

.content{
    position:absolute;
    width:79.5%;
    height:36.5%;
    left:10%;
    /* top:244px; */
    top:34%;
    /* border:1px solid black;  */
}
.loser{
    display:none;
    position:absolute;
    width:100%;
    height:100%;
    top:0;
    left:0;
}

.con{
    background-image: url('img/startP.jpg');
    background-size:100% 100%;
    height:300px;
    width:400px;
    position:absolute;
    margin:auto;
    left:0;
    top:0;
    right:0;
    bottom:0;
    border-radius:20px;
}

.close{
    position:absolute;
    top:0;
    right:0;
    height:40px;
    width:40px;
    background-image: url('img/closeBtn.png');
    background-size:100% 100%;
    cursor: pointer;
}
.loserScore{
    display:block;
    height:30px;
    width:60px;
    position:absolute;
    top:42%;
    left:40%;
    color:#222;
    font-size:30px;
    font-weight:bolder;
}

.food{
    background-image: url('img/lyt.jpg');
    background-size:100% 100%;
}
.head{
    background-image: url('img/cfx.png');
    background-size:100% 100%;
}
.body{
    background-image: url('img/cyx.jpg');
    background-size:100% 100%;
}

var snakeMove;
var startGameBool = true;
var startPauseBool = true;
var speed = 200;
var scoreBox = document.getElementById('score');
var content = document.getElementById('content');
var lose = document.getElementById('loser');
var loserScore = document.getElementById('loserScore');
var startPaush = document.getElementById('startPaush');
var closeBtn = document.getElementById('close');
var startBtn = document.getElementById('startBtn');
var startPage = document.getElementById('startPage');

init();
function init() {
    //地图属性
    this.mapW = parseInt(window.getComputedStyle(content).width);
    this.mapH = parseInt(window.getComputedStyle(content).height);
    this.mapDiv = content;
    //食物属性
    this.foodW = 20;
    this.foodH = 20;
    this.foodX = 0;
    this.foodY = 0;
    this.foodColor = '#00F';
    //蛇属性
    this.snake;
    this.snakeW = 20;
    this.snakeH = 20;
    this.snakeBody = [[3, 0, 'head'], [2, 0, 'body'], [1, 0, 'body']];
    //游戏属性
    this.direct = 'right';
    this.left = false;
    this.right = false;
    this.up = true;
    this.down = true;

    //分数
    this.score = 0;
    scoreBox.innerHTML = this.score;
    bindEvent();
}
function startGame() {
    startPage.style.display = 'none';
    startPaush.style.display = 'block';
    food();
    snake();
}

function food() {
    var food = document.createElement('div');
    food.style.width = this.foodW + 'px';
    food.style.height = this.foodH + 'px';
    food.style.borderRadius = '50%';
    this.foodX = Math.floor(Math.random() * (this.mapW / this.foodW));
    this.foodY = Math.floor(Math.random() * (this.mapH / this.foodH));
    
    food.style.left = this.foodX * this.foodW + 'px';
    food.style.top = this.foodY * this.foodH + 'px';

    food.style.position = 'absolute';
    this.mapDiv.appendChild(food).setAttribute('class', 'food');
}
function snake() {
    for (var i = 0; i < this.snakeBody.length; i++) {
       var snake = document.createElement('div');
        snake.style.width = this.snakeW + 'px';
        snake.style.height = this.snakeH + 'px';
        snake.style.borderRadius = '50%';
        snake.style.position = 'absolute';
        snake.style.left = this.snakeBody[i][0] * 20 + 'px';
        snake.style.top = this.snakeBody[i][1] * 20 + 'px';
        snake.classList.add(this.snakeBody[i][2]);
        this.mapDiv.appendChild(snake).classList.add('snake');   
        switch (this.direct) {
            case 'right':
                break;
            case 'up':
                snake.style.transform = 'rotate(270deg)'
                break;
            case 'left':
                snake.style.transform = 'rotate(180deg)'
                break;
            case 'down':
                snake.style.transform ='rotate(90deg)';
                break;
            default:
                break;
        }
    }
}
function move() {
    //蛇身位置
    for (var i = this.snakeBody.length - 1; i > 0; i--) {
        this.snakeBody[i][0] = this.snakeBody[i - 1][0];
        this.snakeBody[i][1] = this.snakeBody[i - 1][1];
    }
    //蛇头位置
    switch (this.direct) {
        case 'right':
            this.snakeBody[0][0] += 1;
            break;
        case 'up':
            this.snakeBody[0][1] -= 1;
            break;
        case 'left':
            this.snakeBody[0][0] -= 1;
            break;
        case 'down':
            this.snakeBody[0][1] += 1;    
            break;
        default:
            break;

    }
    //删除之前蛇的节点 再渲染
    removeClass('snake');
    snake();
    // 如果蛇头和食物x y同时相等 代表吃到食物
    if (this.snakeBody[0][0] == this.foodX && this.snakeBody[0][1] == this.foodY) {
        var snakeTailX = this.snakeBody[this.snakeBody.length - 1][0];
        var snakeTailY = this.snakeBody[this.snakeBody.length - 1][1];
        switch (this.direct) {
            case 'right':
                this.snakeBody.push([snakeTailX + 1, snakeTailY, 'body']);

                break;
            case 'up':
                this.snakeBody.push([snakeTailX, snakeTailY - 1, 'body']);
                break;
            case 'left':
                this.snakeBody.push([snakeTailX - 1, snakeTailY, 'body']);
                break;
            case 'down':
                this.snakeBody.push([snakeTailX, snakeTailY + 1, 'body']);
                break;
            default:
                break;
        }
        this.score += 1;
        scoreBox.innerHTML = this.score;
        removeClass('food');
        food();

    }
    // 判断撞到边界
    if (this.snakeBody[0][1] < 0 || this.snakeBody[0][1] >= this.mapH / this.snakeH) {
        this.reloadGame();
    }
    if (this.snakeBody[0][0] < 0 || this.snakeBody[0][0] >= this.mapW / this.snakeW) {
        this.reloadGame();
    }
    var snakeHeaderX = this.snakeBody[0][0];

    var snakeHeaderY = this.snakeBody[0][1];
    for (var i = 1; i < this.snakeBody.length; i++) {
        var snakeBodyX = this.snakeBody[i][0];
        var snakeBodyY = this.snakeBody[i][1];
        if (snakeHeaderX == snakeBodyX && snakeHeaderY == snakeBodyY) {
            this.reloadGame();
        }
    }
}

function setDerict(code) {
    switch (code) {
        case 37:
            if (this.left) {
                this.direct = 'left';
                this.left = false;
                this.right = false;
                this.up = true;
                this.down = true;
            }
            break;
        case 38:
            if (this.up) {
                this.direct = 'up';
                this.left = true;
                this.right = true;
                this.up = false;
                this.down = false;
            }
            break;
        case 39:
            if (this.right) {
                this.direct = 'right';
                this.left = false;
                this.right = false;
                this.up = true;
                this.down = true;
            }
            break;
        case 40:
            if (this.down) {
                this.direct = 'down';
                this.left = true;
                this.right = true;
                this.up = false;
                this.down = false;
            }
            break;
        default:
            break;
    }

}

function reloadGame() {
    removeClass('snake');
    removeClass('food');
    clearInterval(snakeMove);
    startPaush.setAttribute('src', './img/start.png');
    this.snakeBody = [[3, 2, 'head'], [2, 2, 'body'], [1, 2, 'body']];
    this.direct = 'right';
    this.left = false;
    this.right = false;
    this.up = true;
    this.down = true;
    startPauseBool = true;
    startGameBool = true;
    lose.style.display = 'block';
    loserScore.innerHTML = this.score;
    this.score = 0;
    scoreBox.innerHTML = this.score;
}

function removeClass(calssName) {
    var ele = document.getElementsByClassName(calssName);
    while (ele.length > 0) {
        ele[0].parentNode.removeChild(ele[0]);
    }
}

function bindEvent() {
    startBtn.onclick = function(){
        startAndPauseGame();        
    }
    startPaush.onclick = function () {
        startAndPauseGame();
    }
    closeBtn.onclick = function () {
        lose.style.display = 'none';
    }
}

//开始和暂停游戏 逻辑封装
function startAndPauseGame() {
    if (startPauseBool) {
        if (startGameBool) {
            startGame();
            startGameBool = false;
        }
        startPaush.setAttribute('src', './img/pause.png');
        snakeMove = setInterval(function () {
            move();
        }, speed);
        document.onkeydown = function (e) {
            var code = e.keyCode;
            setDerict(code);
        };
        startPauseBool = false;
    } else {
        //暂停
        startPaush.setAttribute('src', './img/start.png');
        clearInterval(snakeMove);
        document.onkeydown = function (e) {
            e.returnValue = false;
            return false;
        };
        startPauseBool = true;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值