模拟PHP中的交易卡



我正在为扑克手(将卡与'n'玩家交易)。我正在尝试在我的CodeIgniter中模拟卡交易功能。但是我被困了,因为所有玩家都得到了相同的卡。

这是我的模型函数:

$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
            )
    )

您已经整理了卡片,为什么不简单地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];   
}

这是因为确定要处理哪种卡在内部循环中的逻辑,玩家循环是外部。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

问题是您正在向玩家赠送卡,但从未从甲板上删除卡。

如果您想使其像普通的卡片牌一样工作,则应始终取出最高的卡片。最简单的方法是使用array_shift($deck)。它将从数组中返回第一张卡并将其删除。请参阅详细信息。

为了使其干净,我会创建一个函数draw

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

您也可以创建一个甲板类,它会更好,因为您不需要与全球变量进行混乱,但这是另一个帖子...

另外,如果您害怕表演(除非您使用几千张牌,否则没有理由会出现),则可以使用array_pop()。它可以做同样的事情,但没有拿第一张卡片,而是拿最后一张卡。不会改变太多,但明智的是,在php上会更容易。

特别感谢@taha paksu:

array_chunk()为我糟糕。我根据自己的需要进行了管理。

这是" 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];
    }
}

输出:洗牌甲板

[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
    )

玩家卡:播放器= n = 3此处

Array
    (
        [0] => Array
            (
                [0] => 2H
                [1] => 2S
            )
        [1] => Array
            (
                [0] => 6D
                [1] => 8S
            )
        [2] => Array
            (
                [0] => 3D
                [1] => KC
            )
)

最新更新