2016-04-13 14 views
2

自分自身についての素早い背景。これは初めてのPHPでのコーディングです。私はコンピュータ情報システム学位を持ち、大学でC++、VB、Cobol、Javaを学んだことがあります(約15年前)。私がこれを学ぶと、何かが私に戻ってきています。乱数のグループを生成する

私はトレーディングカードゲームのカードの無作為化パックのオープンをシミュレートしようとしています。最終的な結果は4ページを印刷することになります。各ページには12枚のカード番号とそのカードに関するすべての情報が記載されます。

ステップ1: は異なる範囲から180個の乱数を生成する。ここ

は私が行う上で計画していたものです。各数字はゲーム内のカードを表します。

  • 範囲1 = 35から74(116の番号)
  • 範囲2 = 75から106(46の番号)
  • 範囲3 = 107から134(16の番号、重複なし)
  • 範囲4 = 135から142(2つの数字、重複なし)

ステップ2: は180個の数字を取り、90ペアにそれらを打破します。

ステップ3: 90ペアから、4ペアの6ペアに分割します。

ステップ4: 6組の4組から、各番号のカード情報をリストし、各セットごとに1つの印刷可能な4ページを作成します。

私は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'関数で始まり、得られた配列をシャッフルし、最初のx要素を取り出すことをお勧めしますそれ。 – CBroe

+0

90ペア(180枚)を6組4組に分割するにはどうしますか? 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)); 

、私は私が起草プロセスのOKを推測全くわからないんだけど、ランダム化が最大の問題だったと私が解決することをように私には思えましたいいよ。あなたはシャッフルが十分ではないと思われる場合は、再度、それは異なって行うことができますが、それはまた別の話だ;)

+0

ありがとう、これは多くの助けになります。私はそれをテストするために何度か実行していましたが、48枚のカードが選択されていると、116以上のものは見られません。 配列の最後の部分は次のとおりです 71 [159] => 50 [160] => 71 [161] => 67 [162] =>配列([0] => 127 [1] => 127 [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)[163] => Array([0] => 136 [ 1] => 137)) 希少で非常に珍しいですが、パックに入るようには見えません。 – DigitalFirefly

+0

あなたは正しい - すべてが追加されたら、もう一度すべてのカードをシャッフルするべきだった。今すぐチェックしてください。 – hummingBird

+0

今、レアとSRが表示されています。しかし、配列の内容を見て、私は次のことを見ています。 $カードには、180個ではなく、164個のエントリしか含まれていません。また、$ rareと$ superrareは常に$カードと$ packにまとめられます。だから、珍しい1匹のパックではなく、すべての裂け目がパックに現れます。 – 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)は1箱あたりです。箱には180枚のカードが1パックに2枚あります。私がシミュレートしようとしているドラフトは1人6パックを2回選択します。 180枚のカードのうち48枚しかドラフトされないので(プレイヤー1人につき24枚)、毎回貴重なものは16枚、スーパーレアは2枚となりません。 ここに私がシミュレートしようとしているゲームフォーマットへのリンクがあります。 http://wizkids.com/dicemasters/rainbow-draft/ – DigitalFirefly