当前位置:首页 > PHP

php实现麻将

2026-02-14 11:31:31PHP

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); // 庄家多一张

吃碰杠判定

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

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;
}

游戏流程控制

实现基本的游戏循环:

php实现麻将

$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 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php无法实现

php无法实现

PHP 是一种功能强大的服务器端脚本语言,能够实现多种功能,包括动态网页开发、数据库交互、文件操作等。如果遇到“无法实现”的问题,通常是由于以下原因之一: 环境配置问题 确保 PHP 环境正确安装和…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…

CSS制作麻将

CSS制作麻将

CSS制作麻将的基本思路 使用CSS制作麻将效果需要结合HTML结构和CSS样式,模拟麻将牌的视觉效果。主要通过边框、阴影、渐变等属性实现立体感,配合伪元素添加细节。 HTML结构设计 麻将牌通常包…

php 实现下载apk

php 实现下载apk

使用 PHP 实现 APK 文件下载 通过 PHP 实现 APK 文件下载的核心是设置正确的 HTTP 头信息,并输出文件内容。以下是一个完整的实现方法。 设置 HTTP 头信息 确保客户端正确识别…

php实现下载功能

php实现下载功能

PHP实现文件下载功能 使用PHP实现文件下载功能可以通过设置HTTP头信息控制浏览器行为,以下是几种常见实现方式: 基础下载方法 $file_path = '/path/to/file.p…