扎金花游戲 PHP 實現代碼之大小比賽
程序離不開算法,在前面的博客當中,其實我們已經討論過尋路的算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選一個算法,就是說要把這個唯一的路徑選出來,怎么選呢?
還記得上初中的時候經常下午放學就躲在路邊扎金花來賭*錢,貌似還上癮了,現在過年的時候還經常一起扎金花賭*錢,但運氣不啥好,每次都是輸啊。
今天陽光明媚,由于清明節才出去玩了,所以今天沒有去哪。閑著沒事就想了下怎么用程序實現金花中兩幅牌的大小比較,現在把它實現了,有些方法還是蠻重要的,因此就記下來。
好了,不廢話了。
扎金花兩副牌的比較規則就不說了,注明一下是順子的時候 : JQK < A23 < QKA
思路:扎金花(http://www.a8u.net/)
1" 隨機生成兩幅牌,每副牌結構為
[php] view plaincopyprint?
array(??????array('Spade','K'),??????array('Club','6'),??????array('Spade','J'),??)??
array(array('Spade','K'),array('Club','6'),array('Spade','J'),
)
2” 計算每副牌的分值:每副牌有個原始大小(即排除對子,順子,金花,順金,筒子的大小),再
??? 每張牌的分值為一個2位數,不足2位的補前導0,例如'A':14,‘10’:10,’2‘:’02‘,’k‘:13,’7‘:07
??? 將3張牌按點數大小排序(從大到小),湊成一個6位數。例如’A27':140702,‘829’:090802,‘JK8’:131108,‘2A10’:141002
??? 例外,對于對子要將對子的位數放在前兩位(后面會看到為什么這么做)。例如‘779’:070709,‘7A7’:070714,‘A33’:030314
?? 現在的分值是一個6位數,將對子設為一個原始值加上10*100000的值,現在為一個7位數。例如‘779’:1070709,‘7A7’:1070714,‘A33’:1030314
?? 對于順子,將結果加上20*100000.。例如‘345’:2050403,‘QKA’:2141312,‘23A’:2140302
?? 對于金花,將結果加上30*100000。例如‘Spade K,Spade 6,Spade J':3131106
?? 因為順金的時候其實是金花和順子的和,所以順金應該是50*10000。 例如‘Spade 7,Spade 6,Spade 8':5080706
?? 對于筒子,將結果加上60*100000。例如’666‘:6060606,’JJJ‘:6111111
3“ 比較兩幅牌的大小(用所計算的分值來比較)
就這么簡單!!
代碼如下(PHP)
[php] view plaincopyprint?
<?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);????????????????????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;??????????}????????????????????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];????????????????????if($figure[0]?==?$figure[1]?&&?$figure[0]?==?$figure[2]){??????????????$score?+=?60*100000;??????????}????????????????????if($suit[0]?==?$suit[1]?&&?$suit[0]?==?$suit[2]){??????????????$score?+=?30*100000;??????????}????????????????????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);????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
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;}//補齊前導0for($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*100000if($figure[0] == $figure[1] && $figure[0] == $figure[2]){$score += 60*100000;}//金花 30*100000if($suit[0] == $suit[1] && $suit[0] == $suit[2]){$score += 30*100000;}//順子 20*100000if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){$score += 20*100000;}//對子 10*100000if($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 实现代码之大小比赛的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。