2012-08-25 57 views
1

我在寫一個二十一點的PHP版本。我在處理ace方面遇到了麻煩。我知道在編寫這款遊戲時這是一個特別的問題。我查看了其他人詢問的其他一些問題,但我找不到我正在尋找的內容。PHP二十一點算法算法

我認爲問題在於,一旦爲特定卡調用getValue函數,它就不會再爲該卡調用它。有沒有辦法讓它再次調用getValue函數,例如,如果你用一個ace和一個7(8或18)並且你得到一個10(將它轉換爲18或28),那麼它會再次調用getValue函數。隨着我製作的遊戲在這種情況下破產,因爲它不會再次檢查卡片以獲得總數。

代碼如下。我希望這是有道理的,我已經解釋了這個問題。

function getValue($drawn, $total){ 
    $splitter = str_split($drawn); 
    $value = $splitter[0]; 
    if($value == 'j' or $value == 'q' or $value == 'k' or $value == 1){ 
     $value = 10; 
    }else if($value == 'a' and (($total + 11) > 21)){ 
     $value = 1; 
    }else if($value == 'a' and (($total + 11) <= 21)){ 
     $value = 11; 
    }else{ 
     $value = $value; 
    } 
    return $value; 
} 

function calculateScore($cardsArray){ 
    for($i = 0; $i < count($cardsArray); ++$i){ 
     $total += getValue($cardsArray[$i]); 
    } 
    return $total; 
} 
+0

無論如何,你是否一直將a編碼爲「a」,還是有時編碼爲「1」?第四行有'或$ value == 1',這讓我懷疑後者。 – wallyk

+0

對於初學者來說,你使用1參數調用getValue,$範圍內沒有定義$ total,你的意思是「... $ value =='k'或$ value == 1 ...」,你在「 $ value = $ value;「 –

+0

該行處理存儲爲10h,10d,10s,10c的10s。 str_split只取得數組中第一個字符串的值,所以如果我沒有這樣做的話,它會算作1。 :) 哦,$ value = $值用於計數1-9,因爲它們存儲爲1d,2d,3d等,所以str_split將數字作爲值。 – nerdarama

回答

0

當你有兩個基於一套普通卡的總價值可能性時,需要「知道」是在這裏使用OOP的一個很好的理由。

你可以有一個hand職業,你交易card s,如果你的卡是ace,你知道它有兩個值。

收到一個王牌,你既可以複製你的手,跑雙手,直到結束,或者你可以寫你的handcard等級,所以$hand->getTotal()返回數組與所有可能的總數

這對於OOP來說非常簡單。

0

如果你只是想最後cardsArray的最終得分,你可以從高向低排列與rsort()進行排序,以便王牌值始終計算最後的,因此你不需要以後重新評估它。