当前位置:首页 > PHP

php实现麻将

2026-02-14 11:31:31PHP

PHP实现麻将游戏的基本思路

麻将游戏的实现涉及多个模块,包括牌局初始化、玩家操作、胡牌判定等。以下是关键实现步骤:

麻将牌的初始化与洗牌

使用数组表示麻将牌,包含万、条、筒、风牌等类型。洗牌通过随机打乱数组实现:

php实现麻将

$tiles = [
    // 万子
    '1万', '1万', '1万', '1万', 
    '2万', '2万', '2万', '2万',
    // ...其他牌型
    '白板', '白板', '白板', '白板'
];

shuffle($tiles); // 随机洗牌

玩家发牌逻辑

初始化四个玩家,每人13张牌(庄家14张):

$players = [
    ['hand' => [], 'discarded' => []],
    ['hand' => [], 'discarded' => []],
    ['hand' => [], 'discarded' => []],
    ['hand' => [], 'discarded' => []]
];

// 发牌
for ($i = 0; $i < 13; $i++) {
    foreach ($players as &$player) {
        $player['hand'][] = array_pop($tiles);
    }
}
$players[0]['hand'][] = array_pop($tiles); // 庄家多一张

吃碰杠判定

实现基本的吃、碰、杠操作检测:

php实现麻将

function checkPong($playerHand, $discardedTile) {
    $count = 0;
    foreach ($playerHand as $tile) {
        if ($tile === $discardedTile) $count++;
    }
    return $count >= 2; // 已有两张相同牌可碰
}

function checkKong($playerHand, $discardedTile = null) {
    if ($discardedTile) {
        // 明杠
        $count = 0;
        foreach ($playerHand as $tile) {
            if ($tile === $discardedTile) $count++;
        }
        return $count === 3;
    } else {
        // 暗杠
        $tileCounts = array_count_values($playerHand);
        return in_array(4, $tileCounts);
    }
}

胡牌算法

实现基本胡牌判定(简化版):

function isWin($hand) {
    // 转换为数字便于计算
    $numericHand = convertTilesToNumbers($hand);

    // 检查七对特殊牌型
    if (checkSevenPairs($numericHand)) return true;

    // 常规胡牌检查
    return checkNormalWin($numericHand);
}

function checkNormalWin($tiles) {
    if (count($tiles) === 0) return true;

    // 尝试找将牌
    $counts = array_count_values($tiles);
    foreach ($counts as $tile => $count) {
        if ($count >= 2) {
            $newTiles = $tiles;
            // 移除将牌
            removePair($newTiles, $tile);
            // 检查剩余牌是否能组成顺子或刻子
            if (checkMelds($newTiles)) return true;
        }
    }
    return false;
}

游戏流程控制

实现基本的游戏循环:

$currentPlayer = 0; // 庄家开始
$wall = $tiles; // 剩余牌墙

while (true) {
    // 玩家摸牌
    $drawnTile = array_pop($wall);
    $players[$currentPlayer]['hand'][] = $drawnTile;

    // 检查胡牌
    if (isWin($players[$currentPlayer]['hand'])) {
        echo "Player $currentPlayer wins!";
        break;
    }

    // 玩家出牌逻辑(简化)
    $discardedTile = chooseDiscard($players[$currentPlayer]['hand']);
    $players[$currentPlayer]['discarded'][] = $discardedTile;

    // 其他玩家可吃碰杠
    // ...

    // 轮转玩家
    $currentPlayer = ($currentPlayer + 1) % 4;
}

注意事项

  1. 实际实现需要考虑更复杂的规则,如花牌、杠上开花等特殊规则
  2. 胡牌算法需要完善,考虑所有可能的牌型组合
  3. 多人联机版本需要加入网络通信模块
  4. 前端显示建议使用HTML/CSS或游戏引擎渲染牌面

完整实现需要数千行代码,建议参考开源麻将项目如php-mahjong获取更完整的实现方案。

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

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…