用 uniapp 制作一个色觉测试小游戏

为了让自己有个额外变现的途径,制作了一个色觉测试小游戏然后加到了自己的小程序中。这不是那种枯燥的医学测试,而是一个既能测试色觉又充满趣味性的小游戏。玩家需要在一堆相似的色块中找出与众不同的那一个,听起来简单,但随着关卡的推进,难度会逐渐增加,相信能让不少人欲罢不能!

游戏界面设计

首先来看看这个颜值爆表的游戏界面。整体采用了清新的渐变背景配色,再加上毛玻璃效果的游戏区域,看着就让人心情愉悦:

css 复制代码
.container {
  min-height: 100vh;
  background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  padding: 20px;
}

.game-area {
  background: white;
  border-radius: 20px;
  padding: 20px;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}

头部信息区域巧妙地展示了得分和倒计时,这个进度条的动画效果简直不要太舒服:

vue 复制代码
<view class="header">
  <view class="score-board">
    <text class="score-value">{{ score }}</text>
  </view>
  <view class="timer">
    <text class="timer-value">{{ timeLeft }}s</text>
    <view class="progress-bar">
      <view class="progress" :style="{ width: `${(timeLeft/totalTime) * 100}%` }"></view>
    </view>
  </view>
</view>

游戏核心逻辑

这个游戏最有意思的部分就是色块的生成逻辑。随着关卡提升,色差会越来越小,考验玩家的色觉灵敏度:

javascript 复制代码
generateColors() {
  const baseHue = Math.random() * 360
  const baseSaturation = 70 + Math.random() * 20
  const baseLightness = 50 + Math.random() * 20
  
  // 这里的难度计算很巧妙,越到后面色差越小
  const difficulty = Math.max(20 - this.currentLevel, 5)
  const differentHue = baseHue + (Math.random() > 0.5 ? difficulty : -difficulty)
  
  const baseColor = `hsl(${baseHue}, ${baseSaturation}%, ${baseLightness}%)`
  const differentColor = `hsl(${differentHue}, ${baseSaturation}%, ${baseLightness}%)`
  
  // 随机放置不同的色块
  const totalBlocks = this.gridSize * this.gridSize
  this.differentIndex = Math.floor(Math.random() * totalBlocks)
  
  this.currentColors = Array(totalBlocks).fill(baseColor)
  this.currentColors[this.differentIndex] = differentColor
}

每过几关,游戏还会增加色块数量,让玩家措手不及:

javascript 复制代码
nextLevel() {
  this.currentLevel++
  if (this.currentLevel % 3 === 0) {
    this.gridSize = Math.min(this.gridSize + 1, 6)
  }
  this.generateColors()
}

交互体验

游戏的交互体验做得相当到位。点击色块时会有一个轻微的缩放效果,给人很好的触感反馈:

css 复制代码
.color-block {
  aspect-ratio: 1;
  border-radius: 10px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  transition: transform 0.2s ease;
}

.color-block:active {
  transform: scale(0.95);
}

游戏结束时的弹窗效果也是满满的仪式感:

vue 复制代码
<view class="game-over-screen">
  <view class="result-card">
    <text class="final-score">最终得分: {{ score }}</text>
    <view class="stats">
      <view class="stat-item">
        <text class="stat-label">通过关卡</text>
        <text class="stat-value">{{ currentLevel - 1 }}</text>
      </view>
      <view class="stat-item">
        <text class="stat-label">准确率</text>
        <text class="stat-value">{{ accuracy }}%</text>
      </view>
    </view>
  </view>
</view>

小彩蛋

游戏中还藏了一些有趣的细节:

  1. 点错色块不会立即结束,而是有个短暂的动画效果,给玩家一个心理缓冲。
  2. 得分计算考虑了关卡难度,越难的关卡得分越高。
  3. 准确率的计算会影响最终评价,让玩家更在意每一次选择。

技术亮点总结

这个小游戏虽然看起来简单,但用到了不少前端的高级特性:

  • HSL 色彩空间的灵活运用
  • CSS Grid 实现自适应布局
  • 优雅的动画过渡效果
  • 响应式设计适配各种屏幕

最后,别忘了在退出游戏时清理定时器,这是一个经常容易被忽略的细节:

javascript 复制代码
beforeDestroy() {
  clearInterval(this.timer)
}

给大家玩一局 (*^_^*)

相关推荐
无名之逆10 分钟前
你可能不需要WebSocket-服务器发送事件的简单力量
java·开发语言·前端·后端·计算机·rust·编程
加农炮手Jinx10 分钟前
Flutter for OpenHarmony:web_socket_channel 全平台 WebSocket 通信标准库,从原理到鸿蒙实战(3000字深度解析)
android·前端·网络·websocket·flutter·华为·harmonyos
王码码203511 分钟前
Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙
android·前端·websocket·网络协议·flutter·华为·harmonyos
柳杉11 分钟前
使用AI从零打造炫酷的智慧城市大屏(开源):React + Recharts 实战分享
前端·javascript·数据可视化
A_B_C_Q1 小时前
StringBuilder 与 StringBuffer的区别
java·前端
洋洋技术笔记1 小时前
vue3+vite+elementplus简单介绍
前端
Joker Zxc1 小时前
【前端基础(Javascript部分)】2、JavaScript的变量和数据类型
开发语言·前端·javascript
yuki_uix1 小时前
别再死记优缺点了:聊聊 REST、GraphQL、WebSocket 的使用场景
前端
We་ct2 小时前
LeetCode 173. 二叉搜索树迭代器:BSTIterator类 实现与解析
前端·算法·leetcode·typescript
weixin_395448912 小时前
main.c_0222cursor
c语言·前端·算法