扎金花為三張牌比大小,牌型由強至弱:
將每手牌轉換為數值分數,直接比較大小:
10 * 10000020 * 10000030 * 10000050 * 100000(金花+順子)60 * 100000<?php
class PlayCards {
public $suits = ['Spade', 'Heart', 'Diamond', 'Club'];
public $figures = ['2','3','4','5','6','7','8','9','10','J','Q','K','A'];
public $cards = [];
public function __construct() {
$cards = [];
foreach ($this->suits as $suit) {
foreach ($this->figures as $figure) {
$cards[] = [$suit, $figure];
}
}
$this->cards = $cards;
}
public function getCard() {
shuffle($this->cards);
return [array_pop($this->cards), array_pop($this->cards), array_pop($this->cards)];
}
public function compareCards($card1, $card2) {
$score1 = $this->ownScore($card1);
$score2 = $this->ownScore($card2);
if ($score1 > $score2) return 1;
elseif ($score1 < $score2) return -1;
return 0;
}
private function ownScore($card) {
$suit = $figure = [];
foreach ($card as $v) {
$suit[] = $v[0];
$figure[] = array_search($v[1], $this->figures) + 2;
}
// 補齊前導零
for ($i = 0; $i < 3; $i++) {
$figure[$i] = str_pad($figure[$i], 2, '0', STR_PAD_LEFT);
}
rsort($figure);
// 對子特殊處理:將對子點數移至前兩位
if ($figure[1] == $figure[2]) {
$temp = $figure[0];
$figure[0] = $figure[2];
$figure[2] = $temp;
}
$score = (int)($figure[0].$figure[1].$figure[2]);
// 豹子
if ($figure[0] == $figure[1] && $figure[0] == $figure[2]) {
$score += 60 * 100000;
}
// 金花
if ($suit[0] == $suit[1] && $suit[0] == $suit[2]) {
$score += 30 * 100000;
}
// 順子(含 A23 特例)
if (($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1) || implode($figure) == '140302') {
$score += 20 * 100000;
}
// 對子(非豹子)
if ($figure[0] == $figure[1] && $figure[1] != $figure[2]) {
$score += 10 * 100000;
}
return $score;
}
}
// 測試
$playCard = new PlayCards();
$card1 = $playCard->getCard();
$card2 = $playCard->getCard();
$result = $playCard->compareCards($card1, $card2);
function printCard($card) {
$str = '(';
foreach ($card as $v) { $str .= $v[0].$v[1].','; }
return trim($str, ',').')';
}
echo 'card1: '.printCard($card1).'<br/>';
echo 'card2: '.printCard($card2).'<br/>';
$str = 'card1 equit card2';
if ($result == 1) $str = 'card1 is larger than card2';
elseif ($result == -1) $str = 'card1 is smaller than card2';
echo $str;
?>
140302 對應 A(14) 2(02) 3(03) 排序後