原生JS做别踩白块游戏

news2024/12/26 23:32:52

思路

  1. 创建初始一个按钮并为他添加点击监听
  2. 开始创建随机方块,并样式_box.offsetTop + speed + 'px'结合setInterval使得方块不断下移
  3. 创建和删除方块的原则:box.offsetTop>=0(可视区上部没有方块了)时候需要创建一行方块,并随机指定一个黑色方块。当方块行数大于6行(不能刚刚5行,因为只有方块完全溢出才能删除)时候就删除方块。所以加上完全溢出、预备各一行、可视行4行一共6行。
  4. 结束游戏原则:删除最后一行之前先判断该行有没有样式是黑色方块的样式,如果有结束游戏,或者点击到百色方块也提前结束游戏。

改进代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>别踩白块</title>
    <style>
        *{
            padding: 0;
            margin: 0;
            text-decoration: none;
        }
        .top {
            width: 400px;
            height: 100px;
            margin: 50px auto;
            position: relative;
            overflow: hidden;
        }
        .wrapper {
            width: 400px;
            height: 520px;
            border: 1px solid #222;
            margin: 50px auto;
            position: relative;
            overflow: hidden;
        }
        .box {
            width: 100%;
            height: 520px;
            /* border: 1px solid red; */
            position: relative;
            top: -150px;
        }
        #play{
            position: absolute;
            width: 200px;
            height: 100px;
            right: 150px;
            top: 350px;
            border: 1px dashed #ccc;
            text-align: center;
            border-radius: 8px;
            background-color: #ff9950;
        }
        #play a{
            line-height: 100px;
            font-size: 30px;
        }
        .rdiv{
            width: 400px;
            height: 130px;
            /* border:1px solid #000; */
        }
        .odiv{
            width:99px;
            height:129px;
             border-left:1px solid #222;
            border-bottom:1px solid #222;
            float: left;
            cursor: pointer;
        }
       
        span{
            width: 100px;
        }

    </style>
</head>
<body>
    <div class="top">
        <span>分数:</span><input type="text" name="" id="score" value="0" readonly="readonly">
        <br>
       
        <span>难度</span>
        <select id="diffculty" class="diffculty" onchange="changeTimeValue();">
            <option value="high">困难</option>  
            <option value="normal" selected="selected">一般</option>  
            <option value="low">容易</option>   
        </select>
    </div>
    <div class="wrapper" id="_wrapper">
        <div class="box" id="_box"></div>
       
    </div>  
    <div id="play">
            <a href="#">Game Start</a>
     </div> 
</body>
</html>
<script>
    // 点击game start ,box开始运动 并创建方块
    var _box = document.getElementById('_box');
    var _wrapper = document.getElementById('_wrapper');
    var time = 0;
    var _score = document.getElementById('score');
    var score = 0
    var speed = 5;
    var flag = true;
    var diff = "low";
    
    click();// 点击初始化函数
    function click(){
        var _play = document.getElementById('play');
        _play.addEventListener('click',function(){
            _play.style.display = 'none';
            var diff = document.getElementById("diffculty").value;
            if(diff == 'high'){
                time = 10;
                
            }else if(diff == 'normal'){
                time = 20;
                 
            }else{
                time = 30;
                
            }
            boxPlay();
        })
    }
    // _box移动
    function boxPlay(){
        timer = setInterval(function(){
            _box.style.top = _box.offsetTop + speed + 'px';
            
            if(_box.offsetTop >= 0)
            {
                // 如果_box的到达可视区域就创建一行 并且top值立即到-130px
                create();
                _box.style.top = -130 + 'px';
            }
            // 如果_box的children.length > 6 ,移除最后一个盒子。既_box做多有6个孩子 
            if(_box.children.length == 6)
            {
                for(var i = 0;i < 4;i++)
                 {
                     // 如果最后一行 里面有没有被点击 游戏结束
                    if(_box.lastChild.children[i].className == "odiv i")
                     {
                        clearInterval(timer);
                        flag = false;
                        alert('游戏结束'+'得分是:'+ score);                       
                    }       
                 }               
                _box.removeChild(_box.children[_box.children.length -1]);
            } 
            
            
        },time) 
        document.getElementById('_box').value = timer
        // 绑定点击事件
        bindEvent();
    }
    function bindEvent(){
        // 在大wrapper中点击
        
        _wrapper.addEventListener('click',function(event){
            var target = event.target;// 点击的目标
            if(target.className == 'odiv i' && flag == true)
            {
                target.style.backgroundColor = "#ccc";
                target.className = 'odiv';
                score ++;
            }
            else{
                clearInterval(timer);
                flag = false;
                alert('游戏结束! '+'得分是:'+ score);
                location.reload();
            }
            if(score % 10 == 0)
            {
                speed += 2;
            }
            _score.value = score
            
        })
    }
    // 创建盒子
    function create(){
        // 创建一行
        var rdiv = document.createElement('div');
        var random = Math.floor(Math.random()*4);// 随机出0-3的整数
        rdiv.setAttribute('class','rdiv');
        // 创建4列
        for(var i = 0 ; i < 4; i++)
        {
            var odiv = document.createElement('div');
            odiv.setAttribute('class','odiv');
            rdiv.appendChild(odiv);           
        }      
        if(_box.children.length == 0)
        {
            _box.appendChild(rdiv);
        }
        else{
            _box.insertBefore(rdiv,_box.children[0]);
        }
        var clickBox = _box.children[0].children[random];// 随机产生带颜色的小方块
        clickBox.className = 'odiv i';
        clickBox.style.backgroundColor = '#000';

    }
</script>

参考文章:

http://t.csdnimg.cn/N6zgu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache DolphinScheduler 社区 2023 年度工作报告

随着 2023 年的日历逐渐翻至最后一页&#xff0c;我们欣喜地回顾 Apache DolphinScheduler 社区在这一年中所取得的成就和进步。这一年&#xff0c;我们不仅在社区规模和技术发展上取得了显著成就&#xff0c;还发布了大量的技术文章和博客&#xff0c;进一步丰富了我们的知识库…

【Java进阶篇】Java中Timer实现定时调度的原理(解析)

Java中Timer实现定时调度的原理 ✔️ 引言✔️JDK 中Timer类的定义✔️拓展知识仓✔️优缺点 ✔️ 引言 Java中的Timer类是用于计划执行一项任务一次或重复固定延迟执行的简单工具。它使用一个名为TaskQueue的内部类来存储要执行的任务&#xff0c;这些任务被封装为TimerTask对…

条款16:成对使用 new 和 delete 时要采用相同形式

下面程序的行为是未定义的。至少&#xff0c;stringArray指向的100个string对象中有99个不太可能被正确地析构。 被delete的指针指向单个对象还是一个对象数组&#xff1f;内存数组通常包括数组的大小&#xff0c;delete可以知道需要调用多少个析构函数。 使用delete时使用了方…

SpringBoot 接口对枚举类型的入参以及出参的转换处理

目录 1、在项目中使用枚举类型2、不做任何处理的演示效果2.1、接口出参2.2、接口入参 3、用枚举的code作为参数和返回值3.1 代码案例3.1.1、定义枚举基础接口BaseEnum&#xff0c;每个枚举都实现该接口3.1.2、性别Sex枚举并实现接口BaseEnum3.1.3、定义BaseEnum枚举接口序列化3…

前端工程化回顾-vite 构建神器

1.构建vite 项目 pnpm create vite2.常用的配置&#xff1a; 1.公共资源路径配置&#xff1a; base: ./, 默认是/2.路径别名配置&#xff1a; resolve: {alias: {: path.resolve(__dirname, ./src),ass: path.resolve(__dirname, ./src/assets),comp: path.resolve(__dirnam…

正则表达式 详解,10分钟学会

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论正则表达式。 正则表达式是一种用于匹配和操作文本的工具&#xff0c;常用于文本查找、文本替换、校验文本格式等场景。 正则表达式不仅是写代码时才会使用&#xff0c;在平常使用的很多文本编辑软件&#xff0c;都…

多模态大模型Vary:扩充视觉Vocabulary,实现更细粒度的视觉感知

前言 现代大型视觉语言模型(LVLMs)具有相同的视觉词汇- CLIP&#xff0c;它可以涵盖大多数常见的视觉任务。然而&#xff0c;对于一些需要密集和细粒度视觉感知的特殊视觉任务&#xff0c;例如文档级OCR或图表理解&#xff0c;特别是在非英语场景下&#xff0c;clip风格的词汇…

盛最多水的容器(力扣11题)

例题&#xff1a; 分析&#xff1a; 这道题给出了一个数组&#xff0c;数组里的元素可以看成每一个挡板&#xff0c;要找到哪两个挡板之间盛的水最多&#xff0c;返回盛水量的最大值。这其实是一个双指针问题。 我们可以先固定第一个挡板( i )和最后一个挡板( j )&#xff0c…

FreeRTOS——计数型信号量知识总结及实战

1计数型信号量概念 1&#xff09;计数型信号量相当于队列长度大于1 的队列&#xff0c;因此计数型信号量能够容纳多个资源 2&#xff09;适用场景&#xff1a; 事件计数&#xff1a; 当每次事件发生后&#xff0c;在事件处理函数中释放计数型信号量&#xff08;计数值1&#x…

mysql查询表里的重复数据方法:

1 2 3 4 INSERT INTO hk_test(username, passwd) VALUES (qmf1, qmf1),(qmf2, qmf11) delete from hk_test where usernameqmf1 and passwdqmf1 MySQL里查询表里的重复数据记录&#xff1a; 先查看重复的原始数据&#xff1a; 场景一&#xff1a;列出username字段有重读的数…

【算法每日一练]-dfs bfs(保姆级教程 篇8 )#01迷宫 #血色先锋队 #求先序排列 #取数游戏 #数的划分

目录 今日知识点&#xff1a; 使用并查集映射点&#xff0c;构造迷宫的连通块 vis计时数组要同步当回合的处理 递归求先序排列 基于不相邻的取数问题&#xff1a;dfs回溯 n个相同球放入k个相同盒子&#xff1a;dfs的优化分支暴力 01迷宫 血色先锋队 求先序排列 取数游…

[Android]RadioButton控件

RadioButton控件 RadioButton控件是单选按钮控件&#xff0c;它继承自Button控件&#xff0c;可以直接使用Button控件支持的各种属性和方法。 与普通按钮不同的是&#xff0c;RadioButton控件多了一个可以选中的功能&#xff0c;能额外指定一个android&#xff1a;checked属性…

谷歌Gemini模型,碾压GPT-4!

谷歌Gemini 1.0革新&#xff0c;推出Gemini Ultra、Gemini Pro和Gemini Nano模型。Gemini Ultra强大但慢&#xff0c;Gemini Pro通用&#xff0c;Gemini Nano高效。Gemini模型在多领域与ChatGPT竞争&#xff0c;尤其Gemini Pro已应用于Bard。Gemini模型预计将在2024年通过Bard …

c语言结构体学习

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 三、结构…

【解决】Unity 设置跨设备分辨率表现

开发平台&#xff1a;Unity 2018版本以上 开发语言&#xff1a;CSharp 编程平台&#xff1a;Visual Studio 2022   问题描述 使用 UnityEngine.dll 中关于设置分辨率的方法时&#xff0c;无法满足应用以设定分辨率进行屏幕显示问题。因而造成画面不同程度的拉伸情况。而这种情…

【Java】接口和抽象类有什么共同点和区别?

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 【Java】接口和抽象类有什么共同点和区别&…

工作流入门这篇就够了!

总概 定义&#xff1a;工作流是在计算机支持下业务流程的自动或半自动化&#xff0c;其通过对流程进行描述以及按一定规则执行以完成相应工作。 应用&#xff1a;随着计算机技术的发展以及工业生产、办公自动化等领域的需求不断提升&#xff0c;面向事务审批、材料提交、业务…

力扣hot100 对称二叉树 递归 队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考思路 递归的难点在于&#xff1a;找到可以递归的点 为什么很多人觉得递归一看就会&#xff0c;一写就废。 或者说是自己写无法写出来&#xff0c;关键就是你对递归理解的深不深。 对于此题&#xf…

day04 两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表Ⅱ

题目1&#xff1a;24 两两交换链表中的节点 题目链接&#xff1a;24 两两交换链表中的节点 题意 两两交换链表中相邻的节点&#xff0c;返回交换后链表的头节点 虚拟头节点 注意终止条件&#xff0c;考虑节点的奇偶数&#xff0c;根据奇偶数确定终止条件 注意定义中间变量…

Amos各版本安装指南

Amos下载链接 https://pan.baidu.com/s/1uyblN8Q-knNKkqQVlNnXTw?pwd0531 1.鼠标右击【Amos28】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Amos28】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Amos28】选择【以管理员身份运行…