当前位置:首页 > PHP

php实现麻将

2026-01-29 13:25:48PHP

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实现麻将

  • 使用对象代替数组存储牌型
  • 实现更高效的牌型判断算法
  • 考虑使用状态机管理游戏流程
  • 对大量牌型比较可考虑位运算优化

以上代码提供了PHP实现麻将的基础框架,实际开发中需要根据具体规则扩充功能,特别是胡牌算法需要实现多种牌型判断(平胡、七对、十三幺等)。

标签: 麻将php
分享给朋友:

相关文章

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…