最近在自学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$suit);$i++){
for($j=2;$j<=9;$j++){
$cards[]=$suit[$i].$j;
}
for($k=0;$k$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$suit);$i++){
for($j=2;$j<=9;$j++){
$cards[]=$suit[$i].$j;
}
for($k=0;$k$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."的手牌为
";
$this->showCard($this->players[$i]->CardInHand);
echo "
==========
";
}
}
为了能够直观看到扑克牌而不是用字母和数字组成的符号,在程序文件夹中包含了一套所有扑克牌的图片,图片的名称按照Card类生成扑克牌的规则去设置。所以Table类中有一个方法来显示扑克牌:
private function showCard($cards){
foreach ($cards as $ca) {
$path.= "";
}
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).'
';
$k=$i+1;
echo "玩家".$k."的手牌为
";
$this->showCard($this->players[$i]->CardInHand);
echo "
==========
";
}
}
private function showCard($cards){
foreach ($cards as $ca) {
$path.= "";
}
echo $path;
}
}
==============
在主程序中按照如下代码进行调用:
include "Table.class.php";
$c=new Cards();
$table=new Table(5,$c->Cards);
即可显示5个玩家所分配到的手牌。