首页 > 其他分享 >js实现翻牌游戏

js实现翻牌游戏

时间:2024-08-16 13:37:49浏览次数:8  
标签:const 游戏 classList timer js boxs document card 翻牌

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
  >
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    .title {
      width: 512px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      margin: 10px auto;
    }

    html {
      --wh: 256px;
    }

    .container {
      width: 512px;
      height: 512px;
      margin: 0 auto 0;
      background-color: #eee;
      user-select: none;

    }

    @keyframes hide {
      0% {
        opacity: 1;
      }

      100% {
        opacity: 0;
      }
    }

    .card {
      position: relative;
      width: var(--wh);
      height: var(--wh);
      transform-style: preserve-3d;
      transition: all .2s;
      float: left;
      border: 1px solid #000;

      &.rotate {
        transform: rotateY(180deg);
      }

      &.hide {
        animation: hide 1s forwards;
      }

      .front {
        position: absolute;
        top: 0;
        left: 0;
        z-index: 1;
        width: 100%;
        height: 100%;
        transform: translateZ(1px);
        background-color: pink;
      }

      .after {
        position: absolute;
        top: 0;
        left: 0;
        z-index: 0;
        width: 100%;
        height: 100%;
        transform: translateZ(-1px) rotateY(180deg);
        background-color: yellow;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: calc(var(--wh) / 2)
      }
    }
  </style>
</head>

<body>
  <div class="title">
    <div class="fs">分数: 0</div>
    <div class="timeout">剩余时间: 180秒</div>
    <button
      class="restart"
      onclick="restart()"
    >重新开始</button>
  </div>
  <div class="container">
    <div class="card rotate">
      <div class="front"></div>
      <div class="after">1</div>
    </div>
  </div>


  <script>
    const container = document.querySelector('.container');
    const fsEl = document.querySelector('.fs')
    const timeout = document.querySelector('.timeout')
    let wh = 256
    let fs = 0
    let isHandle = false
    let time = 180
    let timer = null

    function setTimer() {
      timer & clearInterval(timer)
      timer = setInterval(() => {
        time--
        timeout.innerHTML = `剩余时间: ${time}秒`
        if (time <= 0) {
          clearInterval(timer)
          alert(`时间到!您的得分为${fs}`)
          restart()
        }
      }, 1000)
    }

    function fsAdd() {
      fsEl.textContent = `分数: ${fs}`
    }

    function render() {
      document.documentElement.style.setProperty('--wh', `${wh}px`)
      const num = (512 / wh) ** 2
      const temp = Array.from({ length: num / 2 }, (_, i) => i + 1)
      const list = [...temp, ...temp]

      const textContent = () => {
        const renderIndex = Math.floor(Math.random() * list.length)
        const val = list[renderIndex]
        list.splice(renderIndex, 1)
        return val
      }
      const els = document.createDocumentFragment()
      for (let i = 0; i < num; i++) {
        const card = document.createElement('div')
        card.classList.add('card')
        const front = document.createElement('div')
        front.classList.add('front')
        const after = document.createElement('div')
        after.classList.add('after')
        after.textContent = textContent()
        card.appendChild(front)
        card.appendChild(after)
        els.appendChild(card)
      }
      container.innerHTML = ''
      container.appendChild(els)
      addEvent()
    }

    render()

    function addEvent() {
      let boxs = document.querySelectorAll('.card')
      boxs.forEach(box => {
        box.addEventListener('click', () => {
          if (isHandle) return
          if (box.innerHTML === '') return
          isHandle = true
          box.classList.toggle('rotate')
          setTimeout(() => {
            checkIsDoublet()
          }, 300)
        })
      })
      setTimer()
    }


    function checkIsDoublet() {
      const boxs = document.querySelectorAll('.card.rotate')
      if (boxs.length === 2) {
        const first = boxs[0].querySelector('.after').textContent
        const second = boxs[1].querySelector('.after').textContent
        if (first === second) {
          console.log('===')

          boxs[0].classList.add('hide')
          boxs[1].classList.add('hide')
          fs += 1
          fsAdd()

          setTimeout(() => {
            boxs[0].innerHTML = ''
            boxs[1].innerHTML = ''
            boxs[0].classList.remove('rotate')
            boxs[1].classList.remove('rotate')
            checkIsAllClear()
          }, 300)
        } else {
          boxs[0].classList.remove('rotate')
          boxs[1].classList.remove('rotate')
          isHandle = false
        }
      } else {
        isHandle = false
      }
    }

    function checkIsAllClear() {
      const fronts = document.querySelectorAll('.card .front')
      console.log(fronts, 'fronts')
      if (!fronts.length) {
        console.log('重新渲染')
        timeout.innerHTML = `剩余时间: 180秒`
        wh /= 2
        container.innerHTML = ''
        timer & clearInterval(timer)
        time = 180
        render()
      }
      isHandle = false
    }

    function restart() {
      wh = 256
      fs = 0
      time = 180
      timer & clearInterval(timer)
      render()
    }
  </script>
</body>

</html>

 

标签:const,游戏,classList,timer,js,boxs,document,card,翻牌
From: https://www.cnblogs.com/fmg0224/p/18362685

相关文章

  • 关于JS里的字符表情乱码
    背景1、业务背景公司在处理业务时,需要使用socket传输字符串内容,在A处输入,在B处显示。但反馈说输入表情符号经过传输后,ios会变成问号,PC会乱码。如下情况:2、表情乱码表情符号乱码的原因通常与UTF-8编码的处理不当有关。表情符号属于Unicode中的高码点字符,需要使用4个字......
  • 基于nodejs+vue码头船只出行及配套货柜码放管理[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着全球贸易的持续增长,港口作为连接国内外市场的重要枢纽,其运营效率与管理水平直接影响到物流链的顺畅与成本效益。码头作为港口的核心区域,船只的出行安排......
  • 基于nodejs+vue码上公益平台系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,互联网已成为推动社会公益事业创新与发展的重要力量。传统公益模式在信息传播、资源调配、参与便捷性等方面面临诸多挑战,难以高效覆......
  • 基于nodejs+vue马寨工业园区招商管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着全球经济一体化的深入发展,工业园区作为区域经济发展的重要载体,其招商引资工作日益成为推动地方经济增长的关键环节。马寨工业园区作为区域经济发展的重......
  • 基于nodejs+vue码上招聘云平台[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在数字化时代,互联网技术的飞速发展正深刻改变着各行各业,招聘行业也不例外。传统招聘模式受限于地域、时间、信息不对称等因素,导致企业难以快速精准地找到合......
  • 基于 Java 的雷电(飞机大战)游戏
    点击下载源码基于java的雷电(飞机大战)游戏摘要电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明......
  • JS中【回调函数】知识点讲解
    回调函数(CallbackFunction)是JavaScript中非常重要的概念,尤其是在处理异步操作时广泛使用。回调函数是一种通过参数传递的函数,在特定的操作或事件完成后,由另一个函数调用执行。基本概念函数作为参数:在JavaScript中,函数是一等公民,可以像变量一样传递给其他函数。当......
  • 学霸带你深入了解游戏如何展现文化多样性
    欢迎加入我在CSDN的社区【纽雪澳诺加海美德】引言全球化时代的文化交融在全球化的今天,文化的界限正在变得越来越模糊。游戏,作为一种广泛传播的娱乐形式,不仅仅是消遣的工具,更是文化交流和社会理解的桥梁。通过游戏,我们可以探索不同的世界,体验多样的文化,并与全球玩家建立联......
  • 自制操作系统(七、在自制操作系统玩游戏)
    废话不多说,直接上代码[org0x7c00];定义游戏板数组board1db'','',''board2db'','',''board3db'','',''player_turndb'X';玩家'X'的回合star......
  • 用JavaScript做超级玛丽小游戏
    一、前言前几天用JS实现扫雷和贪吃蛇(通过HTML的DOM节点实现基本界面,界面背景简单,交互简单)。比较复杂的是植物大战僵尸,不同的关卡设置单独的函数。所以还比较难。超级玛丽通过canvas实现背景,交互很复杂,功能很多,JS代码完全是有汇编语言反编译成C语言,然后把C语言转换成JS实现的......