Vue2实现别踩白块(第一种)

这篇具有很好参考价值的文章主要介绍了Vue2实现别踩白块(第一种)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实际效果:可选模式

Vue2实现别踩白块(第一种),前端小游戏,chrome,前端,javascript,vue.js

开始按钮

Vue2实现别踩白块(第一种),前端小游戏,chrome,前端,javascript,vue.js

游戏界面

Vue2实现别踩白块(第一种),前端小游戏,chrome,前端,javascript,vue.js

游戏失败(不点击任何黑块)

Vue2实现别踩白块(第一种),前端小游戏,chrome,前端,javascript,vue.js

游戏中(点击黑块变灰色)

Vue2实现别踩白块(第一种),前端小游戏,chrome,前端,javascript,vue.js

功能简介:

1、点击无尽模式,就是常规速度,定时器20毫秒,然后无限计分
2、急速模式,比常规快一倍,定时器8毫秒
3、计时模式,限时60秒,定时器20毫秒,计分
以上所有模式,点击白块直接失败,点击黑块得计一分。最高分数和最长时间,这里只进行了存储,没有写比较计算的逻辑。可以自行补全

代码逻辑:

此别踩白块的整体思路为:
1、数组存放白块数据:二维数组,数组内部单个元素为一个四位数字的数组,其中1代表黑块,0代表白块,一行四块。

blocksArr:[ // [1,0,0,0], // [0,0,1,0], ],
2、当点击开始按钮的时候,开始定时器,开始向数组插入一行随机生成的带有一个黑块标记的四位数组。然后开始改变容器的top值,使之向下移动。点击黑块会将1修改为2,当数组长度为6进行循环判断其中是否存在未被点击的黑块,如有则游戏结束。否则就会删除最后一行数据。

实际代码:
<template>
    <div class="box" ref="box">
        <!-- 菜单页 -->
        <div class="menu-page" v-if="showMenu">
            <div class="menu-item" 
                v-for="(item,index) in menuArr" 
                :key="index" 
                @click="chooseMode(item)">
                {{ item.name }}


                <span v-show="item.key=='highest'">
                    :
                    {{ historyHighestScore }}
                </span>
                <span v-show="item.key=='longest'">
                    :
                    {{ historyLongestTimeLen }}s
                </span>
            </div>
        </div>


        <!-- 内部 -->
        <!-- 提示模式 -->
        <div class="tips-mode" v-show="showModeTips&&!showMenu">
            当前模式:
            <span v-if="gameMode=='infinite'">无尽模式</span>
            <span v-if="gameMode=='fast'">急速模式</span>
            <span v-if="gameMode=='timeLimit'">计时模式</span>
        </div>
        <!-- 计时 -->
        <div class="time-num" v-show="showSurvivalTime&&!showMenu">
            存活时间:
            <span>{{ survivalTime||0 }}s</span>
        </div>
        <!-- 倒计时 -->
        <div class="time-num" v-show="showLimitTimeLen&&!showMenu">
            时间:
            <span>{{ limitTimeLen||0 }}s</span>
        </div>
        <!-- 计分 -->
        <div class="score-num" v-if="showScore&&!showMenu&&(showSurvivalTime||showLimitTimeLen)">
            分数:
            <span>{{ score }}</span>
        </div>

        <div class="scroll" ref="scroll" v-if="!showMenu">
            <ul class="li-wrap" v-for="(item,index) in blocksArr" :key="index">
                <li class="li-content" 
                    v-for="(ite,idx) in item" 
                    :key="idx" 
                    :style="{'background':ite==1?'black':ite==2?'#eee':'#fff'}"
                    @click="clickBlock(index,idx)"
                >
                </li>
            </ul>
        </div>
        <div class="begin" v-if="showBtn&&!showMenu">
            <button @click="clickStart">{{btnText}}</button> 
            <span @click="backMenu">返回菜单</span>
        </div>
    </div> 
</template>
   
<script>
    export default {
        name: "App",
        created() {
            //获取内存
            this.getHistoryData()
        },

        data(){
            return{
                showBtn:true,// 是否显示按钮
                btnText:'开始游戏',
                showScore:false,//显示分数
                showLimitTimeLen:false,//显示限制时间
                showSurvivalTime:false,  //显示计时
                showMenu:true,// 显示菜单页
                showModeTips:false, //显示游戏模式
                gameMode:'',  //游戏模式

                timer:null,  //白块滚动定时器
                limitTimer:null, //倒计时器定时器
                survivalTimer:null, //正计时器定时器
                limitTimeLen:60,//倒计时模式时间1分钟

                
                survivalTime:0,  //计时器时间

                speed:5,  //步长
                tripleSpeed:20,  //定时器速度  普通就是20   极速就是8

                score:0, //分数
                

                //产生白块
                blocksArr:[
                    // [1,0,0,0],
                    // [0,0,1,0],
                ],

                //菜单
                menuArr:[
                    {
                        name:'无尽模式',
                        key:'infinite'
                    },
                    {
                        name:'急速模式',
                        key:'fast'
                    },
                    {
                        name:'计时模式',
                        key:'timeLimit'
                    },
                    {
                        name:'微信游客',
                        key:'tour'
                    },
                    {
                        name:'最高分数',
                        key:'highest'
                    },
                    {
                        name:'最长时间',
                        key:'longest'
                    }
                ],


                historyHighestScore:0, // 历史最高分
                historyLongestTimeLen:0, // 历史最长时间
                
            }
        },
        methods: {
            getHistoryData(){
                this.historyHighestScore = localStorage.getItem('whiteBlockScore')||0
                this.historyLongestTimeLen = localStorage.getItem('whiteBlockTimeLen')||0
            },
            //点击开始
            clickStart(){
                // this.showBtn = false;

                this.$refs.box.style.backgroundColor = '#fff';
                this.$refs.box.style.border = '1px solid black';

                this.$refs.scroll.innerHTML = "";

                this.speed = 5
                this.timer =  null;
                this.beginGame();
            },
            //开始游戏
            beginGame(){
                let that = this;
                this.showBtn = false
                this.showScore = true
                this.blocksArr = []
                this.score = 0;
                this.survivalTime = 0
                this.limitTimeLen = 60

                this.showModeTips = false

                if(this.gameMode=='timeLimit'){
                    this.countdown()
                }
                if(this.gameMode=='infinite'||this.gameMode=='fast'){
                    this.countup()
                }
                

                this.timer = setInterval(()=>{
                    //开始移动
                    console.log('烦得很',that.$refs.scroll.offsetTop,that.$refs.scroll.style.top)
                    that.$refs.scroll.style.top = that.$refs.scroll.offsetTop + that.speed +'px'
                    //因为默认是负的  进入画面就生成白块
                    if(that.$refs.scroll.offsetTop >= 0){
                        that.creatNewRow();
                        that.$refs.scroll.style.top = '-130px';
                    }


                    //删除第一行  也就是滑下去的哪一行
                    //这里的数字应该是活的  比如这个7
                    let clientHeight = this.$refs.box.clientHeight
                    let num = Math.ceil(clientHeight/130)
                    if(that.blocksArr.length == num){
                        for(var i = 0; i < 4; i++){
                            if(that.blocksArr[that.blocksArr.length-1][i]==1){
                                that.stopGame()
                            }
                        }
                        if(this.timer){
                            that.blocksArr.pop()
                        }
                    }
                },that.tripleSpeed)
            },

            ///游戏结束
            stopGame(){
                // this.$refs.scroll.style.top = this.$refs.scroll.offsetTop+'px';
                alert('得分:' + this.score);
                clearInterval(this.timer);
                clearInterval(this.limitTimer);
                clearInterval(this.survivalTimer);
                this.timer = null
                this.limitTimer = null
                this.survivalTimer = null

                this.showBtn = !this.showBtn;
                this.btnText = '重新开始';


                //保存分数和时长
                this.saveTimeOrScore(this.score,'score')

                if(this.gameMode=='infinite'||this.gameMode=='fast'){
                    this.saveTimeOrScore(this.survivalTime,'time')
                }

                
            },

            //点击方块
            clickBlock(index,idx){
                if(this.blocksArr[index][idx]==0){
                    this.stopGame()
                }else if(this.blocksArr[index][idx]==1){
                    this.blocksArr[index][idx] = 2
                    this.score++


                    if(this.score % 20 == 0){
                        this.speed++;
                    }
                }
            },

            //随机数0-3
            randomNum(m,n){
                return parseInt(Math.random() * (n - m + 1)) + m;
            },

            //创建格子
            creatNewRow(){
                let that = this
                var index = this.randomNum(0 , 3);


                let newRowArr = [0,0,0,0]
                newRowArr[index] = 1
                this.blocksArr.unshift(newRowArr)
            },


            //返回菜单
            backMenu(){
                this.showMenu = true
                this.showLimitTimeLen = false
                this.showSurvivalTime = false
                this.showScore = false
                this.showModeTips = false

                this.limitTimeLen = 60
                this.survivalTime = 0


                this.getHistoryData()
            },

            //选择模式
            chooseMode(item){
                //无尽   计时   急速
                switch (item.key){
                    case 'highest':
                    case 'longest':
                    case 'tour':
                        this.showMenu = true
                        break;
                    case 'fast':
                        this.tripleSpeed = 8
                        this.showMenu = false
                        this.showSurvivalTime = true
                        break
                    case 'timeLimit':
                        this.showLimitTimeLen = true
                        this.showMenu = false
                        this.tripleSpeed = 20
                        break
                    case 'infinite':
                        this.tripleSpeed = 20
                        this.showMenu = false
                        this.showSurvivalTime = true
                        break
                }  

                //重置基础状态
                this.showModeTips = true
                this.gameMode = item.key
                this.showScore = true
                this.score = 0

                this.blocksArr = []
                this.btnText = '开始游戏'

                clearInterval(this.timer)
                this.timer = null
                console.log('this.mode',this.gameMode)
            },


            //倒计时函数
            countdown() {
                let that = this
                this.limitTimer = setInterval(()=>{
                    if(that.limitTimeLen){
                        that.limitTimeLen--
                    }else{
                        clearInterval(that.limitTimer)
                        that.stopGame()
                    }
                    
                },1000)
            },

            //正计时
            countup() {
                let that = this
                this.survivalTimer = setInterval(()=>{
                    that.survivalTime++
                },1000)
            },

            //存储最高分和存活时长
            saveTimeOrScore(val,type){
                if(type=='score'){
                    localStorage.setItem('whiteBlockScore',val)
                }else{
                    localStorage.setItem('whiteBlockTimeLen',val)
                }
            },
        }
    };
</script>
   
<style lang="scss" scoped>
    *{
        margin: 0;
        padding: 0;
    }
    li{
        list-style: none;
    }
    .box{
        width: 100vw;
        height: 100vh;
        background-color: #fff;
        margin: 0px auto;
        position: relative;
        overflow: hidden;
        .tips-mode{
            position: absolute;
            top: 2%;
            left: 50%;
            transform: translate(-50%,-50%);
            font-size: 15px;
            color: #9e9e9e;
            z-index: 9;
        }
        .time-num{
            position: absolute;
            top: 6%;
            left: 50%;
            transform: translate(-50%,-50%);
            font-size: 18px;
            color: red;
            z-index: 9;
        }
        .score-num{
            position: absolute;
            top: 10%;
            left: 50%;
            transform: translate(-50%,-50%);
            font-size: 18px;
            color: red;
            z-index: 9;
        }

        .menu-page{
            display: flex;
            flex-wrap: wrap;

            .menu-item{
                width: 50%;
                height: 33.33vh;

                display: flex;
                align-items: center;
                justify-content: center;

                font-size: 1rem;
                color: #333;
                background: #fff;

                &:nth-child(2),&:nth-child(3),&:nth-child(6){
                    background: #333;
                    color: #fff;
                }
            }
        }
        
    }
    .scroll{
        width: 100%;
        height: 100%;
        /* background-color: skyblue; */
        position: absolute;
        top: -130px;

        ul,.li-wrap{
            width: 100%;
            display: flex;
            li,.li-content{
                float: left !important;
                width: 25% !important;
                height: 130px !important;
                border: 1px solid black !important;
            }
        }
    }
    .begin{
        width: 100%;
        height: 120px;
        position: relative;
        background: yellow;
        z-index: 2;
        top: 50%;
        left: 0;
        margin-top: -30%;


        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        button{
            width: 200px;
            height: 50px;
            font-size: 30px;
            margin-bottom: 10px;
        }
        span{
            display: block;
            text-align: center;
            font-size: 15px;
        }
    }

</style>
总结

此代码存在一些瑕疵,但是基本功能已经实现。如有问题欢迎指出,一起学习进步文章来源地址https://www.toymoban.com/news/detail-739142.html

到了这里,关于Vue2实现别踩白块(第一种)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微前端qiankun架构 (基于vue2实现)使用教程

    node -- 16+ @vue/cli -- 5+ 创建文件夹qiankun-test。 使用vue脚手架创建主应用main和子应用dev   安装 qiankun: 使用qiankun: 在 utils 内创建 微应用文件夹 microApp,在该文件夹内创建微应用出口文件 index.js,路由文件 microAppRouter,配置函数文件 microAppSetting。 路由文件 microAppRouter 配置函数文件

    2023年04月19日
    浏览(49)
  • Vue2 +Element-ui实现前端页面

    以一个简单的前端页面为例。主要是利用vue和element-ui实现。 里面涉及的主要包括:新建vue项目、一行多个输入框、页面实现等。   ①首先安装nodejs,这部分在此就不讲啦。 ②然后安装vue-cli: 查看是否安装成功: 安装成功之后就输出vue的版本 ③在cmd窗口新建一个vue2脚手架

    2024年02月16日
    浏览(45)
  • vue2 利用网络代理axios实现开发环境前端跨域

    vue2 利用网络代理axios实现前端跨域 vue.config.js 配置代理 vue文件 实现开发环境跨域请求 测试生产环境跨域跳转 https://blog.csdn.net/weixin_43858851/article/details/137518111?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137518111%22%2C%22source%22%3A%22weixin_43858851%22%7D

    2024年04月12日
    浏览(47)
  • vue2项目导出操作实现(后端接口导出、前端直接做导出)

    实现效果:导出列表数据 导出的内容: 后台相对来说比较简单一点,只要后端配合写接口即可 代码:放在导出事件里进行调整即可完成导出效果 效果如上:个人认为调接口导出的表格更美观一点 操作如下: 首先安装我们需要的xlxs库: 接着在我们项目文件夹/src/assets/js创建

    2024年04月11日
    浏览(46)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(76)
  • Jeecg开发框架前端VUE2数据页面与后端数据库交互实现

    ​ JeecgBoot 是一款基于代码生成器的 低代码 开发平台,零代码开发!采用前后端分离架构:SpringBoot2.x,Ant DesignVue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式- 代码生成器模式- 手工MERGE智能开发

    2024年02月11日
    浏览(44)
  • 【vue2】前端实现下载后端返回的application/octet-stream文件流

    1、下载csv/txt时 此时无须修改接口的响应格式 2、下载Excel时,需要修改一下接口的响应格式为blob 另

    2024年02月11日
    浏览(56)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览(包括pdf选中文字,epub高亮等)

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(61)
  • Vue2项目练手——通用后台管理项目第一节

    npm的缺点: npm install时候巨慢 同一个项目,安装的时候无法保持一致性。 由于package.json文件中版本号的特点。 “5.0.3” 安装指定的5.0.3版本 “~5.0.3” 表示安装5.0.X中最新的版本 “^5.0.3” 表示安装5.X.X中最新的版本 有时候会出现版本不一致不能运行的情况。 yarn的优点 速度

    2024年02月11日
    浏览(55)
  • 从Vue2到Vue3【一】——Composition API(第一章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) Vue3作为Vue.js框架的最新版本,引入了许多令人激动的新特性和改进。其

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包