2016-11-04 5 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, 다른 것들과 함께 새로운 애완 동물을 만드는 : 나는

생성자를 게시 할 수있는 샘플 코드가 있습니다. 나는 시각 섹션을 사용하고 있습니다. 두 이미지는 백그라운드에서 실행되는 메소드와 배열에있는 메소드를 보여줍니다. 그리고 브레이크 포인트를 설정하고 한 줄씩 단계별로 실행합니다. 하나는 동일한 ID를 가진 애완 동물로 가득 찬 배열을 가지고 있습니다 (동일한 모든 것, ID는주의 할 수있는 빠른 방법입니다). 그리고 다른 하나는 코드가 어떻게 실행되어야하는지와 같은 새로운 다른 애완 동물 객체로 가득 찬 배열을 가지고 있습니다.

모두 같은 애완 동물 (NO 중단 점) enter image description here

(중단 점) 모두 다른 애완 동물 enter image description here

+0

동일한 개체이지만이 코드가 수행하는 다른 인스턴스 – Fredou

+0

개체가 동일한 지 어떻게 확인합니까? – Peter

+2

나는 당신이 무엇을 요구하고 있는지 전혀 모른다. 질문이나 코드를 자세히 설명해 주시겠습니까? 또한 '중단 점 오류가 발생하지 않습니다.'<= what error, 예외 또는 오류 메시지를 제공하지 않았습니다. 왜 그들이 같은지, 당신은 루프를 가지고 있으며 배열의 모든 항목에 대한 새로운 애완 동물을 만듭니다. – Igor

답변

1

그 이유는 당신이 당신의 생성자 때마다 새로운 Random 개체를 만드는 것입니다 그것 호출됩니다. Random() 생성자는 현재 시스템 시간을 사용하여 새로운 임의 시드를 생성합니다. 디버거에서 코드를 단계별로 실행할 때 각 연속적인 호출간에 충분한 시간이 지나서 모든 Pet에 대해 새로운 시드가 생성됩니다. 그러나 디버깅하지 않고 코드를 실행하면 코드가 신속하게 실행되어 임의 시드가 변경되지 않습니다.

생성자 외부에서 Random 개체의 생성을 이동합니다. 예를 들어 :

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

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

당신은 생성자 (또는 객체를 초기화 정적 방법 또는 공장 방법)에 매개 변수로 임의 화 또는 임의의 객체를 전달 고려할 수 있습니다. 이렇게하면 필요한 경우 결정적으로 Pet 객체를 만들 수 있습니다.

더 나은 방법은 난수 생성 인터페이스를 생성하고 생성자에 전달하여 난수 생성기가 나중에 변경되거나 테스트 목적으로 조롱 될 수있게하는 것입니다.

+0

와우 감사합니다. 좋은 포획이 좋은 대답을 얼마만큼 빨리 표시 할 것인가? –

관련 문제