貪吃蛇大作戰(zhàn)

最近在做一個貪吃蛇的項(xiàng)目忌警,這是我第一次用js來實(shí)現(xiàn)做一款游戲搁拙,雖然很low,但出現(xiàn)預(yù)想的效果時還是很開心的,雖然做出了效果但還是對其中的一些還不太熟練法绵,在后續(xù)我會將游戲開始脐帝,地圖構(gòu)建凿歼,食物出現(xiàn),蛇的出現(xiàn)分別寫入一個文件,這樣更便于理解阀坏。
我們先定義一個游戲引擎用來定義游戲的開始哪工、結(jié)束以及場景的布置赂弓。
用創(chuàng)建對象來定義一個游戲gGameBox其中有地圖的屬性涉枫,以及地圖的所有坐標(biāo)。

var gGameBox = {
    rows: 20,  // 行數(shù)
    cols: 20,  // 列數(shù)
    allTds: [], // 存儲所有的td元素對象
    food: null, // 食物對象
    snake: null, // 蛇對象
    .
    .
    .//(以下到場景布置都是)
}

清除蛇尾定義清除屬性clear狡赐,由于蛇的移動是將蛇節(jié)的坐標(biāo)加++窑业,所以蛇身會一直增加,要清除蛇的小尾巴枕屉。

clear: function(){
        for(var i = 0; i< gGameBox.allTds.length;i++){
            for(var j=0;j<gGameBox.allTds[i].length;j++){
                gGameBox.allTds[i][j].className = "";
            }
        }
    },

定義一個方法用來判斷按鍵常柄,可以由上下左右來控制蛇的移動。(注意蛇不能在往左走的同時往右走搀庶,同理其他一樣)

keyControl: function() {
        // onkeydown 鍵盤按下事件
        window.onkeydown = function(e) {
            // 獲取按鍵編碼
            var c = e.keyCode;
            if (c == 37){
                if (gGameBox.snake.direct == "right"){
                    // 當(dāng)前是往右走拐纱,不能掉頭,終止函數(shù)
                    return ;
                }
                gGameBox.snake.direct = "left";
            }else if (c == 38){
                if (gGameBox.snake.direct == "down"){
                    return ;
                }
                gGameBox.snake.direct = "up";
            }else if (c == 39){
                if (gGameBox.snake.direct == "left"){
                    return ;
                }
                gGameBox.snake.direct = "right";
            }else if (c == 40){
                if (gGameBox.snake.direct == "up"){
                    return ;
                }
                gGameBox.snake.direct = "down";
            }
        }
    },

定義一個方法布置場景哥倔,創(chuàng)建食物秸架,創(chuàng)建蛇,分別調(diào)用了food.js文件咆蒿、snake.js文件东抹。用定時器來實(shí)現(xiàn)蛇的移動、先清除蛇尾沃测、判斷鍵盤按鍵來控制蛇的方向缭黔、調(diào)用蛇的移動方法、讓食物隨機(jī)出現(xiàn)蒂破。

start: function() {
        gGameBox.init(); // 游戲初始化
        this.food = new Food();// 創(chuàng)建食物
        this.snake = new Snake(); // 創(chuàng)建蛇
        this.timer=setInterval(function(){
            gGameBox.clear();
            gGameBox.keyControl();
            gGameBox.snake.move();
            gGameBox.food.show();
        },200);
    },

init為布置場景的方法馏谨,在js中創(chuàng)建表格然后加入頁面中。

    // 初始化
    init: function() {
        // 場景布置好, 用表格來做
        var oTable = document.createElement("table");
        for (var i = 0; i < gGameBox.rows; i++)
        {
            // 創(chuàng)建tr
            var oTr = document.createElement("tr"); 
            // 每一行附迷,定義1個空數(shù)組
            var arr = [];
            for (var j = 0; j < gGameBox.cols; j++) {
                // 創(chuàng)建td
                var oTd = document.createElement("td"); 
                oTr.appendChild(oTd);
                // 將td放到空數(shù)組中
                arr.push(oTd);
            }
            // 將當(dāng)前行所有的td惧互,壓入到 allTds 屬性中
            gGameBox.allTds.push(arr);
            oTable.appendChild(oTr);
        }
        // 添加到body
        document.body.appendChild(oTable);
    }

Food.js文件
我們用外接文件來寫貪吃蛇中的食物哎媚。
先給食物的屬性橫坐標(biāo)x,縱坐標(biāo)y,并讓食物一開始的坐標(biāo)就是隨機(jī)出現(xiàn)的(調(diào)用函數(shù)change())。

function Food() {
    // 坐標(biāo)
    this.x = 0;
    this.y = 0;
    // 一開始就隨機(jī)位置
    this.change();
}

在食物的原型中加入食物的方法(show為食物出現(xiàn)在頁面中定義了食物的樣式喊儡,change為食物出現(xiàn)的位置為隨機(jī)的)拨与。

// 方法1: 出現(xiàn)在環(huán)境中
Food.prototype.show = function() {
    gGameBox.allTds[this.y][this.x].className = "food";
}
// 方法2: 改變位置, 隨機(jī)的
Food.prototype.change = function() {
    this.x = parseInt(Math.random() * gGameBox.cols);
    this.y = parseInt(Math.random() * gGameBox.rows);
    this.show();
}

snake.js文件
我們用外接文件來寫貪吃蛇中的蛇(注意蛇很有靈性需要特別小心)。
先定義了一個arr數(shù)組用來存放蛇節(jié)的坐標(biāo)艾猜。x其實(shí)為表格的列數(shù)买喧,y為表格的行數(shù)。
direct為讓蛇一開始便讓其往右邊移動匆赃。
fresh為讓蛇出現(xiàn)在地圖中淤毛。

function Snake(){
    this.arr = [
        {x: 5, y: 1},
        {x: 4, y: 1},
        {x: 3, y: 1},
        {x: 2, y: 1},
        {x: 1, y: 1},
    ];
    this.direct = "right";
    this.fresh();
}

在蛇的原型中加入讓蛇顯示的行為。

Snake.prototype.fresh = function(){
    for(var i = 0; i<this.arr.length; i++){
       var x = this.arr[i].x;
       var y = this.arr[i].y;
       gGameBox.allTds[y][x].className = "snake" 
    }
}

在蛇的原型中加入蛇的移動行為move炸庞,并判斷按鍵后改變蛇的移動方向钱床,給出判斷游戲結(jié)束(蛇死亡)的條件。給出判斷是否吃到食物的條件埠居,如果吃到就在蛇尾增加一節(jié)讓食物再隨機(jī)出現(xiàn)一個,更新蛇的位置事期。蛇的移動是通過在蛇頭加一個表格滥壕,蛇尾減去一個表格實(shí)現(xiàn)的unshift加一個蛇頭,pop刪除一個蛇尾然后更新蛇的位置兽泣。

Snake.prototype.move = function(){
        var x=this.arr[0].x;
        var y=this.arr[0].y;
    if(this.direct == "right"){
        x++; 
    }else if (this.direct =="down"){
        y++;
    }else if (this.direct == "left"){
        x--;
    }else if (this.direct =="up"){
        y--;
    }
    //判斷蛇是否over
    if(x >=gGameBox.cols|| y>=gGameBox.rows||x<0||y<0){ 
        clearInterval(gGameBox.timer);
        alert("GG");
        return;
    }
    //判斷蛇是否吃到food
    if(x == gGameBox.food.x && y==gGameBox.food.y){
        this.arr.unshift({x:x,y:y});
        gGameBox.food.change();
        this.fresh();
         return;
    }
    this.arr.unshift({x: x, y: y});
    this.arr.pop();
    this.fresh();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绎橘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唠倦,更是在濱河造成了極大的恐慌称鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠鼻,死亡現(xiàn)場離奇詭異冈止,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)候齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門熙暴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慌盯,你說我怎么就攤上這事周霉。” “怎么了亚皂?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵俱箱,是天一觀的道長。 經(jīng)常有香客問我灭必,道長狞谱,這世上最難降的妖魔是什么巍膘? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮芋簿,結(jié)果婚禮上峡懈,老公的妹妹穿的比我還像新娘。我一直安慰自己与斤,他們只是感情好肪康,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撩穿,像睡著了一般磷支。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食寡,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天雾狈,我揣著相機(jī)與錄音,去河邊找鬼抵皱。 笑死善榛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呻畸。 我是一名探鬼主播移盆,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伤为!你這毒婦竟也來了咒循?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绞愚,失蹤者是張志新(化名)和其女友劉穎叙甸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體位衩,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裆蒸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚂四。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片光戈。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遂赠,靈堂內(nèi)的尸體忽然破棺而出久妆,到底是詐尸還是另有隱情,我是刑警寧澤跷睦,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布筷弦,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烂琴。R本人自食惡果不足惜爹殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奸绷。 院中可真熱鬧梗夸,春花似錦、人聲如沸号醉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔派。三九已至铅碍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間线椰,已是汗流浹背胞谈。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憨愉,地道東北人烦绳。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像莱衩,于是被迫代替她去往敵國和親爵嗅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容