js實現貪吃蛇小遊戲代碼(源碼)


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>貪吃蛇遊戲</title>
</head>
<script type="text/javascript">
    //定義一個點對象
    function Point(x,y){
        this.x=x;
        this.y=y;
        this.getX=function(){
            return x;
        }
        this.getY=function(){
            return y;
        }
    }
    //定義方向變量
    var startDir=null;//蛇移動方向
    var food;//定義存儲食物節點的數組
    var snakeloc;//定義一個存儲蛇身節點的數組
    //初始化地圖
    function initMap() {
        var map = document.getElementById("map");//找到跟節點
        for (var i = 0; i < 20; i++) {
            var tr = document.createElement("tr");//創建節點
            for (var j = 0; j < 20; j++) {
                var td = document.createElement("td");//創建節點
                td.setAttribute("id", "td" + i +"_"+ j);//設置id值 方便後續的查找 設置值
                tr.appendChild(td);//添加節點
            }
            map.appendChild(tr);//加入值
        }
    }
    //初始化蛇
    function initSnake(){
        snakeloc=[];
        var x=10;//設置蛇的x節點 中點
        var y=10;//設置蛇的y節點 中點
        var dir;//保存蛇運動的方向
        var tdm=document.getElementById("td"+x+"_"+y);
        var tdl=document.getElementById("td"+x+"_"+(y-1));
        var tdr=document.getElementById("td"+x+"_"+(y+1));
        //設置點的值
        var point1=new Point(x,y-1);
        var point2=new Point(x,y);
        var point3=new Point(x,y+1);
        //將點對象放入數組中去
        snakeloc.push(point3);
        snakeloc.push(point2);
        snakeloc.push(point1);
        //設置顏色
        tdr.style.background="red";//設置節點爲紅色
        tdm.style.background="blue";//設置節點顏色
        tdl.style.background="blue";//設置節點顏色
    }
    //初始化食物
    function initFood(){
        var foodX;
        var foodY;
    var flag=0;//定義次數
            while(true){
               foodX = Math.floor(Math.random() * 20);
                foodY = Math.floor(Math.random() * 20);
                for(var i=0;i<snakeloc.length;i++){
                    //如果不和數組中的所有點都不重合,說明這個點可以用
                    if(snakeloc[i].getX()==foodX&&snakeloc[i].getY()==foodY){
                        flag++;
                       break;
                    }
                }
                if(flag==0) break;
            }
                food=[ ];
                food.push(new Point(foodX,foodY));//將食物座標放入數組中去
                var td=document.getElementById("td"+foodX+"_"+foodY);
                td.style.background="black";
    }
    //監聽蛇的移動
    function snakeMove(){
        document.onkeydown=function(e){
            if(e.keyCode>=37&& e.keyCode<=40){
                var currentDir= e.keyCode;
                //看看是否要改變方向 如果沒有這一步可能會出現頭和身體重合
                if(startDir-currentDir!=2&&currentDir-startDir!=2){
                    startDir=currentDir;
                }
                switch(startDir){
                    case 37:moveLeft();break;
                    case 38:moveUp();break;
                    case 39:moveRight();break;
                    case 40:moveDown();break;
                    default:break;
                }
            }
            if(eatFood()){
                initFood();//就再創建一個食物
            }else{
                clearSnakeEnd();//清除蛇尾
            }
            //如果撞牆或者咬到自己
            if(gameOver()){
                alert("Game Over!");
                return;
            }
            updateSnake();//調用顯示蛇
        }
    }
    //向上移動
    function moveUp(){
        var oldHead=snakeloc[0];//舊蛇頭位置
        //更新蛇座標
        for (var i = snakeloc.length ; i > 0; i--) {
            snakeloc[i] = snakeloc[i - 1];
        }
        snakeloc[0]=new Point(oldHead.getX()-1,oldHead.getY());


    }
    //向下移動
    function moveDown(){
        var oldHead=snakeloc[0];//舊蛇頭位置
        //更新蛇座標
        for (var i = snakeloc.length ; i > 0; i--) {
            snakeloc[i] = snakeloc[i - 1];
        }
        snakeloc[0]=new Point(oldHead.getX()+1,oldHead.getY());
    }
    //向左移動
    function moveLeft(){
        var oldHead=snakeloc[0];//舊蛇頭位置
        //更新蛇
        for (var i = snakeloc.length ; i > 0; i--) {
            snakeloc[i] = snakeloc[i - 1];
        }
        snakeloc[0]=new Point(oldHead.getX(),oldHead.getY()-1);
    }
    //向右移動
    function moveRight(){
       var oldHead=snakeloc[0];//舊蛇頭位置
            //更新蛇
                for (var i = snakeloc.length ; i > 0; i--) {
                    snakeloc[i] = snakeloc[i - 1];
                }
        snakeloc[0]=new Point(oldHead.getX(),oldHead.getY()+1);


    }
    //消除蛇尾 即將它的顏色消掉
    function clearSnakeEnd(){
        var end=snakeloc.pop();//清楚蛇尾 返回蛇尾座標
        var td=document.getElementById("td"+end.getX()+"_"+end.getY());
        td.style.background="";//設置爲一個字符串 即沒有顏色
    }
    //更新蛇 顯示蛇
    function updateSnake(){
        for(var i=1;i<snakeloc.length;i++){
            var td=document.getElementById("td"+snakeloc[i].getX()+"_"+snakeloc[i].getY());
            td.style.background="blue";
        }
        var th=document.getElementById("td"+snakeloc[0].getX()+"_"+snakeloc[0].getY());
        th.style.background="red";
    }
    //檢測蛇是否吃到食物
    function eatFood(){
        var foodX=food[0].getX();
        var foodY=food[0].getY();
        var headX=snakeloc[0].getX();
        var headY=snakeloc[0].getY();
        if(foodX==headX&&foodY==headY){
            return true;
        }
        return false;
    }
    //遊戲結束情況
    function gameOver(){
        //死的第一種情況 撞牆而死
        var headX=snakeloc[0].getX();
        var headY=snakeloc[0].getY();
        if(headY>19||headY<0||headX<0||headX>19){
            return true;
        }
        //死的第二種情況 咬死自己
        for(var i=1;i<snakeloc.length;i++){
            var ele=snakeloc[i];
            if(ele.getX()==snakeloc[0].getX()&&ele.getY()==snakeloc[0].getY()){
                return true;
            }
        }
        return false;
    }
</script>
<body>
    <table id="map" border="3" align="center" width="500px" height="500px" style="border-collapse:collapse;">
        <caption style="color: red;font-size: larger;">貪吃蛇遊戲</caption>
    </table>
</body>
<script type="text/javascript">
    snakeMove();//移動方法的調用
    initMap();//初始化地圖
    initSnake();//初始化蛇
    initFood();//初始化食物
    snakeMove();//移動


</script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章