js实现斗牛
实现斗牛游戏的基本逻辑
斗牛游戏的核心是计算5张牌的点数,判断是否有"牛"以及牛的大小。牌面点数计算规则:A为1点,2-9为对应点数,10/J/Q/K为10点。任意3张牌之和为10的倍数时,剩余2张牌之和的个位数即为"牛几"(若为0则为"牛牛")。
牌组初始化与洗牌
使用数组表示一副扑克牌,包含52张标准牌(不含大小王)。通过Fisher-Yates算法实现随机洗牌。

function createDeck() {
const suits = ['♥', '♦', '♠', '♣'];
const ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];
const deck = [];
suits.forEach(suit => {
ranks.forEach(rank => {
deck.push({suit, rank});
});
});
return deck;
}
function shuffleDeck(deck) {
for (let i = deck.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[deck[i], deck[j]] = [deck[j], deck[i]];
}
return deck;
}
计算牌面点数
将牌面转换为对应的数值点数,用于后续计算。
function getCardValue(card) {
const rank = card.rank;
if (rank === 'A') return 1;
if (['10', 'J', 'Q', 'K'].includes(rank)) return 10;
return parseInt(rank);
}
判断牛的组合
遍历所有可能的3张牌组合,检查是否存在和为10的倍数的组合。

function calculateBull(cards) {
const values = cards.map(card => getCardValue(card));
// 检查所有可能的3张牌组合
for (let i = 0; i < 3; i++) {
for (let j = i + 1; j < 4; j++) {
for (let k = j + 1; k < 5; k++) {
const sum = values[i] + values[j] + values[k];
if (sum % 10 === 0) {
// 计算剩余两张牌的点数和
const remainingSum = values.reduce((acc, val, idx) =>
idx === i || idx === j || idx === k ? acc : acc + val, 0);
const bull = remainingSum % 10;
return bull === 0 ? '牛牛' : `牛${bull}`;
}
}
}
}
return '无牛';
}
完整游戏流程示例
初始化牌组、洗牌、发牌并计算结果的完整流程。
function playBullGame() {
const deck = shuffleDeck(createDeck());
const playerCards = deck.slice(0, 5);
const result = calculateBull(playerCards);
console.log('玩家牌组:', playerCards);
console.log('计算结果:', result);
return {
cards: playerCards,
result: result
};
}
// 示例调用
playBullGame();
高级功能扩展
可以添加更多游戏功能,如多玩家支持、下注系统、特殊牌型判断等。
function compareResults(result1, result2) {
const bullMap = {
'无牛': 0,
'牛1': 1,
// ...其他牛等级
'牛牛': 10
};
return bullMap[result1] > bullMap[result2] ? 1 :
bullMap[result1] < bullMap[result2] ? -1 : 0;
}
注意事项
- 牌面显示可以使用更友好的格式,如"♥A"表示红桃A
- 实际应用中应考虑前端显示与后端逻辑分离
- 多人游戏时需要同步各玩家的牌组状态
- 可以添加动画效果增强用户体验






