其他分享
首页 > 其他分享> > (五)项目二日志12.7

(五)项目二日志12.7

作者:互联网

(五)项目二日志12.7

物联网工程 - 李涵 - 182210713119
Github:https://github.com/kevin-lh/SoftwarePractice/tree/main/Gluttonous%20Snake

文章目录


一、功能设计

1.1 详细设计

在这里插入图片描述
对照上表,对个别函数做简要说明:

    init() {
        //音乐
        this.renderMusic();
        //增加地图样式
        this.addMapStyle();
        //渲染地图
        this.renderMap();
        //渲染蛇
        this.renderSnake();
        //随机食物坐标
        this.randomFood();
        //根据随机食物坐标渲染食物
        this.renderFood();
        //得分
        this.renderSocre();
        //关卡
        this.renderLevel();
        //键盘绑定事件
        this.bindEvent();
        //开始函数
        this.start();
    }

renderMap 函数
renderMap函数为初始化游戏背景,利用HTML DOM技术,动态生成25*25的网状格子。

    renderMap() {
        for (let i = 0; i < this.rows; i++) {
            //创建行
            let row = document.createElement('div');
            row.className = 'row';
            //缓存地图坐标信息
            let arr = [];
            for (let j = 0; j < this.rows; j++) {
                //创建列
                let column = document.createElement('div');
                column.className = 'column';
                //列装到行里面
                row.appendChild(column);
                arr.push(column);
            }
            //行加到列上面
            this.map.appendChild(row);
            this.maps.push(arr);
        }
    }

renderSnake 函数
renderSnake函数渲染蛇,即根据地图的坐标信息,将蛇头与蛇身的div 设置为对应的颜色。

    renderSnake() {
        //准备地图的坐标信息,找蛇头、蛇身坐标改变颜色
        for (let i = 0; i < this.snake.length; i++) {
            this.maps[this.snake[i].row][this.snake[i].column].style.backgroundColor = i === 0 ? 'rgba(60, 63, 65)' : 'rgba(105, 198, 109)';
        }
    }

rendomFood函数
rendomFood函数功能为随机在地图中生成食物,利用**Math.random()**函数即可实现,之后再根据坐标信息,在地图中渲染食物。

    randomFood(){
        //floor向下取整,因为random为【0,1】,最大0.99,向下取整为19
        let row = Math.floor(Math.random()*25);
        let column = Math.floor(Math.random()*25);
        //判断食物坐标是否和蛇头坐标重合
        if(row === this.snake[0].row && column === this.snake[0].column){
            this.randomFood();
            return false;
        }
        this.food.row = row;
        this.food.column = column;
    }

rendomFood函数
rendomFood函数功能为渲染食物,与上文渲染蛇的方法类似,但为了视觉效果更好,实现了每次更新的食物颜色不同,实现方法是利用Math.random函数,给rgb 三通道的颜色值每次赋予随机生成的数,效果请见下文演示 。

    renderFood(){
        //准备地图的坐标信息,找食物坐标改变颜色
        var r = Math.floor(Math.random() * 256);
        var g = Math.floor(Math.random() * 256);
        var b = Math.floor(Math.random() * 256);
        var RGB = 'rgb(' + r + ',' + g + ',' + b + ')';
        this.maps[this.food.row][this.food.column].style.backgroundColor = RGB;
    }

start函数
start函数功能为开始游戏,让蛇动起来其实很简单,利用setInterval方法设置一个定时器即可,通过不断渲染蛇的最新位置信息,蛇就能动起来啦!
start函数中还包含其他一些函数,比如需要判断是否撞墙、是否首尾相撞、是否吃到食物等等,在此就不做详细说明(github代码中有详细注释).

start() {
        //让蛇跑起来
        this.timer = setInterval(() => {
            this.snake.move();
            //判断是否撞墙 以及 是否碰到蛇尾巴
            if (this.knockedEdge() || this.snake.killSelf()) {
                this.audio.pause();
                this.renderDieMusic();
                this.gameOver();
                this.renderDieMessage();
                //alert("Game Over !!!");
                return;
            }
            //蛇吃食物
            if(this.isEatFood()){
                //1、蛇身体增长
                this.snake.growUp();
                //2、更新食物坐标
                this.randomFood();

                //3、更新关卡
                this.renderLevel();
            }
            //清除之前的坐标信息
            this.clear();
            //根据蛇的最新坐标,重新渲染
            this.renderSnake();
            //重新渲染食物
            this.renderFood();
        }, this.speed);
    }

gameOver函数
gameOver函数功能为当蛇碰壁或者蛇首尾相撞的时候结束游戏,实现起来及其简单,就是把start中设置的定时器关掉即可。

    gameOver() {
        //停止游戏,清除定时器
        //alert('撞墙啦!');
        clearInterval(this.timer);
    }
move(){
        //1 去掉蛇尾
        this.tail = this.pop();
        //2 蛇头移动 根据键盘按下的键
        if(this.direction === 39){
            //往右跑
            this.unshift({
                row:this[0].row,
                column:this[0].column+1
            });
        }else if(this.direction === 37){
            //往左跑
            this.unshift({
                row:this[0].row,
                column:this[0].column-1
            });
        }else if(this.direction === 40){
            //往下跑
            this.unshift({
                row:this[0].row+1,
                column:this[0].column
            });
        }else if (this.direction === 38){
            //往下跑
            this.unshift({
                row:this[0].row-1,
                column:this[0].column
            });
        }
    }

gorwUp函数
growUp函数的功能为增长,即蛇吃了食物后蛇身长度加一,实现起来也很容易,就是把刚刚move的时候蛇尾去掉的元素push进数组即可!

   growUp(){
        //把move时候干掉的蛇尾巴加回来
        this.push(this.tail);
    }

!!!
最后,new对象

game = new Game('#game',new Snake(),new Food());

二、功能演示

由于界面跳转,背景音乐,操作控制、难度控制等功能还未实现,下面只演示蛇移动,以及蛇吃食物的效果。
在这里插入图片描述

三、总结

今天,主要完成了蛇移动,蛇吃食物,分数关卡控制的功能,其他的一些附属功能还有待完善!!!请见下一篇博文丫

标签:函数,项目,column,12.7,坐标,食物,日志,Math,row
来源: https://blog.csdn.net/qq_44288506/article/details/110947801