当前位置:首页 > 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和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php 实现登录

php 实现登录

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

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…