<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            #map{
                position: absolute;
                top: 50%;
                left: 50%;
                margin-left: -330px;
                margin-top: -220px;
            }
            .box{
                position: absolute;
                background: #CCCCCC;
                border: 1px solid #fff;
            }
            #btn{
                width: 100px;
                height: 30px;
                position: absolute;
                left: 50%;
                top: 120px;
                margin-left: -50px;
            }
            #coun{
                width: 100px;
                height: 30px;
                position: absolute;
                left: 50%;
                top: 170px;
                margin-left: -50px;
                border: 2px solid #CCCCCC;
                text-align: center;
                line-height: 30px;
            }
            .snake{
                position: absolute;
                background: red;
                border: 1px solid #fff;
            }
            .food{
                position: absolute;
                background: blue;
                border: 1px solid #fff;
            }
        </style>
    </head>
    <body>
        <input type="button" value="开始游戏" id="btn"/>
        <div id="coun">得分:<span>0</span></div>
        <div id="map"></div>
        <script>
            window.onload = function(){
                var oMap = document.getElementById("map");
                var btn = document.getElementById("btn");
                var oSpan = document.getElementsByTagName("span")[0];
                var rows = 20; //设置地图行
                var column = 30;//设置地图列
                var boxHeight = 20;//格子高
                var boxWidth = 20;//格子宽
                var maps = [];//地图数组
                var snake = [];//蛇的数组
                var snakeX =null;//蛇的X坐标
                var snakeY =null;//蛇的Y坐标
                var foodX =null;//食物的X坐标
                var foodY =null;//食物的X坐标
                var direction = null; //方向
                var num = 0; //记录分数
                function reset(){//复位函数
                    oMap.innerHTML = "";
                    snake = [];
                    direction = null;
                    num = 0;
                    oSpan.innerHTML = num;
                }
                btn.onclick = function(){//点击开始游戏
                    reset();
                    readyPart();
                    move();
                    btn.value = "游戏进行中.....";
                    btn.disabled = true;
                    document.onkeydown = function(ev){
                        var ev = ev || event;
                        var keyCode = ev.keyCode || ev.which;
                        switch(keyCode){
                            case 37 :
                                if (direction != "right") {
                                    direction = "left";
                                }
                                break;
                            case 38 :
                                if (direction != "down") {
                                    direction = "up";
                                }
                                break;
                            case 39 :
                                if (direction != "left") {
                                    direction = "right";
                                }
                                break;
                            case 40 :
                                if (direction != "up") {
                                    direction = "down";
                                }
                                break;
                        }
                    }
                }
                function readyPart(){//准备部分函数
                    createMapArr();
                    crateSnake();
                    createFood();
                    createMap();
                }
                function createMap(){//生成地图
                    for (var i=0;i<column;i++) {
                        for (var j=0;j<rows;j++) {
                            var divs = document.createElement("div");
                            if (maps[i][j] == 1) {//当生成的坐标等于蛇的坐标
                                snake[0] = j*column + i;//将二维坐标转换为一维,y乘以列数+X,
                                divs.className = "snake";//同时将该一维坐标的方格变为snake 的类名
                            } else{
                                if (maps[i][j] == 2) {
                                    divs.className = "food";
                                } else{
                                    divs.className = "box";
                                }
                            }
                            divs.id = j*column + i;
                            divs.style.height = boxHeight +"px";
                            divs.style.width = boxWidth +"px";
                            divs.style.left = i*boxWidth +"px";
                            divs.style.top = j*boxWidth +"px";
                            oMap.appendChild(divs);    
                        }
                    }
                }
                function createMapArr(){//创建地图二维数组
                    for (var i=0;i<column;i++) {//创建二维数组
                        maps[i] = [];//先声明一维数组
                        for (var j=0;j<rows;j++) {
                            maps[i][j] = 0;//默认0,蛇 = 1;食物 = 2;
                        }
                    }
                }
                function crateSnake(){//生成蛇的随机坐标
                    snakeX = getRandom(column,0);
                    snakeY = getRandom(rows,0);
                    maps[snakeX][snakeY] = 1;
                }
                function createFood(){//生成食物的随机坐标
                    foodX = getRandom(column,0);
                    foodY = getRandom(rows,0);
                    maps[foodX][foodY] = 2;
                }
                function getRandom(Max,Min){//取随机数
                    var Range = Max;
                    var Rand = Math.random();
                    var num = Math.floor(Range*Rand) + Min;                    
                    return num;
                }
                function repeatArr(string,arr){//检测数组是否存在重复(蛇自己吃自己)
                    for (var i=0;i<arr.length;i++) {
                        if (arr[i] == string) {
                            console.log(string);
                            console.log(arr[i]);
                            return true;
                        }
                    }
                    return false;
                }
                function checkFood(){//检查新生成的食物是否与蛇的身体重合
                    foodX = getRandom(column,0);
                    foodY = getRandom(rows,0);
                    if (repeatArr(foodY*column + foodX,snake)) {//如果产生重合递归它
                            checkFood();
                    }else{
                        document.getElementById(foodY*column + foodX).className = "food";//如果没有产生重合生成新食物
                    }
                }
                function move(){//移动函数
                    var initPosition = snake[0];
                    var stratPosition = snake[0];//开始位置
                    switch(direction){
                        case "left":
                            stratPosition = snake[0] - 1;
                            break;
                        case "up":
                            stratPosition = snake[0] - column;
                            break;
                        case "right":
                            stratPosition = snake[0] + 1;
                            break;
                        case "down":
                            stratPosition = snake[0] + column;
                            break;
                    }
                    if (direction == "right" && stratPosition%column == 0) {//到达右边界()
                        alert("撞墙升天");
                        btn.value ="开始游戏";
                        btn.disabled = false;
                        return false;
                    }
                    if (direction == "left" && (stratPosition + 1)%column == 0) {//到达左边界(向左运动时,stratPosition会减1,所以这里加1);
                        alert("撞墙升天");
                        btn.value ="开始游戏";
                        btn.disabled = false;
                        return false;
                    }
                    if (stratPosition < 0 || stratPosition > column*rows) {//到达上下边界
                        alert("撞墙升天");
                        btn.value ="开始游戏";
                        btn.disabled = false;
                        return false;
                    }
                    if (initPosition != stratPosition && repeatArr(stratPosition,snake)) {//吃到自己的尾巴
                        alert("厉害了,自己吃自己!");
                        btn.value ="开始游戏";
                        btn.disabled = false;
                        return false;
                    }
                    snake.unshift(stratPosition);//将位置赋值到蛇的数组的第一个
                    var foodPosition = foodY*column + foodX;
                    if (stratPosition == foodPosition) {//吃到食物
//                        foodX = getRandom(column,0);
//                        foodY = getRandom(rows,0);
                        checkFood();
                        num++;
                        oSpan.innerHTML = num;
//                        document.getElementById(foodY*column + foodX).className = "food";
                    } else{
                        var lastPosition = snake.pop();//pop方法:删除数组的最后一个值,且返回这个值;
                        if (lastPosition != snake[0]) {//重新设置地图图
                            document.getElementById(lastPosition).className = "box";
                        }
                    }
                    for (var i=0;i<snake.length;i++) {//重新设置蛇
                        document.getElementById(snake[i]).className = "snake";
                    }
                    setTimeout(function(){
                        move();
                    },150);
                }
            }
        </script>
    </body>
</html>

 

 posted on 2017-05-31 15:59  my_summer  阅读(324)  评论(0编辑  收藏  举报