我目前正在制作一个小游戏,需要将用户随机分配给团队。
我得到的是数据库中的表,其中列出了已登录的用户。此外,每个用户都有一个针对团队的列。
现在在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
// 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
)
)
我设法解决了您的问题。现在,您可以通过调用createTeams($playerArray);
轻松重置团队。该功能首先检查是否有均匀的玩家数量。如果真是这样,那么每支球队都会有一半的球员。否则,通过向上或向下舍入$playersPerTeam
来随机获得一名或多或少一名玩家。接下来,它会随机播放播放器数组4次以创建随机播放器列表。
[我看到有一个可接受的答案,但是我想我会在昨天晚上开始做这个工作的同时,也要在今天早上弄清楚了...