php实现麻将
PHP实现麻将游戏的基本思路
麻将游戏涉及洗牌、发牌、摸牌、出牌、吃碰杠胡等规则。用PHP实现需要关注数据结构设计、逻辑流程和算法处理。
麻将牌型数据结构设计
使用数组表示麻将牌,包含万、条、筒、字牌等类型:
$tileTypes = [
'characters' => range(1, 9), // 万
'bamboos' => range(1, 9), // 条
'dots' => range(1, 9), // 筒
'winds' => ['east', 'south', 'west', 'north'], // 风牌
'dragons' => ['red', 'green', 'white'] // 箭牌
];
初始化牌堆
创建完整的麻将牌堆(每张牌4个副本):
function initDeck() {
global $tileTypes;
$deck = [];
foreach ($tileTypes as $type => $values) {
foreach ($values as $value) {
for ($i = 0; $i < 4; $i++) {
$deck[] = ['type' => $type, 'value' => $value];
}
}
}
shuffle($deck); // 洗牌
return $deck;
}
玩家发牌处理
模拟四人麻将发牌(每人13张):
function dealTiles(&$deck) {
$players = [
'player1' => [],
'player2' => [],
'player3' => [],
'player4' => []
];
for ($i = 0; $i < 13; $i++) {
foreach ($players as &$hand) {
$hand[] = array_pop($deck);
}
}
return $players;
}
牌型判断逻辑
判断是否胡牌的简单示例(需实现更复杂的麻将规则):
function isWin($hand) {
// 分组统计牌型
$groups = [];
foreach ($hand as $tile) {
$key = $tile['type'].'-'.$tile['value'];
$groups[$key] = ($groups[$key] ?? 0) + 1;
}
// 简单判断是否有4个三张组+1对
$triplets = 0;
$pair = 0;
foreach ($groups as $count) {
if ($count == 3) $triplets++;
if ($count == 2) $pair++;
}
return ($triplets == 4 && $pair == 1);
}
游戏流程控制
基础游戏循环结构:
$deck = initDeck();
$players = dealTiles($deck);
$currentPlayer = 'player1';
$discardPile = [];
while (true) {
// 摸牌
$drawnTile = array_pop($deck);
$players[$currentPlayer][] = $drawnTile;
// 出牌逻辑(简化)
$discardedTile = $players[$currentPlayer][array_rand($players[$currentPlayer])];
$discardPile[] = $discardedTile;
// 检查是否胡牌
if (isWin($players[$currentPlayer])) {
echo "$currentPlayer wins!";
break;
}
// 轮换玩家
$currentPlayer = 'player'.((substr($currentPlayer, -1) % 4) + 1);
}
进阶功能实现
实现吃碰杠等复杂规则需要额外数据结构:
// 记录玩家动作
$actions = [
'chow' => false, // 吃
'pong' => false, // 碰
'kong' => false, // 杠
'win' => false // 胡
];
// 处理碰牌示例
function checkPong($discardTile, $playerHand) {
$count = 0;
foreach ($playerHand as $tile) {
if ($tile['type'] == $discardTile['type'] &&
$tile['value'] == $discardTile['value']) {
$count++;
}
}
return ($count >= 2); // 已有两张相同牌可碰
}
性能优化建议
对于完整麻将游戏,建议:

- 使用对象代替数组存储牌型
- 实现更高效的牌型判断算法
- 考虑使用状态机管理游戏流程
- 对大量牌型比较可考虑位运算优化
以上代码提供了PHP实现麻将的基础框架,实际开发中需要根据具体规则扩充功能,特别是胡牌算法需要实现多种牌型判断(平胡、七对、十三幺等)。






