扎金花遊戲 PHP 實現程式碼之大小比賽
程式離不開演算法,在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,在當時的範例圖中,可選的路徑是唯一的。我們挑選一個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?
還記得上初中的時候經常下午放學就躲在路邊扎金花來賭*錢,貌似還上癮了,現在過年的時候還經常一起扎金花賭*錢,但運氣不啥好,每次都是輸啊。
今天陽光明媚,由於清明節才出去玩了,所以今天沒有去哪裡。閒著沒事就想了下怎麼用程式實現金花中兩幅牌的大小比較,現在把它實現了,有些方法還蠻重要的,因此就記下來。
好了,不廢話了。
扎金花兩副牌的比較規則就不說了,註明一下是順子的時候: JQK
思路:扎金花(http://www.a8u.net/)
1" 隨機產生兩幅牌,每副牌結構為
[php] view plaincopyprint?
array( array('Spade','K'), array('Club','6'), array('Spade','J'), )
<?php class PlayCards { public $suits = array('Spade', 'Heart', 'Diamond', 'Club'); public $figures = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'); public $cards = array(); public function __construct() { $cards = array(); foreach($this->suits as $suit){ foreach($this->figures as $figure){ $cards[] = array($suit,$figure); } } $this->cards = $cards; } public function getCard() { shuffle($this->cards); //生成3张牌 return array(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 = array(); foreach($card as $v){ $suit[] = $v[0]; $figure[] = array_search($v[1],$this->figures)+2; } //补齐前导0 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 = $figure[0].$figure[1].$figure[2]; //筒子 60*100000 if($figure[0] == $figure[1] && $figure[0] == $figure[2]){ $score += 60*100000; } //金花 30*100000 if($suit[0] == $suit[1] && $suit[0] == $suit[2]){ $score += 30*100000; } //顺子 20*100000 if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){ $score += 20*100000; } //对子 10*100000 if($figure[0] == $figure[1] && $figure[1] != $figure[2]){ $score += 10*100000; } return $score; } } //test $playCard = new PlayCards(); $card1 = $playCard->getCard(); $card2 = $playCard->getCard(); $result = $playCard->compareCards($card1,$card2); echo 'card1 is ',printCard($card1),'<br/>'; echo 'card2 is ',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; function printCard($card) { $str = '('; foreach($card as $v){ $str .= $v[0].$v[1].','; } return trim($str,',').')'; }
以上就介绍了扎金花游戏 PHP 实现代码之大小比赛,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。