亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript貪吃蛇完整版(源碼)

2019-11-20 21:30:12
字體:
來源:轉載
供稿:網友
javascript貪吃蛇完整版 注釋完整,面向對象
復制代碼 代碼如下:

<html>
<head>
    <title>貪吃蛇 Snake v2.4</title>
<style>
    body{
        font-size:9pt;
    }
    table{
        border-collapse: collapse;
        border:solid #333 1px;
    }
    td{
        height: 10px;
        width: 10px;
        font-size: 0px;
    }
    .filled{
        background-color:blue;
    }
</style>
</head>
<script>
    function $(id){return document.getElementById(id);}
/**************************************************************
* javascript貪吃蛇 v2.4 <br />
* v2.4修正了蛇身顏色可以隨著蛇前進而移動
**************************************************************/
    //貪吃蛇類
    var Snake = {
        tbl: null,
        /**
        * body: 蛇身,數組放蛇的每一節,
        * 數據結構{x:x0, y:y0, color:color0},
        * x,y表示坐標,color表示顏色
        **/
        body: [],
        //當前移動的方向,取值0,1,2,3, 分別表示向上,右,下,左, 按鍵盤方向鍵可以改變它
        direction: 0,
        //定時器
        timer: null,
        //速度
        speed: 250,
        //是否已經暫停
        paused: true,
        //行數
        rowCount: 30,
        //列數
        colCount: 30,
        //初始化
        init: function(){
            var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
            this.tbl = $("main");
            var x = 0;
            var y = 0;
            var colorIndex = 0;
            //產生初始移動方向
            this.direction = Math.floor(Math.random()*4);
            //構造table
            for(var row=0;row<this.rowCount;row++){
                var tr=this.tbl.insertRow(-1);
                for(var col=0;col<this.colCount;col++) {
                    var td=tr.insertCell(-1);
                }
            }
            //產生20個松散節點
            for(var i=0; i<10; i++){
                x = Math.floor(Math.random()*this.colCount);
                y = Math.floor(Math.random()*this.rowCount);
                colorIndex = Math.floor(Math.random()*7);
                if(!this.isCellFilled(x,y)){
                    this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
                }
            }
            //產生蛇頭
            while(true){
                x = Math.floor(Math.random()*this.colCount);
                y = Math.floor(Math.random()*this.rowCount);
                if(!this.isCellFilled(x,y)){
                    this.tbl.rows[y].cells[x].style.backgroundColor = "black";
                    this.body.push({x:x,y:y,color:'black'});
                    break;
                }
            }
            this.paused = true;
            //添加鍵盤事件
            document.onkeydown= function(e){
                if (!e)e=window.event;
                switch(e.keyCode | e.which | e.charCode){
                  case 13: {
                    if(Snake.paused){
                      Snake.move();
                      Snake.paused = false;
                    }
                    else{
                       //如果沒有暫停,則停止移動
                      Snake.pause();
                      Snake.paused = true;
                    }
                    break;
                  }
                    case 37:{//left
                        //阻止蛇倒退走
                        if(Snake.direction==1){
                            break;
                        }
                        Snake.direction = 3;
                        break;
                    }
                    case 38:{//up
                       //快捷鍵在這里起作用
                      if(event.ctrlKey){
                         Snake.speedUp(-20);
                        break;
                      }
                        if(Snake.direction==2){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 0;
                        break;
                    }
                    case 39:{//right
                        if(Snake.direction==3){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 1;
                        break;
                    }
                    case 40:{//down
                      if(event.ctrlKey){
                         Snake.speedUp(20);
                        break;
                      }
                        if(Snake.direction==0){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 2;
                        break;
                    }
                }
            }
        },
        //移動
        move: function(){
            this.timer = setInterval(function(){
                Snake.erase();
                Snake.moveOneStep();
                Snake.paint();
            }, this.speed);
        },
        //移動一節身體
        moveOneStep: function(){
            if(this.checkNextStep()==-1){
                clearInterval(this.timer);
                alert("Game over!/nPress Restart to continue.");
                return;
            }
            if(this.checkNextStep()==1){
                var _point = this.getNextPos();
                var _x = _point.x;
                var _y = _point.y;
                var _color = this.getColor(_x,_y);
                this.body.unshift({x:_x,y:_y,color:_color});
                //因為吃了一個食物,所以再產生一個食物
                this.generateDood();
                return;
            }
            //window.status = this.toString();
            var point = this.getNextPos();
            //保留第一節的顏色
            var color = this.body[0].color;
            //顏色向前移動
            for(var i=0; i<this.body.length-1; i++){
              this.body[i].color = this.body[i+1].color;
            }
            //蛇尾減一節, 蛇尾加一節,呈現蛇前進的效果
            this.body.pop();
            this.body.unshift({x:point.x,y:point.y,color:color});
            //window.status = this.toString();
        },
        //探尋下一步將走到什么地方
        pause: function(){
          clearInterval(Snake.timer);
          this.paint();
        },
        getNextPos: function(){
            var x = this.body[0].x;
            var y = this.body[0].y;
            var color = this.body[0].color;
            //向上
            if(this.direction==0){
                y--;
            }
            //向右
            else if(this.direction==1){
                x++;
            }
            //向下
            else if(this.direction==2){
                y++;
            }
            //向左
            else{
                x--;
            }
            //返回一個坐標
            return {x:x,y:y};
        },
        //檢查將要移動到的下一步是什么
        checkNextStep: function(){
            var point = this.getNextPos();
            var x = point.x;
            var y = point.y;
            if(x<0||x>=this.colCount||y<0||y>=this.rowCount){
                return -1;//觸邊界,游戲結束
            }
            for(var i=0; i<this.body.length; i++){
                if(this.body[i].x==x&&this.body[i].y==y){
                    return -1;//碰到自己的身體,游戲結束
                }
            }
            if(this.isCellFilled(x,y)){
                return 1;//有東西
            }
            return 0;//空地
        },
        //擦除蛇身
        erase: function(){
            for(var i=0; i<this.body.length; i++){
                this.eraseDot(this.body[i].x, this.body[i].y);
            }
        },
        //繪制蛇身
        paint: function(){
            for(var i=0; i<this.body.length; i++){
                this.paintDot(this.body[i].x, this.body[i].y,this.body[i].color);
            }
        },
        //擦除一節
        eraseDot: function(x,y){
            this.tbl.rows[y].cells[x].style.backgroundColor = "";
        },
        paintDot: function(x,y,color){
            this.tbl.rows[y].cells[x].style.backgroundColor = color;
        },
        //得到一個坐標上的顏色
        getColor: function(x,y){
            return this.tbl.rows[y].cells[x].style.backgroundColor;
        },
        //用于調試
        toString: function(){
            var str = "";
            for(var i=0; i<this.body.length; i++){
                str += "x:" + this.body[i].x + " y:" + this.body[i].y + " color:" + this.body[i].color + " - ";
            }
            return str;
        },
        //檢查一個坐標點有沒有被填充
        isCellFilled: function(x,y){
            if(this.tbl.rows[y].cells[x].style.backgroundColor == ""){
                return false;
            }
            return true;
        },
        //重新開始
        restart: function(){
            if(this.timer){
                clearInterval(this.timer);
            }
            for(var i=0; i<this.rowCount;i++){
              this.tbl.deleteRow(0);
            }
            this.body = [];
            this.init();
            this.speed = 250;
        },
        //加速
        speedUp: function(time){
          if(!this.paused){
            if(this.speed+time<10||this.speed+time>2000){
              return;
            }
            this.speed +=time;
            this.pause();
            this.move();
          }
        },
        //產生食物。
        generateDood: function(){
          var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
        var x = Math.floor(Math.random()*this.colCount);
            var y = Math.floor(Math.random()*this.rowCount);
            var colorIndex = Math.floor(Math.random()*7);
            if(!this.isCellFilled(x,y)){
                this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
            }
        }
    };
</script>
<body onload="Snake.init();">
/*************************************************************<br />
* javascript貪吃蛇 v2.4<br />
**************************************************************/<br />
<table id="main" border="1" cellspacing="0" cellpadding="0"></table>
<input type="button" id="btn" value="開始/暫停" />點左邊按鈕或按Enter開始/暫停游戲<br />
<input type="button" id="reset" value="重新開始" /><br />
<input type="button" id="upSpeed" value="加速" />點左邊按鈕或按Ctrl + ↑加速<br />
<input type="button" id="downSpeed" value="減速" />點左邊按鈕或按Ctrl + ↓減速
<script>
  $('btn').onclick = function(){
    if(Snake.paused){
      Snake.move();
      Snake.paused = false;
    }
    else{
      Snake.pause();
      Snake.paused = true;
    }
  };
  $("reset").onclick = function(){
    Snake.restart();
    this.blur();
  };
  $("upSpeed").onclick = function(){
    Snake.speedUp(-20);
  };
  $("downSpeed").onclick = function(){
    Snake.speedUp(20);
  };
</script>
</body>
</html>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久三级| 亚洲人成电影在线| 2019最新中文字幕| 91久久精品美女| 国产精品观看在线亚洲人成网| 日韩欧中文字幕| 国产欧美日韩中文| 91久久在线视频| 伊人久久精品视频| 黑人精品xxx一区| 国产精品亚洲视频在线观看| 日韩三级影视基地| 国产在线播放不卡| 欧美亚洲国产日本| 欧美性猛交xxxx乱大交| 国产精品自拍小视频| 国产成人福利网站| 久久久久久久97| 高清欧美性猛交xxxx黑人猛交| 午夜精品99久久免费| 欧美插天视频在线播放| 国产精品av在线| 麻豆精品精华液| 51ⅴ精品国产91久久久久久| 欧美日韩裸体免费视频| 亚洲欧美变态国产另类| 日韩欧美亚洲一二三区| 亚洲aⅴ日韩av电影在线观看| 日韩av电影国产| 国产亚洲成精品久久| 国产一区二区三区久久精品| 中文字幕亚洲字幕| 国内伊人久久久久久网站视频| 午夜精品理论片| 国产成人精品视频在线观看| 精品一区二区亚洲| 日韩动漫免费观看电视剧高清| 国产精品久久久久久网站| 在线观看日韩视频| 国产精品久久99久久| 国产亚洲视频在线观看| 国产精品嫩草影院一区二区| 中文字幕一区日韩电影| 清纯唯美日韩制服另类| 91高清免费视频| 欧美精品videosex性欧美| 在线视频免费一区二区| 国产精品久久视频| 亚洲欧美制服丝袜| 国产精品久久久久福利| 5278欧美一区二区三区| 精品久久久一区| 精品久久久久久久久久久久久| 久久久久久69| 97视频在线观看免费高清完整版在线观看| 成人激情视频在线观看| www.日韩免费| 国产婷婷成人久久av免费高清| 青青a在线精品免费观看| 欧美最猛性xxxxx亚洲精品| 国产日韩精品在线观看| 欧美在线精品免播放器视频| 亚洲老板91色精品久久| 久久久久亚洲精品成人网小说| 精品亚洲一区二区三区在线播放| 一区二区在线视频| 日本成人精品在线| 久久亚洲欧美日韩精品专区| 亚洲综合社区网| 97久久精品人人澡人人爽缅北| 青青a在线精品免费观看| 日本精品免费一区二区三区| 国产亚洲精品久久久| 精品国内亚洲在观看18黄| 在线看国产精品| 日本精品一区二区三区在线播放视频| 亚洲精品视频在线观看视频| 91精品国产91| 国产精品777| 国产成人精品电影| 久久97精品久久久久久久不卡| 亚洲天堂成人在线视频| 日韩资源在线观看| 色七七影院综合| 中文字幕自拍vr一区二区三区| 亚洲系列中文字幕| 性欧美xxxx交| 91精品综合久久久久久五月天| 欧洲精品毛片网站| 国产午夜精品视频免费不卡69堂| 欧美精品第一页在线播放| 国产精品成人免费视频| 久久精品视频免费播放| 91爱视频在线| 久久久久久久久久久久久久久久久久av| 蜜臀久久99精品久久久无需会员| 欧美大学生性色视频| 国产日韩中文字幕在线| 色偷偷91综合久久噜噜| 日韩欧美成人免费视频| 国产有码在线一区二区视频| 国产a∨精品一区二区三区不卡| 日韩av在线免费观看一区| 亚洲一区www| 国产精品久久久久久亚洲影视| 久久精品中文字幕免费mv| 国产精品综合网站| 精品亚洲一区二区三区四区五区| 欧美电影在线免费观看网站| 亚洲欧洲一区二区三区在线观看| 日韩欧美大尺度| 欧美大学生性色视频| 欧美性猛交xxx| 欧美另类极品videosbest最新版本| 日韩av中文字幕在线免费观看| 97香蕉超级碰碰久久免费的优势| 亚洲激情免费观看| 午夜欧美不卡精品aaaaa| 国产成人一区二区三区电影| 国产午夜精品久久久| 国产精品亚洲美女av网站| 亚洲精品二三区| 久久久精品2019中文字幕神马| 欧美在线视频网站| 亚洲国语精品自产拍在线观看| 国产精品欧美日韩| 欧美极品xxxx| 久久视频中文字幕| 97精品免费视频| 欧美最顶级丰满的aⅴ艳星| 亚洲欧美国产另类| 日韩在线欧美在线国产在线| 色噜噜亚洲精品中文字幕| 国产精品91视频| 欧美国产高跟鞋裸体秀xxxhd| 亚洲精品美女在线观看| 国产婷婷色综合av蜜臀av| 日韩在线观看免费| 亚洲视频网站在线观看| 日韩av观看网址| 日韩视频亚洲视频| 国产精品亚洲视频在线观看| 欧美激情中文网| 在线播放日韩精品| 91精品国产高清久久久久久久久| 亚洲人成电影在线| 国产精品一区二区av影院萌芽| 77777亚洲午夜久久多人| 亚洲成年网站在线观看| 欧美在线视频一二三| 国产精品精品一区二区三区午夜版| 欧美黄色三级网站| 亚洲美女久久久| 91影院在线免费观看视频| 日韩精品极品在线观看播放免费视频| 日韩不卡中文字幕| 亚洲精品之草原avav久久| 午夜精品99久久免费| 国产一区二区三区免费视频| 国产欧美精品一区二区三区介绍| 欧美日产国产成人免费图片| 欧美成人午夜免费视在线看片| 欧美www在线| 精品亚洲永久免费精品|