我自己的快速背景。这是我第一次用PHP编写代码。我有一个计算机信息系统学位,在大学(大约15年前)学过C ++,VB,Cobol和Java,但从那时起就没有真正使用它。当我学到这一点时,有些东西会回复给我。
我试图模拟用于交易卡游戏的随机卡片组的开头。最终结果将打印4页。每个页面将列出12个卡号,以及卡上的所有信息。
这是我计划做的事情:
第一步: 从不同范围生成180个随机数。每个数字代表游戏中的一张牌。
第二步: 取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 />';
}
?>
答案 0 :(得分: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
您甚至可以使用字符串而不是整数来使用它。
答案 1 :(得分:1)
这是您可能尝试的解决方案:
def getIndices(number, values):
'''Return a tuple (n, l) where l is a list of indices in 'values' and the
following condition holds: n + sum(values[i] for i in l) == number.
values -- sorted list of numbers
number -- sum to search for
>>> values=[10,20,20,50,100,200,200,500,1000,2000,2000,5000]
>>> getIndices(18000, values)
(6900, [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> getIndices(450, values)
(0, [6, 5, 3])
>>> getIndices(15, values)
(5, [0])
>>> getIndices(10, values)
(0, [0])
>>> getIndices(5, values)
(5, [])
>>> getIndices(0, values)
(0, [])
This simplicist algorithm does not always find a solution with 'n' == 0,
even if one exists. The following test fails, it returns (10, [2])
instead.
>>> getIndices(40, [20, 20, 30])
(0, [0, 1])
'''
n = number
l = []
for i in range(len(values) - 1, -1, -1):
if values[i] <= n:
l.append(i)
n -= values[i]
assert(n + sum(values[i] for i in l) == number)
return n, l
if __name__ == '__main__':
import doctest
doctest.testmod()
最后,我并不完全确定我认为起草过程没问题,但在我看来,随机化是最大的问题,我解决了它。同样,如果您认为 shuffle 不够好,可以采用不同的方式,但那是另一个故事;)