2016-11-04 6 views
0

私のゲームの中で、同じオブジェクトを持つ配列をすべて保持しています。この配列は、この配列を使用して、スポーンされたオブジェクトのリストを追跡します。私は、コードを実行すると、今Visual Studioブレークポイントの問題

for(int i = 0; i < wildPets.Length; i++) 
{ 
    Pet pet = new Pet(); 
    wildPets[i] = pet; 
} 

それで一つだけ新しいペットを行なったし、配列(同じ名前のすべてのインデックスに割り当てられたとして、すべてのペットは、同じです、:それは基本的なコードを持っていますid、hpなど)。私はブレークポイント機能を使用して、なぜこれが起きているのかを確認しました。コードをステップ実行するとオブジェクトは常に異なりますが、ブレークポイントがないとエラーが発生します。私はブレークポイントが本当に便利な機能だと思ったが、今は自分のコードを正確に表現しているかどうかわからない。私がここで欠けているものがありますか?

public Pet() 
{ 
    Random r = new Random(); 

    type = ToType(r.Next(10)); 

    double temp = (GetHP(type, r)); 

    if (temp > 0) 
    { 
     hp5 = temp; 
    } 

    temp = (GetSpeed(type, r)); 
    if (temp > 0) 
    { 
     speed5 = temp; 
    } 

    level = r.Next(5, 16); 
    rarity = r.Next(100); 
    rarityLevel = GetRarity(); 
    DisplayImage = frmMain.petImages[petID]; 
    abilities = FillAbilities(type, abilities); 
} 

それはランダムレベル、希少性、ID、および他のものを使用して新しいペットを作る:私は

コンストラクタを投稿することができますサンプルコードを持っています。私は時計のセクションを使用しているVisual Studioです。 2つのイメージは、バックグラウンドで実行されているメソッドとその配列に含まれているメソッドを示し、ブレークポイントを設定して1行ずつステップ実行します。 1つは配列が同じID(同じものすべて、IDはちょうど注意すべき簡単な方法です)で満ちていて、もう1つはコードがどのように実行されるべきかのような、新しい異なるペットオブジェクトでいっぱいの配列を持っています。

すべて同じペット(ノーブレークポイント) enter image description here

(ブレークポイントを持つ)すべての異なるペットは enter image description here

+0

同じオブジェクトですが、このコードで実行される異なるインスタンス – Fredou

+0

オブジェクトが同じかどうかどうしてチェックしますか? – Peter

+2

私はあなたが何を求めているのか分かりません。あなたはあなたの質問やあなたのコードを詳述できますか?また、 'エラーが発生していないブレークポイントはありません' <= what error、例外またはエラーメッセージは表示されませんでした。なぜ同じであるかについては、ループがあり、配列内のすべてのアイテムに対して新しいペットを作成します。 – Igor

答えて

1

この理由は、あなたのコンストラクタたびに新たなRandomオブジェクトを作成しているということであることが呼び出されます。 Random()コンストラクタは、現在のシステム時間を使用して新しいランダムシードを生成します。デバッガでコードをステップ実行すると、連続する各呼び出しの間に十分な時間が経過し、すべてのペットに対して新しいシードが生成されます。ただし、デバッグを行わずにコードを実行すると、コードは迅速に実行され、ランダムシードは変更されません。

Randomオブジェクトの作成をコンストラクタ外に移動します。例えば:

public class Pet 
{ 
    private static readonly Random _rand = new Random(); 

    public Pet() 
    { 
     type = ToType(_rand.Next(10)); 
     // ... 
    } 
} 

あなたはコンストラクタ(またはオブジェクトを初期化する静的メソッド又はファクトリメソッドへ)へのパラメータとしてランダムシードまたは乱数オブジェクトを渡すことを検討してもよいです。これにより、必要に応じて確定的にPetオブジェクトを作成することができます。

より良い方法は、乱数生成インターフェイスを作成し、それをコンストラクタに渡して、後で乱数ジェネレータを変更したり、テスト目的で疑似乱数を生成させたりすることです。

+0

ありがとうそんなに良いキャッチがすぐに良い答えをマークする –

関連する問題