IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 用js制作打砖块的游戏 -> 正文阅读

[JavaScript知识库]用js制作打砖块的游戏

<style>
        * {
            margin: 0;
            padding: 0;
        }
        
        #wrap {
            width: 1200px;
            margin: 100px auto;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        
        #tip,
        #score {
            height: 200px;
            padding: 10px;
            border: 1px solid #000;
            border-radius: 20px;
        }
        
        #tip {
            width: 200px;
            order: -1;
            text-indent: 2em;
            display: flex;
            flex-direction: column;
            justify-content: space-evenly;
        }
        
        #score {
            width: 180px;
            text-align: center;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        #scoreboard {
            color: red;
        }
        
        #box {
            width: 600px;
            height: 650px;
            border: 1px solid #000;
            background-image: radial-gradient(879px at 10.4% 22.3%, rgb(255, 235, 238) 0%, rgb(186, 190, 245) 93.6%);
            position: relative;
        }
        
        #ball {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: #000;
            /* 加上定位,让小球运动 */
            position: absolute;
            box-shadow: 0px 0px 3px 3px #7ed6df;
            top: 540px;
        }
        
        #slider {
            width: 120px;
            height: 20px;
            background-color: #686de0;
            border-radius: 10px;
            position: absolute;
            top: 570px;
            cursor: pointer;
        }
        
        #btn {
            width: 150px;
            height: 90px;
            position: absolute;
            border-radius: 10px;
            top: 400px;
            left: 50%;
            margin-left: -60px;
            font-size: 24px;
        }
        
        #bricks div {
            width: 98px;
            height: 20px;
            border: 1px solid rgb(255, 255, 255);
            float: left;
        }
    </style>
</head>

<body>
    <!-- 大盒子 -->
    <div id="wrap">
        <!-- 游戏区域 -->
        <div id="box">
            <!-- 砖块区 -->
            <div id="bricks">
            </div>
            <!-- 小球 -->
            <div id="ball">

            </div>
            <!-- 滑块 -->
            <div id="slider">

            </div>
            <!-- 按钮 -->
            <button id="btn">
              开始游戏
            </button>
        </div>
        <!-- 游戏说明 -->
        <div id="tip">
            <h1>游戏说明</h1>
            <p>点击开始按钮开始游戏</p>
            <p>使用鼠标拖拽滑块,反弹小球得分</p>
            <p>当小球触底时,游戏结束</p>
            <p>所有方块消失,游戏胜利</p>
        </div>
        <!-- 计分板 -->
        <div id="score">
            <h2>得分:<span id="scoreboard">0</span></h2>
        </div>
    </div>
    <script>
        /* 获取游戏区域 */
        var box = document.getElementById("box")
            /* 砖块区 */
        var bricks = document.getElementById("bricks")
            /* 小球 */
        var ball = document.getElementById("ball")
            /* 滑块 */
        var slider = document.getElementById("slider")
            /* 按钮 */
        var btn = document.getElementById("btn")
            /* 获取计分板 */
        var scoreboard = document.getElementById('scoreboard')
            /* 记录总分 */
        var score = 0;
        /* ----------------------------------- */

        /* -------------------------------------- */
        /* 为小球和砖块添加left的值 */
        var randomLeft = getRandom(100, 500)
        ball.style.left = randomLeft + 'px'
        slider.style.left = randomLeft + ball.offsetWidth / 2 - slider.offsetWidth / 2 + 'px'
            /* 随机得到小球的运动速度 */
        var speedX = getRandom(3, 7)
        var speedY = getRandom(-4, -8)
            /* 定义一个定时器的变量为空 */
        var timer = null;
        /* ------------------------------------------- */
        btn.onclick = function() {
            /* 点击开始后把按钮隐藏 */
            btn.style.display = "none"
                /* 每次开始之前先清除定时器,确保只有一个定时器在工作。 */
            clearInterval(timer)
                /* 让小球运动 */
            timer = setInterval(function() {
                /* 计算出left位置 */
                var arrivedX = ball.offsetLeft + speedX;
                /* 计算出top位置 */
                var arrivedY = ball.offsetTop + speedY;
                /* 求小球运动的边界 */
                var maxLeft = box.offsetWidth - ball.offsetWidth;
                var maxTop = box.offsetHeight - ball.offsetHeight;
                /* 判断小球是否出界 */
                /* 左右边界 */
                if (arrivedX <= 0) {
                    speedX *= -1;
                    arrivedX = 0
                } else if (arrivedX > maxLeft) {
                    speedX *= -1
                    arrivedX = maxLeft;

                }
                /* 上下边界 */
                if (arrivedY <= 0) {

                    speedY *= -1
                    arrivedY = 0;
                } else if (arrivedY >= maxTop) {
                    /* 如果小球到底部,则游戏结束 */
                    alert('游戏结束');
                    /* 并清除定时器 */
                    clearInterval(timer);
                    /* 刷新页面 */
                    location.reload()
                }
                /* 设置小球的left和top */
                ball.style.left = arrivedX + 'px'
                ball.style.top = arrivedY + 'px'
                    /* 获取所有的砖块 */
                var items = bricks.querySelectorAll('div')
                    /* 遍历所有div砖块 */
                for (var i = 0; i < items.length; i++) {
                    /* 检测碰撞  小球和砖块 */
                    if (konck(ball, items[i])) {
                        /* 结果为true时,证明发生了碰撞。 */
                        // 执行  小球反弹
                        speedY *= -1;
                        // 删除砖块
                        items[i].remove();
                        // 计分板加1
                        score++;
                        /* 将数值加入到span标签中 */
                        scoreboard.innerHTML = score;
                        setTimeout(function() {
                            if (items.length == 1) {
                                alert('恭喜你通关')
                                    /* 刷新页面 */
                                location.reload();
                            }
                        }, 0)
                        /* 结束 */
                        break;
                    }

                }
                /* 判断是否和滑块发生了碰撞 */
                if (konck(ball, slider)) {
                    /* 碰撞就原路返回 */
                    speedY *= -1;
                }
            }, 16)
        }

        /* ------------------------------ */
        /* 滑块拖拽部分 */
        /* 鼠标按下 */
        slider.onmousedown = function(ev) {
                document.onmousemove = function(e) {
                    /* 获取偏移值 */
                    var x = e.pageX - box.offsetLeft - ev.offsetX
                        /* 获取最大值 */
                    var maxX = box.offsetWidth - slider.offsetWidth
                        /* 判断是否出界,出界则停留在原地 */
                    if (x <= 0) {
                        x = 0;
                    } else if (x >= maxX) {
                        x = maxX
                    }
                    slider.style.left = x + 'px'
                }
            }
            /* 鼠标抬起 将事件解绑*/
        document.onmouseup = function() {
                document.onmousemove = null;
            }
            /* ------------------------------ */
        createBrick(72)
            /* 生成砖块 */
        function createBrick(n) {
            for (var k = 0; k < n; k++) {
                //创建一个div节点
                var node = document.createElement('div')
                    /* 为新节点创建颜色 */
                node.style.backgroundColor = getColor()
                    /* 将新建的节点加入到砖块区 */
                bricks.appendChild(node)
                    /* 获取砖块的left和top */
                var l = node.offsetLeft;
                var t = node.offsetTop
                    /* 把获取的加入到元素中 */
                node.style.left = l + 'px'
                node.style.top = t + 'px'
            }
        }
        /* 所有砖块都获坐标后  才能绝对定位 */
        var items = bricks.querySelectorAll('div')
            /* 为每一个块添加定位 */
        for (var j = 0; j < items.length; j++) {
            items[j].style.position = "absolute"
        }
        /* ---------------------------------------------- */
        /* 生成随机数 */
        function getRandom(n, m) {
            return Math.floor(Math.random() * (m - n + 1) + n)
        }
        /* 生成随机颜色 */
        function getColor() {
            var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F"];
            color = "#"
            for (i = 0; i < 6; i++) {
                color += arr[getRandom(0, 15)]
            }
            return color
        }
        /* 碰撞函数 */
        function konck(el1, el2) {
            // 以下4中情况,只要满足一个,就说明没有碰撞
            // 1.盒子1的左边框大于盒子2的右边框
            // 2.盒子1的右边框小于盒子2的左边框
            // 3.盒子1的上边框大于盒子2的下边框
            // 3.盒子1的下边框小于盒子2的上边框
            var l1 = el1.offsetLeft; //盒子1的左边框
            var r1 = el1.offsetLeft + el1.offsetWidth; //盒子1的右边框
            var t1 = el1.offsetTop; //盒子1的上边框
            var b1 = el1.offsetTop + el1.offsetHeight; //盒子1的下边框
            var l2 = el2.offsetLeft; //盒子2的左边框
            var r2 = el2.offsetLeft + el2.offsetWidth; //盒子2的右边框
            var t2 = el2.offsetTop; //盒子2的上边框
            var b2 = el2.offsetTop + el2.offsetHeight; //盒子2的下边框
            /* 判断 */
            if (l1 > r2 || r1 < l2 || t1 > b2 || b1 < t2) {
                return false;
            } else {
                return true;
            }
        }
    </script>
</body>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:30:07  更:2021-11-12 19:30:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 21:40:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码