2017-10-05 65 views
2

我正在爲撲克手(向'n'玩家發牌)發揮作用。 我想模擬我的codeigniter中的卡交易功能。但我被卡住了,因爲所有玩家都獲得相同的卡片對。模擬PHP中的交易卡

這裏是我的模型功能:

$deck = array(
    'AD', '2D', '3D', '4D', '5D', '6D', '7D', '8D', '9D', 'TD', 'JD', 'QD', 'KD', 
    'AC', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 
    'AH', '2H', '3H', '4H', '5H', '6H', '7H', '8H', '9H', 'TH', 'JH', 'QH', 'KH', 
    'AS', '2S', '3S', '4S', '5S', '6S', '7S', '8S', '9S', 'TS', 'JS', 'QS', 'KS' 
); 

shuffle($deck); 

$player_card = array(); 

$cycle = 2; 
for ($k=0; $k < $players; $k++) { 
    for ($i=0; $i < $cycle; $i++) { 
     $player_card[$k][$i] = $deck[$i]; 
    } 
} 

我得到這樣的輸出:

這是洗牌甲板:

Array 
(
    [0] => JC 
    [1] => AC 
    [2] => 4H 
    [3] => 5D 
    [4] => 3D 
    [5] => QD 
    [6] => 7H 
    [7] => 8S 
    [8] => AD 
    [9] => KD 
    [10] => 6C 
    [11] => KH 
    [12] => TS 
    [13] => 8D 
    [14] => 7S 
    [15] => 9C 
    [16] => 6D 
    [17] => 6S 
    [18] => 4S 
    [19] => KC 
    [20] => 2H 
    [21] => 9H 
    [22] => 8H 
    [23] => 2C 
    [24] => AS 
    [25] => 7C 
    [26] => 3C 
    [27] => 2D 
    [28] => QS 
    [29] => QC 
    [30] => JS 
    [31] => JH 
    [32] => 9D 
    [33] => TC 
    [34] => 3S 
    [35] => 4C 
    [36] => 2S 
    [37] => 3H 
    [38] => JD 
    [39] => 5H 
    [40] => 6H 
    [41] => AH 
    [42] => TH 
    [43] => TD 
    [44] => KS 
    [45] => 9S 
    [46] => 8C 
    [47] => 5S 
    [48] => 7D 
    [49] => 4D 
    [50] => 5C 
    [51] => QH 
) 

這是 'N' 球員卡(N = 3)

Array 
(
    [0] => Array 
     (
      [0] => JC 
      [1] => AC 
     ) 

    [1] => Array 
     (
      [0] => JC 
      [1] => AC 
     ) 

    [2] => Array 
     (
      [0] => JC 
      [1] => AC 
     ) 

) 

我想要輸出的是: 想要爲每位玩家做出基於回合的卡牌分配。

Array 
    (
     [0] => Array 
      (
       [0] => JC 
       [1] => 5D 
      ) 

     [1] => Array 
      (
       [0] => AC 
       [1] => 3D 
      ) 

     [2] => Array 
      (
       [0] => 4H 
       [1] => QD 
      ) 

    ) 
+0

不要忘了接受正確的答案。 –

回答

0

特別感謝@taha Paksu:

array_chunk() wored我。我根據自己的需要進行管理。

這裏是'N'玩家卡交易邏輯的完整模型。

class Card_model extends CI_Model { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 


    public function shuffled_deck($type, $players) 
    { 
     $noraml_deck = $deck = array(
      'AD', '2D', '3D', '4D', '5D', '6D', '7D', '8D', '9D', 'TD', 'JD', 'QD', 'KD', 
      'AC', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 
      'AH', '2H', '3H', '4H', '5H', '6H', '7H', '8H', '9H', 'TH', 'JH', 'QH', 'KH', 
      'AS', '2S', '3S', '4S', '5S', '6S', '7S', '8S', '9S', 'TS', 'JS', 'QS', 'KS' 
     ); 



     shuffle($deck); 
     $player_hand = array(); 
     if ($type === 'holdem') 
     { 

      $card_per_player = 2; 
      $chunk = array_chunk($deck, $players); 

      for ($j=0; $j < $players; $j++) 
      { 
       for ($i=0; $i < $card_per_player; $i++) 
       { 
        array_push($player_hand, $chunk[$i][$j]); 
       } 
      } 
      $player_hand = array_chunk($player_hand, $card_per_player); 

     } 

     return [$player_hand]; 

    } 
} 

OUTPUT:洗牌區

[0] => Array 
    (
     [0] => 2H 
     [1] => 6D 
     [2] => 3D 
     [3] => 2S 
     [4] => 8S 
     [5] => KC 
     [6] => JC 
     [7] => 8H 
     [8] => TD 
     [9] => 4S 
     [10] => 7C 
     [11] => KH 
     [12] => 6C 
     [13] => AC 
     [14] => 2D 
     [15] => JH 
     [16] => 7D 
     [17] => 9H 
     [18] => 8C 
     [19] => AD 
     [20] => TC 
     [21] => 9S 
     [22] => TH 
     [23] => 4C 
     [24] => 6S 
     [25] => 5S 
     [26] => 5C 
     [27] => 6H 
     [28] => 4D 
     [29] => KS 
     [30] => JD 
     [31] => KD 
     [32] => TS 
     [33] => QH 
     [34] => 5H 
     [35] => 8D 
     [36] => 9C 
     [37] => 5D 
     [38] => 3H 
     [39] => QC 
     [40] => 9D 
     [41] => 3S 
     [42] => 7H 
     [43] => QD 
     [44] => 3C 
     [45] => QS 
     [46] => AS 
     [47] => 7S 
     [48] => AH 
     [49] => 4H 
     [50] => 2C 
     [51] => JS 
    ) 

球員卡:PLAYER = N = 3這裏

Array 
    (
     [0] => Array 
      (
       [0] => 2H 
       [1] => 2S 
      ) 

     [1] => Array 
      (
       [0] => 6D 
       [1] => 8S 
      ) 

     [2] => Array 
      (
       [0] => 3D 
       [1] => KC 
      ) 

) 
3

你已經洗牌了,爲什麼不簡單地array_chunk

shuffle($cards); 
$player_card = array_chunk($cards, 13); 

http://php.net/manual/tr/function.array-chunk.php

這將輸出類似這樣:

Array 
(
    [0] => Array 
    (
     [0] => 3D 
     [1] => 7S 
     [2] => AD 
     [3] => 9C 
     [4] => 5D 
     [5] => KS 
     [6] => 4H 
     [7] => 6S 
     [8] => AS 
     [9] => TH 
     [10] => 4S 
     [11] => TS 
     [12] => 3H 
    ) 

    [1] => Array 
    (
     [0] => AH 
     [1] => 5S 
     [2] => AC 
     [3] => QS 
     [4] => 5H 
     [5] => 7D 
     [6] => JH 
     [7] => QD 
     [8] => JS 
     [9] => 9S 
     [10] => 8S 
     [11] => 6C 
     [12] => 2H 
    ) 

    [2] => Array 
    (
     [0] => TD 
     [1] => 8H 
     [2] => 5C 
     [3] => KD 
     [4] => 8D 
     [5] => QH 
     [6] => JC 
     [7] => TC 
     [8] => 3C 
     [9] => 6D 
     [10] => 9H 
     [11] => 2C 
     [12] => 2D 
    ) 

    [3] => Array 
    (
     [0] => 7C 
     [1] => KH 
     [2] => 4D 
     [3] => 9D 
     [4] => 6H 
     [5] => 7H 
     [6] => KC 
     [7] => QC 
     [8] => JD 
     [9] => 2S 
     [10] => 8C 
     [11] => 4C 
     [12] => 3S 
    ) 

) 

編輯:如果你要處理的卡片逐一給玩家;

$player_card = [[],[],[],[]]; // four players 
for($i = 0; i < count($deck); $i++){ 
    $player_card[$i % 4][] = $deck[$i]; 
} 
+0

這是比我更優雅的解決方案。 – Utkanos

+0

謝謝@taha。這真是太棒了... –

+0

不客氣。 –

1

發生這種情況,因爲邏輯確定要處理哪個卡是在內部循環,與玩家環路是外側之一。 Ergo,對於外層循環的每一次迭代,你都在爲每個玩家處理相同的牌。

更好的辦法是放棄你的初始洗牌,然後每次換一張隨機卡,然後從主陣列中移除該卡。

$num_cards_to_deal = 2; 
for ($k=0; $k < $players; $k++) 
    for ($i=0; $i < $num_cards_to_deal; $i++) { 
     $card_index = rand(0, count($deck) - 1); 
     $player_card[$k][$i] = array_values($deck)[$card_index]; 
     unset($deck[$card_index]); 
    } 

然而,這改變了原來$deck,所以你可能希望首先將它的副本在本輪只處理的使用。

$this_round_deck = $deck; 
//...then replace $deck with $this_round_deck in the above code 
+0

這也適用,但:有時會錯誤:遇到

一個PHP錯誤

嚴重性:注意

消息:未定義抵消:32

文件名:型號/ card_model.php

行號:43

陣列 ( [0] =>數組 ( [0] => 7H [1] => ) [1] =>數組 ( [0] => JH [1] => KC ) )。 看到球員1的牌2我失蹤。這很奇怪。 –

+0

已編輯,已解決。 – Utkanos

0

問題是你給玩家卡牌,但從不從卡組中移出卡牌。

如果你想讓它像普通牌組一樣工作,你應該總是拿出最頂級的牌。最簡單的方法是使用array_shift($deck)。它會從陣列中返回第一張牌並將其移除。 See details.

爲了乾淨,我會創造一個功能draw

function draw(){ 
    global $deck; 
    return array_shift($deck); 
} 

您可以創建一個平臺類也一樣,它甚至會更好,因爲你不會需要全局變量兼顧,但是這換另一個帖子...另外,如果你害怕表演(沒有理由除非你正在玩一組幾千張牌),你可以使用array_pop()來代替。它做同樣的事情,但不採取第一張卡,拿走最後一張卡。不會有太大的變化,但記憶力更好,在PHP上會更容易。

+0

你也可以使用[SplDoublyLinkedList](http://php.net/manual/en/class.spldoublylinkedlist.php)這種方式來使用next()來遍歷卡片而不移除它們,所以你可以保留整個甲板完好無損。 – Salketer