当前位置:首页 > 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中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现定时

php实现定时

PHP 实现定时任务的方法 PHP 本身是脚本语言,通常需要借助外部工具或框架实现定时任务。以下是几种常见方法: 使用 Cron 任务 Linux 系统自带的 Cron 是常用的定时任务工具。通过编…

php 线程实现

php 线程实现

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