自制一個貪喫蛇小遊戲

//直接上代碼啦

<!doctype html> 
<html>
    <head>
    <meta charset="utf-8">
    <title> 貪喫蛇 </title>
    <script></script>
    <style>
        #div{
            width:300px;height:300px;background:lightgray;margin:0 auto;
            position:relative;
        }
        .game{
            width:100px;height:50px;background:gray;border:1px solid #ddd;
            border-radius:5px;line-height:50px;text-align:center;color:lightblue;
            font-weight:bold;position:absolute;top:120px;left:100px;display:none;
            cursor:pointer;
        }
    </style>
    </head>
    <body>
        <div id =div>
            <canvas id="canvas" width="300px" height="300px"></canvas>
            <div id="start" class="game" onclick="run()">開始遊戲</div>
            <div id="over" class="game">GAME OVER</div>
        </div>
    </body>
    <script>
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        context.fillStyle="gray";
        var start = document.getElementById("start");
        var over = document.getElementById("over");
        var state = 0;

        var direction = "right";
        const WIDTH = canvas.width;
        const HEIGHT = canvas.height;
        const FW = 10;



        //遊戲開始
        function paint_start(){
            if(state==0){
                start.style.display="block";
            }
        }
        function run(){
            state=1;
            start.style.display="none";
        }
        //遊戲結束 
        function paint_over(){
            if(state==2){
                over.style.display="block";
            }
        }

        //遊戲運行
        var snake=[];
        snake[0] = {
            x:Math.floor(Math.random()*(WIDTH/10-1))*10,
            y:Math.floor(Math.random()*(HEIGHT/10-1))*10
        }
        snake[1]={
            x:snake[0].x-FW,
            y:snake[0].y
        }
        snake[2]={
            x:snake[1].x-FW,
            y:snake[1].y
        }

        function sNake(){
            this.x = snake[snake.length-1].x;
            this.y = snake[snake.length-1].y;
        }
        function paint(snake){
            for (var i=0;i<snake.length ;i++ ){
                context.fillRect(snake[i].x,snake[i].y,FW,FW);
            }
        }
        function clear(){
            context.clearRect(0,0,400,400);
        }
        function step(snake){
            if(state==1){
                if(direction=="left"){
                    snake[snake.length-1].x=snake[0].x-10;
                    snake[snake.length-1].y=snake[0].y;
                }else if(direction=="right"){
                    snake[snake.length-1].x=snake[0].x+10;
                    snake[snake.length-1].y=snake[0].y;
                }else if(direction=="up"){
                    snake[snake.length-1].y=snake[0].y-10;
                    snake[snake.length-1].x=snake[0].x;
                }else{
                    snake[snake.length-1].y=snake[0].y+10;
                    snake[snake.length-1].x=snake[0].x;
                }
                snake.unshift(snake[snake.length-1]);
                snake.pop();
            }
        }

        function eat(){
            if(checkEat(snake[0])){
                snake[snake.length] = new sNake();
                return true;
            }else{
                return false;
            }
        }
        function checkEat(snake){//測試是否喫掉食物
            return (direction=="up"&&snake.x==food.x&&snake.y==food.y-FW)||
                    (direction=="down"&&snake.x==food.x&&snake.y==food.y+FW)||
                    (direction=="right"&&snake.y==food.y&&snake.x==food.x+FW)||
                    (direction=="left"&&snake.y==food.y&&snake.x==food.x-FW);
        }

        var food = {
            x:Math.floor(Math.random()*(WIDTH/10-1))*10,
            y:Math.floor(Math.random()*(HEIGHT/10-1))*10
        }

        function paintFood(){
            if(eat()){
                food.x=Math.floor(Math.random()*(WIDTH/10-1))*10;
                food.y=Math.floor(Math.random()*(HEIGHT/10-1))*10;
                context.fillRect(food.x,food.y,10,10);
            }else{
                context.fillRect(food.x,food.y,10,10);
            }
        }
        //測試是否撞擊到牆壁
        function check_hit(snake){
            if((snake[0].x==-FW)||(snake[0].x==WIDTH)||(snake[0].y==-FW)||(snake[0].y==HEIGHT)){
                state=2;
                console.log(snake[0].x);
            }
        }
        //測試是否撞到自己
        function hitSelf(snake){
            if(snake.length>4){
                if(direction=="right"){
                    for(var i=3;i<snake.length;i++){
                        if(snake[0].y==snake[i].y&&snake[0].x==snake[i].x-FW){
                            state=2;
                        }
                    }
                }
                if(direction=="left"){
                    for(var i=3;i<snake.length;i++){
                        if(snake[0].y==snake[i].y&&snake[0].x==snake[i].x+FW){
                            state=2;
                        }
                    }
                }
                if(direction=="up"){
                    for(var i=3;i<snake.length;i++){
                        if(snake[0].y==snake[i].y+FW&&snake[0].x==snake[i].x){
                            state=2;
                        }
                    }
                }
                if(direction=="down"){
                    for(var i=3;i<snake.length;i++){
                        if(snake[0].y==snake[i].y-FW&&snake[0].x==snake[i].x){
                            state=2;
                        }
                    }
                }
            }

        }
        //控制方向
        function left(){
            if(direction!=="right"){
                direction="left";
            }
        }
        function right(){
            if(direction!=="left"){
                direction="right";
            }
        }
        function up(){
            if(direction!=="down"){
                direction="up";
            }
        }
        function down(){
            if(direction!=="up"){
                direction="down";
            }
        }

        document.onkeydown = function(e){
            var e =e||window.event;
            switch(e.keyCode){
                case 37:
                    left();
                    break;
                case 38:
                    up();
                    break;
                case 39:
                    right();
                    break;
                case 40:
                    down();
                    break;
            }
        }
        setInterval(function(){
            clear();
            check_hit(snake);
            hitSelf(snake);
            paint_start();
            paint_over();
            paint(snake);
            eat();
            step(snake);
            paintFood(food);

        },200);

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