我是相当新的编码PHP从头开始,我试图编码一个简单的小应用程序作为一个挑战。它的想法是获取两个。txt文件,并从这些文件中的名字中随机选择一个梦幻足球队。我相信有更短/更简单的方法可以做到我目前所做的,但我所写的在某种程度上是有效的——除了我似乎不能让它在两次拉同一玩家时重新随机化一个玩家。我哪里做错了?
到目前为止的所有代码如下:
// Goalkeeper
$f_contents_goalkeepers = file("goalkeepers.txt"); // Load the Goalkeepers Database and add it to an array
shuffle($f_contents_goalkeepers); // Shuffle the contents of the array
$randGoalkeeper = $f_contents_goalkeepers[array_rand($f_contents_goalkeepers)]; // Add a random goalkeeper to the randGoalkeeper variable
$goalkeeper = $randGoalkeeper; // Set the Goalkeeper variable to use the random goalkeeper
//
// Defender
$f_contents_defenders = file("defenders.txt"); // Load the Defenders Database and add it to an array
shuffle($f_contents_defenders); // Shuffle the contents of the array
$randDefender1 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender1 variable
$randDefender2 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender2
// If $randDefender2 is the same as $randDefender1, pick another player
if($randDefender2 == $randDefender1) {
$randDefender2 = $f_contents_defenders[array_rand($f_contents_defenders)];
}
$randDefender3 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender variable
// If $randDefender3 is the same as $randDefender2, pick another player
if($randDefender3 == $randDefender2) {
$randDefender3 = $f_contents_defenders[array_rand($f_contents_defenders)];
}
$randDefender4 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender variable
// If $randDefender4 is the same as $randDefender3, pick another player
if($randDefender4 == $randDefender3) {
$randDefender4 = $f_contents_defenders[array_rand($f_contents_defenders)];
}
$defender1 = $randDefender1; // Set the Defender variable to use the random defender
$defender2 = $randDefender2;
$defender3 = $randDefender3;
$defender4 = $randDefender4;
echo "Goalkeeper: " . ' ' . $goalkeeper . ' ' . "<br />";
echo "Defender: " . ' ' . $defender1 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender2 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender3 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender4 . ' ' . "<br />";
如果你是shuffle()
数组,你可以写你的算法在一种方式,你不必担心重新随机化。每次它被洗牌时,它的顺序都会不同——所以你可以使用数组中的第一项和第二项,它们保证是不同的。您可以使用$defenders[0]
和$defenders[1]
来取出它们,或者使用array_pop()
从数组中取出一个元素。如果您编写的代码事先不知道需要多少,这种方法特别有用,因为您不需要维护计数。只要加载你的防守者列表,shuffle()
它,并使用array_pop()
在必要时获得不同的防守者。
您可以通过让array_rand为您选择所有值来解决这个问题。
$defenders = array_rand(f_contents_defenders, 4);
现在回答你的问题,我必须先修正一个错误。$f_contents_defenders[array_rand($f_contents_defenders)]
语句没有意义。array_rand($f_contents_defenders)
的结果已经是一个值,所以不需要索引它。
一旦你解决了这个问题,你有:$randDefender1 = array_rand($f_contents_defenders);//在randDefender1变量中添加一个随机的防御者$randDefender2 = array_rand($f_contents_defenders);//添加一个随机的防御者到randDefender2
要确保你第二次得到的总是不同的,你可以这样做:
while ($randDefender1 == $randDefender2) {
$randDefender2 = array_rand($f_contents_defenders); // Add a random defender to the randDefender2
}
等等。确保你有2个以上的防守者,否则你会陷入循环。
当你去3号和4号位时,你需要像这样检查之前所有的防守者:
while ($randDefender3 == $randDefender1 || $randDefender3 == $randDefender2)
如果没有,您可以得到这样的情况:
- 后卫C
- 后卫
- 后卫C
- 后卫
我强烈建议你使用array_rand()
来抓取你的所有东西,硬汉。
更漂亮的做法:
// Goalkeeper
$f_contents_goalkeepers = file("goalkeepers.txt"); // Load the Goalkeepers Database and add it to an array
shuffle($f_contents_goalkeepers); // Shuffle the contents of the array
$randGoalkeeper = $f_contents_goalkeepers[array_rand($f_contents_goalkeepers)]; // Add a random goalkeeper to the randGoalkeeper variable
$goalkeeper = $randGoalkeeper; // Set the Goalkeeper variable to use the random goalkeeper
//
// Defender
$f_contents_defenders = file("defenders.txt"); // Load the Defenders Database and add it to an array
$def_cnt = count($f_contents_defenders)-1;
if($def_cnt < 3)
die('You need 4 or more defenders');
$def_rand = array();
for($i = 0; $i < 4; ++$i)
{
$rand_numb = rand(0, $def_cnt);
while(isset($def_rand[$rand_numb]))
{
$rand_numb = rand(0, $def_cnt);
}
$def_rand[$rand_numb] = $f_contents_defenders[$rand_numb];
}
$def_rand = array_values($def_rand);
print_r($def_rand);