当前位置:首页 > 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实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_I…

php 登录实现

php 登录实现

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

php实现静态

php实现静态

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