vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误,春节小游戏,新年小游戏

news/2024/7/8 0:23:55

ue新春游戏-拼手速抢车票,老规矩,体验地址:http://game.pkec.net/word-ticket/。
写这个主要是前几天群里运营老师说咋没人写抢车票的,再加上我上一篇文章上了掘金一周,听说多上几次有证书,我还没搞到过掘金证书呢,所以有点蠢蠢欲动,这个小游戏玩法与实现都很简单,创意来自于多年前上学时候,学校电脑上的小游戏——金山打字,里面有一个打英语追小偷的游戏,这里借鉴了一下,废话不多说,下面来看看是如何实现的吧。

小游戏内容较多,不重要的地方会一笔带过或者省略,如果有人对游戏中没有提到的技术感兴趣,可以在评论区提出,后续可以针对性的出文章讲解,另外文中代码仅张贴关键部分代码,如需查看完整代码:vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误述。

游戏规则
在这里插入图片描述

上面是游戏的开始界面,在下方横线处输入abandon可以开始游戏,点击右上角问号可以跳转至本文章,点击音乐可以打开声音
在这里插入图片描述

开始游戏后,上方会显示余票和剩余的单词量,余票每秒减一,单词量输对一个就少一个,哪一个先清零都会触发游戏结束,中间部分是我们需要输入的单词,下面是我们输入单词的输入框,输入正确会加载下一个单词,怎么样,规则很简单吧,下面就来看具体代码吧。
进度条
首先就是上面的进度条,进度条以前都是用的组件,我这还是第一次手写进度条,实现方式很简单,一个div套另一个div,控制里面进度条的宽度就行了
我这里在进度条里加入了文字,因为进度部分和整体部分颜色不一样,所以我们要在文字背景是白色的时候,显示绿色文字,背景是绿色的时候显示白色文字,我不太会根据背景颜色切换文字颜色,这里直接准备了两套文字,一套白色的,一套绿色的,通过定位让两个位置重合,又把其中一个放到外层div中,显示绿色,另一个放到内层div中,显示白色,当内层div逐渐变窄的时候,慢慢的隐藏白色文字,显示出下面的绿色文字,这样就实现了文字的颜色变化了。
这里注意要控制里面的文字强制不换行,要不然文字隐藏的时候会一整个一整个的消失,不好看

  <!-- 进度区 -->
  <div class="progress-wrap">
    <!-- 余票 -->
    <div class="progress">
      <p class="progress-text">余票:{{currentTicketCount}}</p>
      <div class="progress-inside" :style="{width: currentTicketCount / ticketCount * 100 + '%'}">
        <p class="progress-text">余票:{{currentTicketCount}}</p>
      </div>
    </div>
    <!-- 剩余验证码 -->
    <div class="progress">
      <p class="progress-text">剩余验证码:{{currentCodeCount}}</p>
      <div class="progress-inside" :style="{width: currentCodeCount / codeCount * 100 + '%'}">
        <p class="progress-text">剩余验证码:{{currentCodeCount}}</p>
      </div>
    </div>
  </div>
复制代码
  ticketCount: 60, // 本轮票量
  currentTicketCount: 0, // 当前票量
  codeCount: 50, // 总验证码数
  currentCodeCount: 0, // 剩余验证码数量
复制代码
/* 进度条样式 */
.progress {
  width: 100%;
  height: 20px;
  background: #fff;
  color: #24de62;
  border-radius: 20px;
  overflow: hidden;
  padding: 5px;
  position: relative;
}
.progress:first-child {
  margin-bottom: 20px;
}
.progress-inside {
  width: 100%;
  height: 100%;
  background: #24de62;
  border-radius: 20px;
  color: #fff;
  z-index: 3;
  position: relative;
  transition: width 1s linear;
  overflow: hidden;
}
.progress-inside .progress-text {
  position: inherit;
  left: 5px;
}
.progress-text {
  position: absolute;
  left: 10px;
  z-index: 2;
  white-space: nowrap;
}

复制代码
单词展示区
这个在上一篇文章中已经多次用到了,抽取问题、抽取弹幕,都是一个原理,先准备一个单词库,然后获取词库单词数,之后获取一个小于等于这个数字的随机整数,之后取这个整数下标的单词就可以了,如果想一轮游戏出现的单词不重复,那我们就用 splice ,如果不限制是否重复,我们就直接赋值就好了

<!-- 单词展示区 -->
<div class="show-wrap">
    <div class="word">{{ currentWord.word }}</div>
    <div class="mean">{{ currentWord.mean }}</div>
</div>

复制代码

wordLibrary: require('@/assets/data/word.json'), // 单词库
currentWordLibrary: [], // 当前单词库
currentWord: {}, // 当前单词

/**
 * @description: 抽取单词
 * @param {*}
 * @return {*}
 */
drawWord () {
  let dataLength = this.currentWordLibrary.length
  let randomIndex = Math.floor(Math.random() * dataLength)
  this.currentWord = this.currentWordLibrary.splice(randomIndex, 1)[0]
},

复制代码
输入框
输入框也特别简单,就是一个输入框,定位到下面,然后监听输入的值,触发相关的事件就好了

游戏玩法相关
开始游戏
开始游戏时首先判断声音是否打开,如果打开就播放背景音乐(因为游戏结束时候会自动暂停),之后就是重置各种参数,这里我们引入了一个轮数的概念,因为玩家水平高低的不同,导致有的玩家很难在一分钟内输入40(本来设置的50个,为了用户体验,优化到40)个单词,为了良好的游戏体验,我们允许玩家在失败后重新来过,并且下一轮票量+5,也就是游戏时间+5秒,每多一轮,游戏时间就会加5秒,直到用户可以打完40个单词为止。

/**
 * @description: 开始游戏
 * @param {*}
 * @return {*}
 */
startGame () {
  // 如果声音开关打开,则播放背景音乐
  if (this.audioState) {
    this.bgAudio.play()
  }
  // 改变游戏状态
  this.gameStatus = 'start'
  // 游戏轮数加一
  this.round++
  // 重置本轮游戏词库
  this.currentWordLibrary = [...this.wordLibrary]
  // 根据轮数设置游戏时间
  this.ticketCount = this.ticketCount + (this.round - 1 ) * 5
  // 重置时间
  this.currentTicketCount = this.ticketCount
  // 清空输入框
  this.wordInput = ''
  // 重置距离
  this.currentCodeCount = this.codeCount
  // 随机获取一个单词
  this.drawWord()
  // 开始检票
  this.ticketCheck()
},

复制代码
检票
检票其实就是让票数一秒减一
单词检测
单词检测就是检测下方用户输入的内容,因为我们游戏开始,重新游戏都是通过输入关键字触发的,所以这里我们不仅要判断用户输入单词是否正确,还要判断用户是否输入的关键字,当然还要控制游戏进行中不可输入关键字再次开始游戏
如果用户单词输入正确,则单词量减一,并抽取下一个单词

/**
 * @description: 单词检测
 * @param {*}
 * @return {*}
 */
wordCheck () {
  // 检测关键词
  if (this.wordInput === 'abandon' || this.wordInput === 'again') {
    if (this.gameStatus !== 'start') {
      this.startGame()
    }
  }
  // 判断是否答对
  if (this.wordInput === this.currentWord.word) {
    // 播放音效
    this.playAudio(this.dingMedia)
    // 重置输入框
    this.wordInput = ''
    // 验证码数量减一
    this.currentCodeCount-=10
    if (this.currentCodeCount <= 0) {
      this.gameOver()
      return
    }
    // 抽取下一个单词
    this.drawWord()
  }
},

复制代码
游戏结束
游戏结束分为两种情况,一种是抢到票了,一种是没抢到票,我们只需要在触发游戏结束时判断余票是否大于0就好了,大于0就是抢到了,小于0就是没抢到。

/**
 * @description: 游戏结束
 * @param {*}
 * @return {*}
 */    
gameOver () {
  if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) {
    this.$refs.wordInput.blur()
  }
  // 暂停背景音乐
  this.bgAudio.pause()
  // 清除检票定时器
  clearInterval(this.ticketCheckInterval)
  // 判断胜负
  if (this.currentTicketCount > 0) {
    // 更改胜利状态
    this.result = 'success'
    // 播放胜利音效
    this.playAudio(this.successMedia)
  } else {
    // 失败
    this.result = 'fail'
    // 播放失败音效
    this.playAudio(this.failMedia)
  }
  this.gameStatus = 'end'
},

复制代码
抢票成功

抢票失败
在这里插入图片描述

如需查看完整代码:vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误述。


http://lihuaxi.xjx100.cn/news/559485.html

相关文章

JVM垃圾回收相关算法-垃圾清除阶段

文章目录学习资料垃圾回收相关算法垃圾清除阶段标记-清除&#xff08;Mark - Sweep&#xff09;算法复制算法标记-压缩&#xff08;或标记-整理、Mark - Compact&#xff09;算法分代收集算法增量收集算法分区算法学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟…

FORM中的日历开发

Calendar是Template提供给我们的standard object.可以使我们方便的为日期型字段提供日期的选择列表. 为项指定值列表 KEY-LISTVAL触发器 calendar.show; calendar.show(SYSDATE);--显示当前时间 相关函数 calendar.show(first_date date default null) calendar.setup(new…

Airtest的UI自动化二、项目初始化

Airtest的UI自动化二、项目初始化 gitlab新建项目 公司的gitlab创建完项目之后还必须添加一个readme.md文档才会真正的创建master分支哦 然后下载到本地 添加虚拟环境 安装基础依赖 pip3 install airtest //airtest引入pip3 install allure-pytest //生成自己想要格式的…

XMLHttpRequest的基本使用

1、什么XMLHttpRequest XMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数&#xff0c;就是基于 xhr 对象封装出来的。 2、使用xhr发起GET请求 步骤…

Prometheus配合 alertmanager 使用邮箱报警

部署Prometheus 和 Alertmanager略 安装包部署prometheusGrafananode_exporter_争取不加班&#xff01;的博客-CSDN博客 prometheus监控报警部署Alertmanager_争取不加班&#xff01;的博客-CSDN博客 编辑Alertmanager配置文件 vim alertmanager/alertmanager.yml global: res…

InheritableThreadLocal原理、意义及其用法

InheritableThreadLocal可以做什么&#xff1f; 首先&#xff0c;InheritableThreadLocal也是一种ThreadLocal, 可以用于存放变量, 这个变量用于当前线程共享, 不同线程之间隔离. 有人可能会说&#xff0c;InheritableThreadLocal可以使得多个子线程共享父线程的变量。其实这…

python 切换国内镜像源

1、在windows文件管理器中输入%APPDATA%,进入C:\Users\lintianyu\AppData\Roaming的目录 2、进入pip目录,新建pip.ini文件,文件内容为:(豆瓣镜像)[global] timeout = 60 index-url = http://pypi.douban.com/simple trusted-host = pypi.douban.com其他可选镜像:http://…

MyPerf4J结合Grafana和InfluxDB采集JVM以及QPS指标

MyPerf4J结合Grafana和InfluxDB采集JVM以及QPS指标 背景 ​ 需要采集现场java程序运行的状态数据(包括JVM指标以及QPS,RPS指标等)。需要采集的方式尽可能轻量化 ​ 结合实际情况采用MyPerf4J作为Java探针&#xff0c;InfluxDB作为数据存储端&#xff0c;Grafana作为数据展示…