当前位置:首页 > 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实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…