2016-04-13 215 views
2

我自己的快速背景。这是我第一次用PHP编码。我有一个计算机信息系统学位,在大学(大约15年前)学过C++,VB,Cobol和Java,但从此以后就没有真正使用它。当我学到这些时,有些东西正在回到我身边。生成随机数组

我试图模拟交易卡游戏的随机包装纸牌的开放。最终结果将打印出4页。每个页面将列出12个卡号和卡上的所有信息。

这就是我打算做:

步骤一: 生成不同范围的180张随机数。每个数字代表游戏中的一张牌。

  • 范围1 = 35-74(116号)
  • 范围2 = 75-106(46号)
  • 范围3 = 107-134(16个数字,没有重复)
  • 范围4 = 135-142(2号,无重复)

第二步: 取180个号码和其分解成90双。

第三步: 从90对,分成4组6对。

第四步: 从4个二套共6对,列出卡信息为每个编号并打印4页,1为每套。

我已经得到尽可能创造180个随机数字。我仍在努力获得唯一的号码。我试着为我需要的数字创建数组,但是没有一个能够工作。这里是我有的最后一个工作代码,它将生成我需要的180个数字,但是,范围3和4需要修复以避免重复。

我现在有这种编码的方式,它只是在屏幕上显示数字。我应该将它们存储在数组中吗?我只是完全解决了错误的方式?

<?php 

// generate 116 common cards 
echo "Commons: " . '<br />'; 
for ($commonfeed = 0; $commonfeed < 116; $commonfeed++) { 
echo mt_rand(35, 74). '<br />'; 
} 

// generate 46 uncommon cards 
echo "Uncommons: " . '<br />'; 
for ($uncommonfeed = 0; $uncommonfeed < 46; $uncommonfeed++) { 
echo mt_rand(75, 106). '<br />'; 
} 

// generate 16 rare cards 
echo "Rares: " . '<br />'; 
for ($rarefeed = 0; $rarefeed < 16; $rarefeed++) { 
echo mt_rand(107, 134). '<br />'; 
} 

// generate 2 super rare cards 
echo "Super Rares: " . '<br />'; 
for ($superrarefeed = 0; $superrarefeed < 2; $superrarefeed++) { 
echo mt_rand(135, 142). '<br />'; 
} 

?> 
+1

不知道你的算法应该做什么,特别是什么分解成对集合应该实现 - 但是如果你想让你的初始范围外的随机数是唯一的,那么我建议你从'range'函数开始,'shuffle'得到的数组,然后从中选出第一个x元素那。 – CBroe

+0

你如何打破90对(180卡)到4对6对? 6对= 12张卡,乘以4套,你得到48张卡。 – hummingBird

+0

对不起,我应该澄清。上面的代码只是第1步。它创建了180个卡在一盒卡中。第2步将它们分成2个包。第3步模拟包的绘制。最后,是的,48张牌将被选中。所有180张卡片将不会被使用。这应该是模拟2人选秀。最终我想将其扩大到4或6. – DigitalFirefly

回答

1

这里有一个解决方案,您可以尝试:

$cards = array(); 
// get cards per range 

for($i = 0; $i < 116; $i++) { 
    // range 1: 
    $cards[] = mt_rand(35, 74); 
    // for the fun, let's also do range 2: 
    if($i < 46) { 
     $cards[] = mt_rand(75, 106); 
    } 
} 

// range 3: (and range 4) 
$rare = array(); 
$superrare = array(); 
for ($i = 107; $i <= 134; $i++) { 
    $rare[] = $i; 
    // range 4: 
    if ($i <= 114) { 
     $superrare[] = $i + 28; 
    } 
} 
shuffle($rare); 
shuffle($superrare); // not the best choice of randomness (check: http://stackoverflow.com/questions/5694319/how-random-is-phps-shuffle-function) 

$cards = array_merge($cards, array_slice($rare, 0, 16)); 
$cards = array_merge($cards, array_slice($superrare, 0, 2)); 

// shuffle everything one more time since cards have been added randomly 
// to the deck 
shuffle($cards); 

// now when we have everything in $cards - 180 of random cards, we can 
// pack them 
$pack1 = array_slice($cards, 0, 90); 
$pack2 = array_slice($cards, 90, 90); 

// always picking first n cards because they are all shuffled 
$player1Drafted = array_slice($pack1, 0, 48); 
$player2Drafted = array_slice($pack2, 0, 48); 

// print it all 
print_r(array('Player1' => $player1Drafted, 
       'Player2' => $player2Drafted)); 

最后,我不能完全肯定我猜起草过程中确定,但在我看来,随机化是最大的问题,我解决没关系。再次,如果你认为洗牌不够好,它可以做不同,但这是另一回事;)

+0

谢谢,这有助于很多。我运行了几次来测试它,但是当选择48张牌时,我没有看到116以上的东西(没有稀有或者超级稀有)。 以下是阵列的末端看起来像 71 [159] => 50 [160] => 71 [161] => 67 [162] => Array([0] => 127 [1] => 129 [2] => 115 [3] => 131 [4] => 124 [5] => 107 [6] => 132 [7] => 119 [8] => 120 [9] => 10] => 110 [11] => 126 [12] => 114 [13] => 111 [14] => 130 [15] => 108)=> 1] => 137)) 那里稀有和超级稀有,但它似乎并不像他们进入包。 – DigitalFirefly

+0

你说得对 - 我应该在添加完所有内容之后再洗牌。现在检查。 – hummingBird

+0

好的,rares和SRs现在都出现了。但是,看看数组的内容,我看到以下内容。 $卡仅包含164个条目,而不是180个。同时$ rare和$ superrare总是被集中在$ cards和$ packs中。所以不是一包罕见地出现在一个包里,所有的拉拉都出现在包里。 – DigitalFirefly

1

由于您正在学习编码(再次),我将回答使用几个指针,而不是只生成一些工作代码。

从最后一个问题开始:是的,我会将所有内容存储在数组中。这样你就可以从“输出”代码中分离“处理”代码。

你正在处理这个错误的方式吗?很难说,取决于所有的游戏机制等。但要开始轻松:是的,这是一个好的开始。

使用array_unique您可以创建一个唯一的数组,您可以在生成罕见和超级卡时使用该数组。

在游戏机制上:你确定你总是想给某人16张稀有卡牌和2张超级稀有卡牌吗?你可以做的,是创造总的“扑克牌”前面,然后选择你想要的牌数:

$number_of_cards = 5; 
$deck = [1,1,1,1,2,2,2,2,3,3,4,4,100,101,102]; 
shuffle($deck); // shuffle the cards 
$selected = array_slice($deck, 0, $number_of_cards); // select the amount of cards 

你甚至可以只使用这个使用字符串而不是整数。

+0

感谢您的回复。我会尝试用数组重写它。 至于游戏的力学。卡数(116,46,16和2)是每箱。盒子里有180张卡片,每包2张。我试图模拟的草稿将选择每人6包,两次。所以你不会每次获得16个稀有和2个超级稀有牌,因为180张牌中只有48张会被选中(每个玩家24个)。 下面是我试图模拟的游戏格式的链接。 http://wizkids.com/dicemasters/rainbow-draft/ – DigitalFirefly