用JS实现一个简单的打砖块游戏


Posted in Javascript onDecember 11, 2019

话不多说,先看看效果:

用JS实现一个简单的打砖块游戏

HTML架构部分

<!-- HTML结构 -->
<div class="content">
    <div class="game"></div>
    <div class="container">
      <h2>打砖块小游戏</h2>
      <hr />
      <center>
        <button id="start"
          style="width: 120px;height: 22px;margin: 20px auto;border-radius: 10px;border: none;outline: none;color: rgba(145, 146, 146, 0.918);cursor:pointer;">开始游戏</button>
      </center>
      <div style="width: 219px;border: 1px solid rgba(145, 146, 146, 0.918);"></div>
      <center>
        <button id="reset"
          style="width: 120px;height: 22px;margin: 20px auto;border-radius: 10px;border: none;outline: none;color: rgba(145, 146, 146, 0.918);cursor:pointer;">再来一局</button>
      </center>
      <center>
        <!-- 分数 -->
        <div id="score"></div>
      </center>
    </div>

  </div>

CSS样式部分

<!-- CSS样式 -->
<style>
    * {
      padding: 0;
      margin: 0;
    }

    /* body>div {
      width: 550px;
      height: 520px;
      display: flex;
      margin: 20px auto;
    } */

    .container {
      width: 220px;
      height: 500px;
      border: 1px solid rgba(145, 146, 146, 0.918);
      margin-top: 20px;
      margin-right: 120px;
    }

    h2 {
      text-align: center;
      font-size: 26px;
      color: rgba(145, 146, 146, 0.918);
      margin-bottom: 2px;
    }

    .content {
      position: relative;
      width: 800px;
      height: 600px;
      margin: 0 auto;
      overflow: hidden;
      display: flex;
    }

    .game {
      position: relative;
      width: 456px;
      height: 500px;
      border: 1px solid rgba(145, 146, 146, 0.918);
      margin: 20px auto 0;
    }

    .brick {
      position: absolute;
      width: 50px;
      height: 20px;
      background-color: rgb(238, 17, 28);
    }

    /* 画挡板 */
    .flap {
      position: absolute;
      width: 120px;
      height: 10px;
      bottom: 0;
      left: 0;
      background-color: royalblue;
    }

    .ball {
      position: absolute;
      width: 20px;
      height: 20px;
      bottom: 10px;
      left: 52px;
      border-radius: 50%;
      background-color: blue;
    }

    #score {
      width: 100px;
      height: 30px;
      right: 0;
      top: 10%;
      color: rgba(145, 146, 146, 0.918);
    }
  </style>

JavaScript脚本语言部分

<!-- JS结构 -->
  <script>
    /*
    // 获取canvas元素
    const canvas = document.getElementById('canvas');
    // 获取到上下文,创建context对象
    const ctx = canvas.getContext('2d');
    let raf;
    // 定义一个小球
    const ball = {
      x: 100,  // 小球的 x 坐标
      y: 100,  // 小球的 y 坐标
      raduis: 20, // 小球的半径
      color: 'blue', // 小球的颜色
      vx: 3, // 小球在 x 轴移动的速度
      vy: 2, // 小球在 y 轴移动的速度
      // 绘制方法
      draw: function () {
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.raduis, Math.PI * 2, false);
        ctx.closePath();
        ctx.fillStyle = this.color;
        ctx.fill();
      }
    }
    // 该函数为绘制函数:主要逻辑就是清空画布,重新绘制小球
    function draw() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ball.draw();
      // 进行边界的判断
      if (ball.y + ball.vy > canvas.height || ball.y + ball.vy < 0) {
        ball.vy = -ball.vy;
      }
      if (ball.x + ball.vx > canvas.width || ball.x + ball.vx < 0) {
        ball.vx = -ball.vx;
      }
      ball.x += ball.vx;
      ball.y += ball.vy;
      raf = window.requestAnimationFrame(draw);
    }
    raf = window.requestAnimationFrame(draw);
    */
    // 加载窗口 = init
    window.onload = init;
    function init() {
      // 获取元素
      let gameArea = document.getElementsByClassName("game")[0];
      // 设置10列
      let rows = 10;
      // 设置8行
      let cols = 8;
      // 砖块与砖块之间的宽度
      let b_width = 58;
      // 砖块与砖块之间的高度
      let b_height = 28;
      // 用数组的形式来装砖块
      let bricks = [];
      // 小球的X轴方向(上下左右来回的运动)
      let speedX = 5;
      // 小球Y轴方向(上下左右来回的运动)
      let speedY = -5;
      // 在内部里,小球上下左右来回的运动,【小球碰撞到砖块 = null】
      let interId = null;
      // 左边距离为0
      let lf = 0;
      // 上边距离为0
      let tp = 0;
      // 挡板
      let flap;
      // 挡板上面的小球
      let ball;
      // 分数记录(初始值为0)
      let n = 0;
      // 获取开始游戏按钮的元素
      let st = document.getElementById("start");
      // 获取再来一局(重新渲染)按钮的元素
      let rt = document.getElementById("reset");
      // 获取分数记录的元素
      let score = document.getElementById("score");
      score.innerHTML = "分数:" + n;
      // 提供(渲染)Dom[渲染砖块] 方法
      renderDom();
      // 键盘的操作(A与D;askm查询:A:65,需-32,D:68,需+32)方法
      bindDom();
      // 进行渲染砖块
      function renderDom() {
        getBrick();
        // 画砖块
        function getBrick() {
          for (let i = 0; i < rows; i++) {
            let tp = i * b_height;
            let brick = null;
            for (let j = 0; j < cols; j++) {
              let lf = j * b_width;
              brick = document.createElement("div");
              brick.className = "brick";
              brick.setAttribute("style", "top:" + tp + "px;left:" + lf + "px;");
              // 获取背景的颜色
              brick.style.backgroundColor = getColor();
              bricks.push(brick);
              gameArea.appendChild(brick);
            }
          }
        }
        //添加挡板
        flap = document.createElement("div");
        flap.className = "flap";
        gameArea.appendChild(flap);
        //添加挡板+小球
        ball = document.createElement("div");
        ball.className = "ball";
        gameArea.appendChild(ball);
      }
      // 键盘的操作
      function bindDom() {
        flap = document.getElementsByClassName("flap")[0];
        window.onkeydown = function (e) {
          let ev = e || window.event;
          // 左边移动
          let lf = null;
          // A键往左移动
          if (e.keyCode == 65) {
            lf = flap.offsetLeft - 32;
            if (lf < 0) {
              lf = 0;
            }
            flap.style.left = lf + "px";
            // D键往右移动
          } else if (e.keyCode == 68) {
            lf = flap.offsetLeft + 32;
            if (lf >= gameArea.offsetWidth - flap.offsetWidth) {
              lf = gameArea.offsetWidth - flap.offsetWidth
            }
            flap.style.left = lf + "px";
          }
        }
        // 为开始游戏按钮添加点击事件
        st.onclick = function () {
          // 实现小球上下左右不断移动
          ballMove();
          st.onclick = null;
        }
        // 为再来一局按钮添加点击事件
        rt.onclick = function () {
          window.location.reload();
        }
      }
      // 获得砖块的颜色 rgb ===>>> 随机颜色;random() = 随机数方法
      function getColor() {
        let r = Math.floor(Math.random() * 256);
        let g = Math.floor(Math.random() * 256);
        let b = Math.floor(Math.random() * 256);
        return "rgb(" + r + "," + g + "," + b + ")";
      }
      // 实现小球上下左右不断移动
      function ballMove() {
        ball = document.getElementsByClassName("ball")[0];
        interId = setInterval(function () {
          // 左边(X轴方向)的移动速度
          lf = ball.offsetLeft + speedX;
          // 上边(Y轴方向)的移动速度
          tp = ball.offsetTop + speedY;
          // 用for(){}循环实现小球与砖块碰撞后从而消失
          for (let i = 0; i < bricks.length; i++) {
            let bk = bricks[i];
            // if进行判断,判断小球与砖块接触 【若:接触到:面板的宽度:offset ===>>> 抵消的意思,使它/2,简单的说就是:X轴=宽,Y轴=高,边距:上边offsetTop;左边offsetLeft.从什么地方反回到某一个地方接触一次则记为碰撞一次,从而进行让砖块抵消】
            if ((lf + ball.offsetWidth / 2) >= bk.offsetLeft && (lf + ball.offsetWidth / 2) <= (bk.offsetLeft + bk.offsetWidth) && (bk.offsetTop + bk.offsetHeight) >= ball.offsetTop) {
              // 执行时 = none时 ===>>> 消失 
              bk.style.display = "none";
              // Y轴的移动速度
              speedY = 5;
              // 小球与砖块碰撞抵消后,分数+1(n++)
              n++;
              score.innerHTML = "分数:" + n;
            }
          }

          if (lf < 0) {
            speedX = -speedX;
          }
          if (lf >= (gameArea.offsetWidth - ball.offsetWidth)) {
            speedX = -speedX;
          }
          if (tp <= 0) {
            speedY = 5;
          } else if ((ball.offsetTop + ball.offsetHeight) >= flap.offsetTop && (ball.offsetLeft + ball.offsetWidth / 2) >= flap.offsetLeft && (ball.offsetLeft + ball.offsetWidth / 2) <= (flap.offsetLeft + flap.offsetWidth)) {
            speedY = -5;
          } else if (ball.offsetTop >= flap.offsetTop) {
            // 游戏结束
            gameOver();
          }
          ball.style.left = lf + 'px';
          ball.style.top = tp + "px";
          // 让小球移动是时间参数随便给
        }, 40)
      }

      //判断游戏是否结束
      function gameOver() {
        // 弹框提示游戏该结束
        alert("游戏结束!" + "\n" + score.innerHTML);
        // 清除间隔
        clearInterval(interId);
      }
    }
  </script>

总结

以上所述是小编给大家介绍的用JS实现一个简单的打砖块游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
Jan 16 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
Jun 19 Javascript
JavaScript获取对象在页面中位置坐标的方法
Feb 03 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
Dec 11 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
从0搭建vue-cli4脚手架
Jun 17 Javascript
js消除图片小游戏代码
Dec 11 #Javascript
详解vue中$nextTick和$forceUpdate的用法
Dec 11 #Javascript
基于jQuery实现可编辑的表格
Dec 11 #jQuery
jQuery实现可编辑的表格
Dec 11 #jQuery
vue element自定义表单验证请求后端接口验证
Dec 11 #Javascript
详解如何在JS代码中消灭for循环
Dec 11 #Javascript
Angular封装表单控件及思想总结
Dec 11 #Javascript
You might like
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Python面向对象封装操作案例详解
2019/12/31 Python
python基于property()函数定义属性
2020/01/22 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
安全标准化实施方案
2014/02/20 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
项目经理任命书
2014/06/04 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
MSSQL基本语法操作
2022/04/11 SQL Server