• JavaScript—面向对象 贪吃蛇最终


    效果

    代码

    //食物对象
    ;(function () {
        function Food(element) {
            this.width = 20
            this.height = 20
            this.backgroundColor = '#ff8500'
            this.x = 0
            this.y = 0
            this.elemen = element
            this.arr = []
        }
        Food.prototype.remove=function() {
            for (let i = 0; i < this.arr.length; i++) {
                this.arr[i].parentNode.removeChild(this.arr[i])
    
            }
            this.arr=[]
        }
    
    
        Food.prototype.show = function () {
            this.remove()
            this.x = randomNum(0, (this.elemen.offsetWidth - this.width) / this.width) * this.width
            this.y = randomNum(0, (this.elemen.offsetHeight - this.height) / this.height) * this.height
            let div = document.createElement('div')
            this.elemen.appendChild(div)
            div.style.width = this.width + 'px';
            div.style.height = this.height + 'px'
            div.style.backgroundColor = this.backgroundColor
            div.style.position = 'absolute'
            div.style.left = this.x + 'px'
            div.style.top = this.y + 'px'
            this.arr.push(div)
        }
        //外部访问
        window.Food = Food
    
    })()
    //蛇对象
    ;(function() {
        function Snake(element) {
            this.width = 20
            this.height = 20
            this.gameif=false
            //蛇身 位置 颜色
            this.body = [
                {x: 6, y: 4, bc: 'red'},
                {x: 5, y: 4, bc: 'blue'},
                {x: 4, y: 4, bc: 'blue'},
            ]
            this.direction = 'right'
            this.elemen = element
            //保存当前蛇
            this.arr = []
        }
    //吃食物
        Snake.prototype.feed = function (food) {
    
            // 遇到食物 复制最后一个蛇身
            if (this.body[0].x * this.width === food.x && this.body[0].y * this.height === food.y) {
                let o = this.body[this.body.length - 1]
                let pro = {x: o.x, y: o.y, bc: o.bc}
                this.body.push(pro)
                food.show()
            }
        }
        Snake.prototype.remove = function () {
            for (let i = 0; i < this.arr.length; i++) {
                this.arr[i].parentNode.removeChild(this.arr[i])
            }
            this.arr = []
        }
    //蛇出现
        Snake.prototype.show = function () {
            this.remove()
            //console.log(this.arr)
            for (let i = 0; i < this.body.length; i++) {
                let div = document.createElement('div')
                this.elemen.appendChild(div)
                div.style.width = this.width + 'px';
                div.style.height = this.height + 'px'
                div.style.position = 'absolute'
                div.style.backgroundColor = this.body[i].bc
                div.style.left = this.body[i].x * this.width + 'px'
                div.style.top = this.body[i].y * this.height + 'px'
                this.arr.push(div)
            }
    
        }
    //移动方法
        Snake.prototype.udlr = function () {
            //蛇身移动 根据最后一个的位置等于上一个的位置
            for (let i = this.body.length - 1; i > 0; i--) {
                this.body[i].x = this.body[i - 1].x
                this.body[i].y = this.body[i - 1].y
            }
            // 边界
            let herfX = this.body[0].x * this.width >= this.elemen.offsetWidth - this.width || this.body[0].x * this.width <= 0
            let herfY = this.body[0].y * this.height >= this.elemen.offsetHeight - this.height || this.body[0].y * this.height <= 0
            console.log(herfX,herfY)
            if (herfX || herfY) {
                this.gameif=true
                alert('游戏结束')
                return
            }
            switch (this.direction) {
                case "right": {
                    this.body[0].x += 1
                    break;
                }
                case "left": {
                    this.body[0].x -= 1
                    break;
                }
                case "up": {
                    this.body[0].y -= 1
                    break;
                }
                case "down": {
                    this.body[0].y += 1
                    break;
                }
            }
        }
        window.Snake=Snake;
    })()
    //游戏对象
    ;(function() {
        function Game(map) {
            this.map = map;
            this.food = new Food(this.map)
            this.snake = new Snake(this.map)
        }
        Game.prototype.go = function () {
            let food=this.food
            let snake=this.snake;
            food.show()
            snake.show()
            let go_time = setInterval(function () {
                console.log(snake,food)
    
                if (snake.gameif){
                    clearInterval(go_time)
                }
                document.addEventListener('keydown', function (e) {
                    //结束游戏。game over
                    // up:38 down:40 left:37 reight:39
                    switch (e.keyCode) {
                        case 37: {
                            //禁止反方向
                            if (snake.direction=='right'){
                                break;
                            }
                            snake.direction='left'
                            break;
                        }
                        case 38: {
                            if (snake.direction=='down'){
                                break;
                            }
                            snake.direction='up'
                            break;
                        }
                        case 39: {
                            if (snake.direction=='left'){
                                break;
                            }
                            snake.direction='right'
                            break;
                        }
                        case 40: {
                            if (snake.direction=='up'){
                                break;
                            }
                            snake.direction='down'
                            break;
                        }
                    }
                }, false)
                snake.udlr()
                snake.show()
                snake.feed(food)
            }, 50)
                }
                window.Game=Game;
    })()
    
    let map = document.getElementById('map')
    let game = new Game(map)
    game.go()
    
    function randomNum(minNum, maxNum) {
        return parseInt(Math.random() * (maxNum - minNum + 1) + minNum)
    
    }

    总结

      效果图 速度太快。。。。。。。。

             总得来说 并不是毫无头绪。抽象对象 一个个去写 。

        收获挺大

  • 相关阅读:
    每天读一遍,坚持30天,和老外交流没问题!
    网络数据原来是这么传输的(结合动画解析)
    技术创新驱动发展 思岚科技入选“科技独角兽百人团”
    获取当前数据库所有表的外键创建脚本、获取指定表的创建脚本,包括表和字段的属性、外键
    009深入理解CPU位数和操作系统位数,总线等等关系
    008_32位系统和64位系统有什么区别?
    007_计算机总线
    006_查看window实际支持的最大内存
    005_为何64位下一个指针大小为8个字节和32/64位系统的关系
    Kotlin 委托(2)变量委托是什么、自定义变量委托
  • 原文地址:https://www.cnblogs.com/ruogu/p/10840506.html
Copyright © 2020-2023  润新知