2012-03-20 6 views
1

私は非常にシンプルなゲームを作ろうとしています。私は7つのポジションをすべて隠していて、そこには3つのポジションがあります。私はランダムに3回選ぶことができます。ピックごとにピックが勝利したかどうかを表示し、結果をベースに格納する必要があります。いくつかの勝利数を持つポットから乱数を選ぶには?

現在のところ、私の考えでは、最初のピックに当選番号の配列を生成し、次に乱数を選択して勝利配列に含まれているかどうかを確認します。

しかし、私はそれを行うより効率的な方法があると感じています。

コード例にPHPを使用していただければ幸いですが、擬似コードも同様に機能します。

EDIT 私は、このポジションを勝ち取ったポジションで配列を取り込むことなくこれを解決する方法を探しています。おそらく、重みや確率のパーセントでこれを行う方法があります。

最初に選んだときのように、3/7 * 100%チャンスがあります。結果をベースに保存します。 2回目のピックには、前回のピックアップで獲得した天候に基づいて3/6 * 100または2/6 * 100%チャンスを得ることができます。

答えて

1

改訂された回答:この例では、ゲームの完全な状態を変数に格納する必要はありません。代わりに、あなただけのtry数と優勝回数を保存する必要があります。

$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

+0

私は私の答えを改訂しました。 –

+0

私はそれで働くことができます、ありがとうございます。 – Nick

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

関連する問題