PHP将人员随机分配给团队

问题描述 投票:0回答:3

我目前正在制作一个小游戏,需要将用户随机分配给团队。

我得到的是数据库中的表,其中列出了已登录的用户。此外,每个用户都有一个针对团队的列。

现在在PHP中,我将所有用户存储在变量中,如下所示(var_export的输出)

array ( 0 => array ( 'ID' => '3', 'name' => 'olaf', 'team' => NULL, ), 1 => array ( 'ID' => '4', 'name' => 'Peter', 'team' => NULL, ), 2 => array ( 'ID' => '5', 'name' => 'chris', 'team' => NULL, ), 3 => array ( 'ID' => '6', 'name' => 'günther', 'team' => NULL, ), )

现在我有两个团队,红色团队和蓝色团队。我的目标是将每个人随机分配到两个团队中的一个,但是,两个团队的团队成员数量应相似(或者,如果登录的用户数量奇数,一个团队可以再有一个玩家) 。

[分配后,我将信息写入数据库。但是,我一直希望能够洗牌,然后再组新队。

已登录的用户数可以在2到50人之间变化。

到目前为止,我考虑了多种方法,例如随机选择一个介于1和sizeof(用户数组)之间的数字,然后为他分配一个团队,但是,我无法使它正常工作...

[我也this Stackoverflow帖子,但是,使用此代码,我的球队Red总是有玩家1和3或1和4,而我的团队Blue总是有玩家2和3或2和4。 1队属于红色。但是,如上所述,混合应该是完全随机的。

任何人都可以帮我解决这个问题或有个主意,我该如何设法做到这一点?

php random shuffle
3个回答
1
投票

这将是一个示例:

<?php

// just preparing the set of players for the demonstration
$numberOfPLayers = 6;
$players = [];
for ($i = 0; $i < $numberOfPLayers; $i++) {
    $players[] = [
        'id' => $i,
        'name' => sprintf("Player %d", $i + 1),
        'team' => null 
    ];
}

// here starts the actual assignment
shuffle($players);

array_walk($players, function(&$player, $index) {
    $player['team'] = $index % 2 ? "Red" : "Blue";
});

usort($players, function($a, $b) {
    return $a['id'] <=> $b['id'];
});

// just a test output of the set of players
print_r($players);

该代码段创建了一个播放器列表,您可以随便播放播放器的数量。它首先会洗牌,然后轮流交替分配团队,因此要平均分配,最后再对一组球员进行排序。

一个可能的输出是(当然取决于随机随机播放:)>

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => Player 1
            [team] => Blue
        )

    [1] => Array
        (
            [id] => 1
            [name] => Player 2
            [team] => Red
        )

    [2] => Array
        (
            [id] => 2
            [name] => Player 3
            [team] => Red
        )

    [3] => Array
        (
            [id] => 3
            [name] => Player 4
            [team] => Blue
        )

    [4] => Array
        (
            [id] => 4
            [name] => Player 5
            [team] => Red
        )

    [5] => Array
        (
            [id] => 5
            [name] => Player 6
            [team] => Blue
        )

)

1
投票

我设法解决了您的问题。现在,您可以通过调用createTeams($playerArray);轻松重置团队。该功能首先检查是否有均匀的玩家数量。如果真是这样,那么每支球队都会有一半的球员。否则,通过向上或向下舍入$playersPerTeam来随机获得一名或多或少一名玩家。接下来,它会随机播放播放器数组4次以创建随机播放器列表。


0
投票

[我看到有一个可接受的答案,但是我想我会在昨天晚上开始做这个工作的同时,也要在今天早上弄清楚了...

© www.soinside.com 2019 - 2024. All rights reserved.