js实现麻将
麻将游戏实现概述
使用JavaScript实现麻将游戏需要处理洗牌、发牌、玩家操作、胡牌判定等核心逻辑。以下是关键实现步骤:
基础数据结构
麻将牌通常包含万、条、筒、字牌四类,共136张牌(部分规则使用144张)。可以用数组表示初始牌组:
const tiles = [
'1万', '2万', '3万', '4万', '5万', '6万', '7万', '8万', '9万',
'1条', '2条', '3条', '4条', '5条', '6条', '7条', '8条', '9条',
'1筒', '2筒', '3筒', '4筒', '5筒', '6筒', '7筒', '8筒', '9筒',
'东', '南', '西', '北', '中', '发', '白'
];
// 每种牌4张
const fullDeck = [...tiles, ...tiles, ...tiles, ...tiles];
洗牌算法
使用Fisher-Yates洗牌算法实现随机排序:
function shuffle(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;
}
发牌逻辑
四人麻将通常每人13张牌,庄家14张:
function dealTiles(deck) {
const players = [[], [], [], []];
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 4; j++) {
for (let k = 0; k < 4; k++) {
players[k].push(deck.pop());
}
}
}
// 最后一轮每人一张
for (let j = 0; j < 4; j++) {
players[j].push(deck.pop());
}
// 庄家多拿一张
players[0].push(deck.pop());
return { players, remainingDeck: deck };
}
胡牌算法
实现七对、平胡等常见胡牌规则:
function checkWin(hand) {
// 七对判定
if (hand.length === 14) {
const tileCount = {};
hand.forEach(tile => {
tileCount[tile] = (tileCount[tile] || 0) + 1;
});
return Object.values(tileCount).every(count => count === 2);
}
// 平胡判定(需要实现更复杂的牌型分析)
return checkStandardWin(hand);
}
前端交互
使用DOM操作或Canvas实现界面:

// 示例:创建牌元素
function createTileElement(tile) {
const div = document.createElement('div');
div.className = 'tile';
div.textContent = tile;
div.addEventListener('click', () => handleTileClick(tile));
return div;
}
完整流程示例
- 初始化牌组并洗牌
- 发牌给四位玩家
- 实现摸牌、打牌、吃碰杠等操作
- 实时检查胡牌条件
- 处理结算逻辑
性能优化建议
- 使用Web Workers处理复杂计算
- 采用对象池管理牌对象
- 使用位运算加速牌型分析
- 实现脏检查减少DOM操作
完整实现需要考虑具体麻将规则(如广东麻将、四川血战等),上述代码提供了基础框架。实际开发中还需加入网络通信模块实现多人对战功能。






