作者cleanwind (骨傲風清(掛網))
看板PHP
標題Re: [請益] 撲克牌依照花色排序
時間Tue Jul 10 00:02:08 2012
我有個問題,為什麼不去建一個 4*13 的 array 呢?
$cardArr[0][0]
.
.
.
$cardArr[0][12]
.
.
.
$cardArr[3][12]
接著發牌的方式利用兩個迴圈走完所有牌,
補充 XD
如果說希望 2 開始, A 結束,
可以改 index 的起始或所代表的牌。
另外更改 while 內的條件,也可以設定發牌數 < 13
更改 $playerArr 也可以設定玩家人數,
沒發到的牌會是 0 ,有發到的會是玩家的編號。
$playerArr = array(0, 0, 0, 0, 0);
for($k = 0; $k < 4; $k ++) {
for($j = 0; $j < 13; $j ++) {
while($p = rand(1, 4) && $playerArr[$p] < 13) {
$playerArr[$p] ++;
$cardArr[$k][$j] = $p;
}
}
}
這樣你發完牌就等於排完啦 XD
而且不管尿計算點數或是幹什麼我想都不會太麻煩才是!
※ 引述《liaosankai (低溫烘焙)》之銘言:
: 我試著再改寫一次程式碼,透過花色的單字英文字首取得的ord()值
: 剛好符合「黑桃>紅心>方塊>梅花」的規則,排除黑桃1的特例
: 為牌組每張牌建立排序用的權重值,並在每位玩家取得手牌之後
: 利用array_multisort()重新排序
: 當然如果能寫成類別,應該會更方便使用
: ==========================
: <?php
: $skins = array("spade","heart","diamond","club");
: $icons = array(
: "spade" => "♠",
: "heart" => "♥",
: "diamond" => "♦",
: "club" => "♣"
: );
: //建立牌組
: foreach($skins as $key => $skin){
: for($no=1;$no<=13;$no++){
: //計算權重值
: if("spade" == $skin && 1 == $no) {
: $weight = ord($skin) + 14;
: } else {
: $weight = ord($skin) + $no;
: }
: //新牌張
: $cards[$weight] = array(
: //權重值
: "weight" => $weight,
: //花色名稱
: "skin" => $skin,
: //花色圖示
: "icon" => $icons[$skin],
: //牌號
: "no" => $no
: );
: }
: }
: //洗牌
: srand(time());
: shuffle($cards);
: //進行發牌
: $players = array("Jack","Tom","Bill");
: $num = 5;
: foreach($palyers as $key => $name){
: $flag = array();
: for($i=0;$i<$num;$i++){
: //從牌組抽一張
: $card = array_pop($cards);
: //記錄權重參照
: $flag[] = $card["weight"];
: //分派給玩家
: $player[$name][] = $card;
: }
: //整理牌組(依照權重值)
: array_multisort($flag, SORT_DESC, $player[$name]);
: }
--
請協助連署 Steam 板,不管贊成或反對都很謝謝您!
戰略高手 遊戲, 數位, 程設
ComGame-Serv 組務 Σ戰略高手服務中心
ComGame-New 組務 ◎戰略高手群組連署專用看板
864 7/07 cleanwind ˇ [申請新板] Steam
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.101.9.24
推 liaosankai:我想說讓「玩家人數」和「發牌數」可以更彈性一點 07/10 01:39
→ liaosankai:另外考慮原PO說的大小問題,黑桃1>黑桃K 07/10 01:41
→ kerash:錯字「尿」?>//< 07/10 09:07
→ cleanwind:很明顯是「要」 XD 07/10 10:20
※ 編輯: cleanwind 來自: 120.101.9.24 (07/10 12:57)