Vue3 实现随机抽奖(分类、概率控制)

假设我今天对于吃正餐还是小吃很纠结,始终确定不下来😣😣。然后又不是很想花太多钱吃一顿饭😌😌。于是我就做了下面这个和抽奖一样的东西,抽到啥吃啥😅😅。因为价钱的原因。正餐我给的probability是20,小吃是80。 我是这样认为的。比如一个盒子里面有100张纸。20纸上面写着我的正餐,剩下的都是小吃,那我抽中的概率就是20%🌟🌟🌟🌟。实现的思路如下。

100张纸的实现代码如下 👇 👇 👇 👇逻辑很简单,概率加起来等于100,把20的概率循环20次放入盒子里面,接着80的概率循环80次放入盒子里面。

// 首先将概率值分别存入数组中 20% 就是100个里面有20个
let probabilityArray: { name:string, index: number}[] = []
state.prize.forEach((item: Prize, i: number) => {
  for (let index = 0; index < item.probability; index++) {
    probabilityArray.push({
      name: item.name,
      index: i
    })
  }
})

完整的代码 👇 👇 👇 👇

代码里面我做了一个延迟输出的效果,越到后面时间越长,为了达到一个缓慢结束的效果,我没有做任何样式,需要的效果可以增加一些酷炫的样式,比如一张张纸滚动起来,那效果就更明显了。

代码中还用到了一个~~的运算符。对于数字来说,它就是一个取整的效果。不是四舍五入。比如4.1和4.8它都会取整数4作为输入结果。

<template>
   <div class="ts-prize">
    <div>
      <span>当前抽取的奖励:</span>
      <span>{{ finalName || '请点击开始抽取!' }}</span>
    </div>
     <el-button @click="startExtraction" type="primary" size="large">开始抽取</el-button>
  </div>
</template>

<script lang='ts'>

type Prize = {
  name: string
  probability: number
  list: string[]
}

export default defineComponent({
  setup() {
    // prize 目前的分类
    const state = reactive({
      prize: [
        {
          name: '正餐',
          probability: 20, // 概率就是20%
          list: [
            '太小食堂',
            '飞扬铁板烧',
            '泰爽·金',
            '太食獣茶餐厅',
            '添發冰厅',
            '友丁烧锅',
            '空之介寿喜烧',
            '椰凰·椰子鸡',
          ]
        },
        // 随便吃点 概率就是80%
        {
          name: '随便吃点',
          probability: 80,
          list: [
            '青椒巷·脑花面',
            '和府捞面',
            '味千拉面',
            '云婆婆·盐津燃面',
            '西贝筱面村',
            '袁记云饺',
            '王氏现捞',
            '庙东排骨',
          ]
        }
      ] as Prize[],
      finalName: '' as string // 抽到的名字
    })

    const startExtraction = () => {
      // 首先将概率值分别存入数组中 20% 就是100个里面有20个
      let probabilityArray: { name:string, index: number}[] = []
      state.prize.forEach((item: Prize, i: number) => {
        for (let index = 0; index < item.probability; index++) {
          probabilityArray.push({
            name: item.name,
            index: i
          })
        }
      })
      // 抽出大类
      const parent = probabilityArray[~~(Math.random() * probabilityArray.length)].index
      for (let i = 0; i <= 50; i++) {
        // 循环50次 并且每一次都不断的增加一个延迟 然后末尾有一个缓慢出现的效果
        (function (delay) {
          setTimeout(() => {
            let random:number = Math.ceil(Math.random() * (state.prize[parent].list.length - 1));
            if (delay == 50) {
              state.finalName = state.prize[parent].list[random]
            } else {
              state.finalName = state.prize[parent].list[random]
            }
          }, (150 + i) * i);
        })(i)
      }
    }

    return {
      ...toRefs(state),
      startExtraction,
    }
  }
})
</script>

<style lang="scss" scoped>
.ts-prize {
  width: 100%;
  height: 100%;
  font-size: 18px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  > * {
    margin-bottom: 10px;
  }
  div {
    width: 300px;
    text-align: center;
    display: flex;
    justify-content: space-between;
  }
  .el-button {
    width: 300px;
    font-size: 18px;
    letter-spacing: 16px;
    cursor: pointer
  }
}

</style>

我是Etc.End。如果文章对你有所帮助,能否帮我点个免费的赞和收藏😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue2实现魔盒抽奖可以通过以下步骤进行: 1. 创建一个Vue组件,命名为LuckyBox。在模板中使用div元素来表示魔盒,并设置一个点击事件。 2. 在data属性中定义一个布尔值isClicked,初始值为false,用于控制魔盒的状态。 3. 在methods属性中定义一个方法handleClick,用于处理魔盒点击事件。在该方法中,将isClicked的值设为true。 4. 在computed属性中定义一个计算属性showPrize,根据isClicked的值来返回不同的结果。当isClicked为false时,返回一个默认提示;当isClicked为true时,返回抽奖获奖信息。 5. 在LuckyBox组件中使用v-bind指令将showPrize绑定到魔盒上,以展示不同的内容。 下面是一个简单的示例代码: ```html <template> <div> <div class="lucky-box" :class="{ active: isClicked }" @click="handleClick"> 点击抽奖 </div> <div class="prize">{{ showPrize }}</div> </div> </template> <script> export default { data() { return { isClicked: false }; }, methods: { handleClick() { this.isClicked = true; } }, computed: { showPrize() { return this.isClicked ? '恭喜你获得一等奖!' : '点击抽奖'; } } }; </script> <style> .lucky-box { width: 200px; height: 200px; background-color: #ccc; display: flex; align-items: center; justify-content: center; cursor: pointer; } .lucky-box.active { background-color: #ff0000; } .prize { margin-top: 20px; text-align: center; } </style> ``` 在上述代码中,通过绑定isClicked的值来控制魔盒的状态。点击魔盒时,isClicked的值会变为true,同时计算属性showPrize的返回值也会发生变化,从而展示不同的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Etc.End

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值