当前位置:首页 > VUE

vue实现扑克发牌

2026-02-18 13:09:48VUE

Vue 实现扑克发牌效果

初始化扑克牌数据

创建一个包含52张扑克牌的数组,每张牌用对象表示花色和点数

data() {
  return {
    deck: [],
    players: [[], [], [], []],
    currentPlayer: 0
  }
},
created() {
  this.initDeck()
}

洗牌算法实现

使用Fisher-Yates算法对扑克牌数组进行随机排序

methods: {
  initDeck() {
    const suits = ['♥', '♦', '♠', '♣']
    const values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']

    this.deck = []
    suits.forEach(suit => {
      values.forEach(value => {
        this.deck.push({ suit, value })
      })
    })
    this.shuffleDeck()
  },

  shuffleDeck() {
    for (let i = this.deck.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1))
      ;[this.deck[i], this.deck[j]] = [this.deck[j], this.deck[i]]
    }
  }
}

发牌动画实现

使用CSS过渡和Vue的transition-group实现发牌动画效果

<template>
  <div class="poker-table">
    <button @click="dealCards">发牌</button>

    <transition-group name="deal" tag="div" class="deck">
      <div v-for="(card, index) in deck" :key="`deck-${index}`" class="card back"></div>
    </transition-group>

    <div class="players">
      <div v-for="(player, pIndex) in players" :key="`player-${pIndex}`" class="player">
        <transition-group name="player-card" tag="div">
          <div v-for="(card, cIndex) in player" :key="`player-${pIndex}-card-${cIndex}`" 
               class="card front" :style="cardStyle(card)">
            <span class="suit" :class="card.suit">{{ card.suit }}</span>
            <span class="value">{{ card.value }}</span>
          </div>
        </transition-group>
      </div>
    </div>
  </div>
</template>

发牌逻辑实现

按顺序给每位玩家发牌,每次发一张

methods: {
  dealCards() {
    if (this.deck.length === 0) return

    const card = this.deck.pop()
    this.players[this.currentPlayer].push(card)
    this.currentPlayer = (this.currentPlayer + 1) % this.players.length

    if (this.deck.length > 0) {
      setTimeout(this.dealCards, 300)
    }
  },

  cardStyle(card) {
    const color = card.suit === '♥' || card.suit === '♦' ? 'red' : 'black'
    return { color }
  }
}

CSS样式设计

添加必要的CSS样式实现扑克牌视觉效果

.poker-table {
  position: relative;
  width: 800px;
  height: 600px;
  margin: 0 auto;
  background: green;
}

.card {
  width: 100px;
  height: 150px;
  border-radius: 10px;
  position: absolute;
  transition: all 0.5s;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: 10px;
  box-sizing: border-box;
  font-size: 24px;
  font-weight: bold;
}

.back {
  background: blue;
  border: 2px solid white;
}

.front {
  background: white;
  border: 1px solid black;
}

.suit.red {
  color: red;
}

.suit.black {
  color: black;
}

.deck {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.players {
  display: flex;
  justify-content: space-around;
  position: absolute;
  bottom: 20px;
  width: 100%;
}

.player {
  width: 120px;
  height: 180px;
  position: relative;
}

.deal-move {
  transition: all 0.5s;
}

.player-card-enter-active, .player-card-leave-active {
  transition: all 0.5s;
}

.player-card-enter, .player-card-leave-to {
  opacity: 0;
  transform: translateY(30px);
}

功能扩展建议

  • 添加发牌音效增强体验
  • 实现自定义玩家数量
  • 添加发牌完成事件回调
  • 支持重新洗牌和发牌功能
  • 添加扑克牌翻转动画效果

这个实现包含了完整的扑克牌初始化、洗牌、发牌动画和视觉展示效果,可以根据需要调整动画速度和发牌规则。

vue实现扑克发牌

标签: 扑克vue
分享给朋友:

相关文章

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout()…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、G…

vue实现$.extend

vue实现$.extend

Vue 实现类似 jQuery 的 $.extend 功能 在 Vue 中实现类似 jQuery 的 $.extend 功能,可以通过多种方式完成。$.extend 主要用于合并多个对象的属性,Vue…

vue实现键盘

vue实现键盘

Vue 实现键盘功能 在Vue中实现键盘功能通常涉及监听键盘事件、处理输入以及渲染虚拟键盘界面。以下是几种常见的实现方式: 监听键盘事件 通过@keydown或@keyup指令监听键盘事件,适用于…

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…