用PHP实现一个关于德州扑克算法的程序(一):发牌

最近在自学PHP,感觉PHP很灵活。通过学习PHP,把以前学习C#、java时没有弄清楚的概念都理顺了,对OOP的认识又上升了一个台阶。为了检验最近的学习成果,决定写一个德扑的算法程序。

这个程序很简单,只实现如下功能:
1、按照玩家的数量分配手牌;
2、把手牌和公牌进行组合后计算出胜负结果,以及获胜玩家和所有玩家的牌型;不考虑玩牌的过程,即没有下注这个阶段。

====以下为正文====
根据需求进行设计,至少需要三个类:
1、扑克牌类Cards
2、玩家类Player
3、牌桌类(包含核心算法逻辑)Table

====Cards类====
在德扑中不需要用到大王和小王,所以使用的牌数为52张。在本程序中红桃用H代替、梅花用C代替、黑桃用S代替、方块用D代替;点数则分别为2、3、4、5、6、7、8、9、T(10)、J、Q、K、A
以下代码创建一副扑克牌

        $cards=array();
        $suit=array("H","S","D","C");
        $p=array("T","J","Q","K","A");

        for($i=0;$i<count($suit);$i++){
            for($j=2;$j<=9;$j++){
                $cards[]=$suit[$i].$j;
            }
            for($k=0;$k<count($p);$k++){
                $cards[]=$suit[$i].$p[$k];
            }
        }
        return $cards;

这样生成的扑克牌是按顺序的,所以必须洗牌,用系统函数shuffle可以模拟实现。Cards类的目前代码如下:

class Cards{
    public $Cards=array();

    function __construct() {
        $this->Cards=$this->createCards();
        shuffle($this->Cards);
    }

    private function createCards() {
        $cards=array();
        $suit=array("H","S","D","C");
        $p=array("T","J","Q","K","A");

        for($i=0;$i<count($suit);$i++){
            for($j=2;$j<=9;$j++){
                $cards[]=$suit[$i].$j;
            }
            for($k=0;$k<count($p);$k++){
                $cards[]=$suit[$i].$p[$k];
            }
        }
        return $cards;
    }
}

====Player类====
按照德扑的规则,每个玩家手中会有2张手牌。这2张牌是随机分发的。所以这里会用到系统函数array_rand。为了便于计算胜负,Player类有一个成员属性为score用来计算玩家的得分以及一个记录玩家手牌的属性CardInHand。

初步设计的得分规则如下:
皇家同花顺 900   
同花顺   800
四条    700
满堂红   600 
同花   500 
顺子   400  
三条 300   
两对    200
一对    100
高牌 按实际最大一张牌计算

Cards类的目前代码如下:

class Player{

    public $score=0;
    public $CardInHand=array();

    function __construct($cards) {
        $this->getCardInHand($cards);
    }

    private function getCardInHand($cards){
        $randkey=array_rand($cards,2);
        $this->CardInHand[]=$cards[$randkey[0]];
        $this->CardInHand[]=$cards[$randkey[1]];
        return $this->CardInHand;
    }

}

====Table类====
当前阶段Table类实现玩家的初始化功能。在Table类的构造函数中需要设置玩家的数量。

//在参数中传递玩家的数量num,和cards数组
function __construct($num,$cards) {
        //循环初始化玩家
        for($i=0;$i<$num;$i++){
            $this->players[$i]=new Player($cards);
            //把已经分配出去的手牌从牌池中取掉,使用系统函数array_diff计算差集
            $cards=array_diff($cards,$this->players[$i]->CardInHand);            
            $k=$i+1;
            echo "玩家".$k."的手牌为<br>";
            $this->showCard($this->players[$i]->CardInHand);
            echo "<br>==========<br>";
        }

    }

为了能够直观看到扑克牌而不是用字母和数字组成的符号,在程序文件夹中包含了一套所有扑克牌的图片,图片的名称按照Card类生成扑克牌的规则去设置。所以Table类中有一个方法来显示扑克牌:

private function showCard($cards){
        foreach ($cards as $ca) {
            $path.= "<img src='./pukeImage/". $ca . ".jpg'>";
        }
        echo $path;
    }

Table类目前的代码如下:

include "Cards.class.php";
include "Player.class.php";

class Table{

    public $players=array();

    function __construct($num,$cards) {
        for($i=0;$i<$num;$i++){
            $this->players[$i]=new Player($cards);
            $cards=array_diff($cards,$this->players[$i]->CardInHand);
            //echo count($cards).'<br>';
            $k=$i+1;
            echo "玩家".$k."的手牌为<br>";
            $this->showCard($this->players[$i]->CardInHand);
            echo "<br>==========<br>";
        }

    }

    private function showCard($cards){
        foreach ($cards as $ca) {
            $path.= "<img src='./pukeImage/". $ca . ".jpg'>";
        }
        echo $path;
    }


}

==============
在主程序中按照如下代码进行调用:

include "Table.class.php";
$c=new Cards();
$table=new Table(5,$c->Cards);

即可显示5个玩家所分配到的手牌。

    原文作者:魔术师发牌问题
    原文地址: https://blog.csdn.net/naidecreation/article/details/69665899
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞