2012-03-20 47 views
1

我想做一个非常简单的游戏,我有7个位置,这些位置都是隐藏的,在那里有3个获胜位置。我可以随机选择3次。我需要在每次选择后显示选秀权是否成功,并将结果存储在基础中。如何从一些中奖号码中挑选随机数字?

目前我的想法是在哪里生成第一个选号的中奖号码数组,然后选择随机数并检查它是否在获胜阵列中。

但我有一种感觉,有更有效的方式来这样做。

希望如果你使用PHP来编码的例子,但伪代码会做得很好。

编辑 我正在寻找解决这个问题的方式,而不用填充阵列赢得职位。也许有一种方法可以用权重或概率百分比来做到这一点。

就像第一次挑选我有3/7 * 100%的几率赢。保存结果到基地。 第二次挑选我有3/6 * 100或2/6 * 100%的机会赢得基础天气,我赢得了前次挑选,我从基地获得。

回答

1

修正答案:这个例子并不要求你将游戏的完整状态存储在一个变量中;相反,你只需要存储的试算,并赢得数:

$won = 0; 
for($try = 0; $try < 3; $try++) { 
    $slots = array_fill(0, 7 - $try, 0); // blank slots 
    $lucky = array_fill(0, 3 - $won, 1); // lucky slots 
    $pot = array_replace($slots, $lucky); // make some of the slots lucky 
    $win = $pot[array_rand($pot)];  // randomly pick a slot 
    $won += $win == 1;     // update won count 
    echo sprintf("Try %d: win=%d, total wins=%d\n", $try + 1, $win, $won); 
} 

原来的答复:

$pot = array(    // pot is (an associative) array; 0 = blank, 1 = win 
    "pos_1" => 0, 
    "pos_2" => 0, 
    "pos_3" => 0, 
    "pos_4" => 0, 
    "pos_5" => 0, 
    "pos_6" => 0, 
    "pos_7" => 0 
); 
$win = array_rand($pot, 3); // picks three indexes from the pot randomly 
foreach($win as $w) { 
    $pot[$w] = 1;   // set winning indicator 
} 
print_r($pot); 

输出:含盆的状态阵列。

Array 
(
    [pos_1] => 0 
    [pos_2] => 1 
    [pos_3] => 0 
    [pos_4] => 1 
    [pos_5] => 1 
    [pos_6] => 0 
    [pos_7] => 0 
) 
+0

这意味着我需要存储在基地或会话的洗牌阵列,这是我想避免的事情。 – Nick 2012-03-20 08:49:04

+0

我修改了我的答案。 – 2012-03-20 09:43:41

+0

我可以与此合作,非常感谢。 – Nick 2012-03-20 10:42:02

0

您可以保存中奖号码的位置。这样你总是可以使用[]运算符来检查它们的值。毕竟,你只是选择职位而不是数字。

更新: 这样你甚至不需要隐藏数字。很可能有更抽象的“胜利的东西” - 角色,词汇,结构。但是,不要以任何方式更改隐藏的“事物”数组,或者至少更新存储的获胜位置(如果它们保持不变),这一点很重要。如果不是这种情况,你当然需要更新已保存的获胜位置。

0
<?php 

$arr = array(true, true, false, false, false, false, false); 
shuffle($arr); 

function pick($arr, $index) { 
    return isset($arr[$index]) && $arr[$index] === true; 
} 

var_dump($arr); 
var_dump(pick($arr, 3)); 
var_dump(pick($arr, 5)); 
var_dump(pick($arr, 1)); 
+0

这意味着我需要将基本或会话中的洗牌数组存储,这是我想避免的事情。 – Nick 2012-03-20 08:48:33