php实现扑克
扑克牌生成与操作
在PHP中实现扑克牌功能通常包括生成一副标准的52张牌、洗牌、发牌等操作。以下是一个完整的实现示例:
生成一副扑克牌
$suits = ['♠', '♥', '♦', '♣'];
$values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];
$deck = [];
foreach ($suits as $suit) {
foreach ($values as $value) {
$deck[] = $value . $suit;
}
}
这段代码会生成一个包含52张牌的数组,每张牌由花色和点数组成。
洗牌功能实现
shuffle($deck);
PHP内置的shuffle()函数可以随机打乱数组顺序,实现洗牌效果。

发牌功能示例
$players = [[], [], [], []];
for ($i = 0; $i < 13; $i++) {
foreach ($players as &$hand) {
$hand[] = array_pop($deck);
}
}
这段代码将洗好的牌发给4个玩家,每人13张牌。
扑克牌排序
function sortCards($hand) {
$order = ['A'=>1, '2'=>2, '3'=>3, '4'=>4, '5'=>5, '6'=>6, '7'=>7,
'8'=>8, '9'=>9, '10'=>10, 'J'=>11, 'Q'=>12, 'K'=>13];
usort($hand, function($a, $b) use ($order) {
$aValue = $order[substr($a, 0, -1)];
$bValue = $order[substr($b, 0, -1)];
return $aValue - $bValue;
});
return $hand;
}
这个自定义排序函数可以按照扑克牌的点数从小到大排序。

计算牌面点数
function calculateHandValue($hand) {
$values = [
'A' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
'6' => 6, '7' => 7, '8' => 8, '9' => 9, '10' => 10,
'J' => 10, 'Q' => 10, 'K' => 10
];
$total = 0;
foreach ($hand as $card) {
$value = substr($card, 0, -1);
$total += $values[$value];
}
return $total;
}
这个函数可以计算一手牌的总点数,常用于21点等游戏。
对象化实现
更面向对象的实现方式:
class Card {
public $suit;
public $value;
public function __construct($suit, $value) {
$this->suit = $suit;
$this->value = $value;
}
public function __toString() {
return $this->value . $this->suit;
}
}
class Deck {
private $cards = [];
public function __construct() {
$suits = ['♠', '♥', '♦', '♣'];
$values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];
foreach ($suits as $suit) {
foreach ($values as $value) {
$this->cards[] = new Card($suit, $value);
}
}
}
public function shuffle() {
shuffle($this->cards);
}
public function deal($numCards = 1) {
return array_splice($this->cards, 0, $numCards);
}
}
这种实现方式更符合面向对象原则,便于扩展和维护。






