国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

小白成長日記:寫個(gè)貪吃蛇

archieyang / 472人閱讀

摘要:貪吃蛇并不是通過操作來完成移動的,而是通過記錄貪吃蛇的路徑來將身體渲染出來。目前沒有內(nèi)置的操作符判斷對象的內(nèi)容是否相同。

還是用的vue,本來以為不合適,但想法錯(cuò)了。貪吃蛇并不是通過操作dom來完成移動的,而是通過記錄貪吃蛇的路徑來將身體渲染出來。

一般移動元素,我們都是變動它的css達(dá)到目的,但我在寫貪吃蛇的時(shí)候發(fā)現(xiàn)這樣很難以實(shí)現(xiàn),參考了網(wǎng)上的資源,發(fā)現(xiàn)大部分人是通過記錄貪吃蛇的路徑,保存進(jìn)數(shù)組,通過數(shù)組變動來表示貪吃蛇的下一步,主要是增加頭部位置,去除尾部位置,再動態(tài)添加css樣式,這樣就達(dá)到移動的效果。

演示

鏈接描述

html&&data:
data(){ return{ rows:"",//橫框 cols:"",//豎框 position:[[0,0],[1,0],[2,0],[3,0]],//蛇的初始位置 direction:1,//方向 food:[]//食物的位置 } },
初始化準(zhǔn)備
methods:{
    background(){//生成橫框和豎框的函數(shù)
        this.rows=Array(30)
        this.cols=Array(30)
    }, 
    keyboard(){//鍵盤事件
        let _this = this;
        document.onkeydown = function(e){
            if(e.keyCode===37){
                _this.change(-1)
            }else if(e.keyCode===38){
                _this.change(-2)
            }else if(e.keyCode===39){
                _this.change(1)
            }else{
                _this.change(2)
            }
        }
    },
    creatfood(){//創(chuàng)造食物
        this.food[0]=Math.floor(Math.random()*30)
        this.food[1]=Math.floor(Math.random()*30)
    },
    showfood(x,y){//顯示食物
        if(this.food[0]===x&&this.food[1]===y){
            return true
        }
    },
    body(x,y){//顯示身體
        for(i=0;i

前期準(zhǔn)備就是這么多,接下來就是跑起來,先聲明一個(gè)計(jì)時(shí)器

let timer=""

接著就用定時(shí)器開始跑

start(){//開始按鈕
    timer=setInterval(()=>this.autorun(),300)
}

這里的autorun就是我們要寫的跑動函數(shù)

autorun(){                    
    let direction=this.direction//目前方向
    let headX,headY//
        headX=this.position[this.position.length-1][0]//復(fù)制蛇頭的X坐標(biāo)
        headY=this.position[this.position.length-1][1]//復(fù)制蛇頭的Y坐標(biāo)
        if(direction===1||direction===-1){//如果方向是在左右跑動                        
            direction>0?headX++:headX--//往右跑X坐標(biāo)+1,往左跑X坐標(biāo)-1                                        
        }else{
            direction>0?headY++:headY--//如果方向是在上下跑動,Y坐標(biāo)做對應(yīng)處理
        }
//此時(shí)蛇頭的下一個(gè)坐標(biāo)位置就是[headX,headY],接下來就可以判斷是否結(jié)束游戲,如果結(jié)束了,蛇頭就沒必要添加了
        if(headX<0||headX>29||headY<0||headY>29||this.body(headX,headY)){//當(dāng)蛇頭下一個(gè)位置出了邊界或者這個(gè)位置是符合身體函數(shù)(即蛇頭撞上了身體)
            alert("Game Over")//結(jié)束
            clearInterval(timer)//清除定時(shí)器
            this.position=[[0,0],[1,0],[2,0],[3,0]]//還原身體
            this.creatfood()//重新創(chuàng)造食物
            this.direction=1//還原方向
        }else{//如果蛇頭下一個(gè)位置是符合規(guī)則的                        
            this.position.push([headX,headY])//將下一個(gè)位置添加進(jìn)數(shù)組,頭部長一節(jié)
            if(headX!==this.food[0]||headY!==this.food[1]){//如果下一個(gè)頭部位置不是食物的位置,即吃食物開始                            
                this.position.shift()//我們將尾部去掉,一長一短實(shí)現(xiàn)了蛇的走動
            }else{//如果下一個(gè)頭部位置是食物
                this.creatfood()//不去除尾部,再次創(chuàng)建食物(這里有個(gè)小bug,隨機(jī)的食物有幾率與身體重合)
            }
        }                                    
},
change(dir){//改變方向
    if(Math.abs(dir)===Math.abs(this.direction)){//如果方向相同或者想法,不做任何操作
        return
    }else{
        this.direction=dir//否則把方向改動
    }
},

就是這個(gè)樣子,貪吃蛇就寫完了,邏輯方面并不是太復(fù)雜,但是對于數(shù)組的操作有很多,這里提下我碰見的幾個(gè)問題:

vue中的數(shù)組對象在更新的時(shí)候和多帶帶的數(shù)據(jù)是不一樣的,只有某些特定的函數(shù)會去主動更新數(shù)組,否則的話需要用vm.$set( target, key, value )這個(gè)去更新數(shù)組

二維數(shù)組和一維數(shù)組是不同的,indexOf()不管用,無法檢測;而且類似this.position[0]===[0,0]也是無法正確判斷的,這導(dǎo)致我在寫這個(gè)小demo的時(shí)候犯了很多錯(cuò)。

let po=[[0,0],[1,0],[2,0],[3,0]]
let qo=[[0,0]]
let oo=[0,0]
console.log(po[0]==qo[0])//false
console.log(qo[0]==oo)//false

這大概就是最大的收獲,我還太年輕。
因?yàn)镴avaScript里面Array是對象,==或===操作符只能比較兩個(gè)對象是否是同一個(gè)實(shí)例,也就是是否是同一個(gè)對象引用。目前JavaScript沒有內(nèi)置的操作符判斷對象的內(nèi)容是否相同。
但是慣性思維讓人以為數(shù)組也是值,是可以比較的。(這段是復(fù)制的,別人總結(jié)的,和我想法一模一樣)希望能給同為小白的朋友們提個(gè)醒

源碼

https://github.com/yuyeqianxu...
希望能幫助到和我一樣的小白朋友們,有bug麻煩反饋,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90204.html

相關(guān)文章

  • 用 js 寫個(gè)自動尋路的貪吃

    摘要:前言偶爾看到兩年前寫的貪吃蛇,當(dāng)時(shí)沒把自動尋路的算法寫好,蛇容易掛,周末找了個(gè)時(shí)間把當(dāng)年的坑填上,寫了個(gè)不會掛的貪吃蛇。 前言 偶爾看到兩年前寫的貪吃蛇,當(dāng)時(shí)沒把自動尋路的算法寫好,蛇容易掛,周末找了個(gè)時(shí)間把當(dāng)年的坑填上,寫了個(gè)不會掛的貪吃蛇。 兩年前的版本_點(diǎn)擊查看 這次更新的版本_點(diǎn)擊查看 代碼比較簡單,使用 canvas 完成游戲的畫圖,拋開 A* 算法的實(shí)現(xiàn),整個(gè) html 代...

    gaara 評論0 收藏0
  • 小白成長日記寫個(gè)省市區(qū)三級聯(lián)動

    摘要:數(shù)據(jù)來源臺灣缺省完成圖初始化選完省之后部分請選擇請選擇暫無數(shù)據(jù)暫無數(shù)據(jù)一開始的初始狀態(tài)是省份可以選擇,利用來控制市和區(qū)的現(xiàn)實(shí)選項(xiàng)。當(dāng)省份未選擇時(shí),市區(qū)因?yàn)闆]有數(shù)據(jù),所以會選擇暫無數(shù)據(jù)。 依舊使用vue,不需要關(guān)注dom太方便了。數(shù)據(jù)來源(臺灣缺省):https://github.com/airyland/c... 完成圖 初始化 showImg(https://segmentfault...

    JerryC 評論0 收藏0
  • 小白成長日記寫個(gè)日歷

    摘要:一周有天,返回的數(shù),如果上月最后一天是星期二,看下的日歷是補(bǔ)了三天,我們得到的是,所以為此,之后就是填充最后一天,用處理一下再排序,上一個(gè)月的數(shù)據(jù)就得到了。 每天進(jìn)步一點(diǎn)點(diǎn)。寫個(gè)簡單的小日歷,依舊用vue,方便 完成圖 showImg(https://segmentfault.com/img/bVZoWs?w=416&h=495); 思路 本月的天數(shù) 截取上月的天數(shù) 截取下月天數(shù) 今...

    muzhuyu 評論0 收藏0
  • 用jquery寫貪吃

    需要具備知識:1.html、css基礎(chǔ)2.jquery基礎(chǔ) 具體實(shí)現(xiàn)方法: 創(chuàng)建游戲界面 .bts { display: flex; } .bt { width: 60px; height: 24px; line-height: 24px...

    gitmilk 評論0 收藏0
  • 用jquery寫貪吃

    需要具備知識:1.html、css基礎(chǔ)2.jquery基礎(chǔ) 具體實(shí)現(xiàn)方法: 創(chuàng)建游戲界面 .bts { display: flex; } .bt { width: 60px; height: 24px; line-height: 24px...

    h9911 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<