2013-05-18 2 views
1

어떤 이유로 든 수정 한 코드가 제대로 작동하지 않는 것 같습니다. 디버깅 할 때 예외 오류가 없었지만 원래 코드 (목록)와 동일하게 작동하지 않습니다. 즉, 업데이트되지 않는 것입니다. 작동C# 스택이 업데이트되지 않음

내 원래의 코드 (사용 목록) :

여기
private List<Gem> gems = new List<Gem>(); 
    private List<Enemy> enemies = new List<Enemy>(); 

    private void UpdateGems(GameTime gameTime) 
    { 
     for (int i = 0; i < gems.Count; ++i) 
     { 
      Gem gem = gems[i]; 

      gem.Update(gameTime); 

      if (gem.BoundingCircle.Intersects(Player.BoundingRectangle)) 
      { 
       gems.RemoveAt(i--); 
       OnGemCollected(gem, Player); 
      } 
     } 
    } 

내 수정 된 코드는 아무튼있는 스택리스트를 교체거야 나는 문제를 일으키는 생각 코드의 영역으로 내려 대상으로 한 올바르게 작동하지 않습니다.

private Stack<Gem> gems = new Stack<Gem>(); 
    private Stack<Enemy> enemies = new Stack<Enemy>(); 

    private void UpdateGems(GameTime gameTime) 
    { 
     for (int i = 0; i < gems.Count; ++i) 
     { 
      Gem gem = gems.Peek(); 


      gem.Update(gameTime); 


      if (gem.BoundingCircle.Equals(Player.BoundingRectangle)) 
      { 
       gems.Pop(); 

       OnGemCollected(gem, Player); 
      } 
     } 
    } 

아이디어가 있으십니까?

+0

"올바르게 작동하지 않음"이란 무엇을 의미합니까? –

+0

죄송합니다. 업데이트하지 않는 것 같습니다. – Katie

+0

# 1에는 gem.BoundingCircle.Intersects가 있고 # 2에는 gem.BoundingCircle.Equals가 있습니다. 동일한 결과를 얻는 것 이외에는. – m0s

답변

1

나는 당신이 필요로 정확히 모르겠지만 루프는 좀 이상 보이는 : 첫 번째 차례에서 스택에서하지 pop() 아무것도 할 경우, peek() 항상 같은 요소를 반환합니다. 스택 데이터 구조가 인덱싱되지 않습니다., 마지막으로 밀어 넣은 요소을 팝업/보이기 만하면됩니다. 목록의 코드는 실제로 목록의 모든 요소를 ​​검사하기 때문에 달라집니다.

+0

감사합니다. 내 문제는 스택 데이터 구조를 색인화 할 수있는 방법이라고 생각합니다. – Katie

+0

@Katie 데이터 구조 정의에 따라 스택을 인덱싱 할 수 없습니다. –

1

스택에서 무언가를 팝하면 정의 된 마지막 항목이 제거됩니다. 이 때문에 당신은 Gem 개체를 컬렉션에서 확인하고 제거하는 순서를 바꿨습니다. 과 에 체크하면 Stack<Gem> 버전을 체크인합니다. 사용자는 컬렉션에있는 첫 번째 항목을 확인하지 않습니다. List<Gem> 버전.

목록은 어느 방향으로나 반복 할 수 있습니다. 적절한 방식으로 인덱서를 조정하십시오. Stack은 LIFO (마지막 입출력)이므로 추가 된 마지막 항목에만 액세스 할 수 있습니다.

+0

Stack 버전에서 어떻게 체크 할 수 있는지에 대한 예제를 제공해 줄 수 있습니까? – Katie

+0

@Katie와 같은 순서로 검사를 받으려면 목록의 반복 횟수를 뒤집어야합니다.'int i = gems.Count - 1; i> = 0; i -'. 스택을 뒤집을 수는 없습니다. LIFO (Last In, First Out)입니다. 어쩌면 스택이 당신의 요구에 맞지 않을 수 있습니까? – slugster

0

피크 메서드를 호출 할 때 해당 항목에 대한 참조를 스택 컬렉션의 맨 위에 보관할 수 있다고 생각합니다. 팝 메서드를 호출했을 때. 제대로 작동하지 않을거야.

+0

잘 모르겠습니다. 예제를 제공해 줄 수 있습니까? – Katie

+0

이 스레드에서 아래 코드를 참조하십시오. – Billy

0

나는 당신의 예제를 복사 그것은 잘 작동

class Program 
    { 
     private static Stack<Gem> gems = new Stack<Gem>(); 
     private Stack<Enemy> enemies = new Stack<Enemy>(); 
     static void Main(string[] args) 
     { 
      gems.Push(new Gem 
       { 
        BoundingCircle = new BoundingCircle 
         { 
          Name = "abc" 
         } 
       }); 

      gems.Push(new Gem 
      { 
       BoundingCircle = new BoundingCircle 
       { 
        Name = "def" 
       } 
      }); 

      UpdateGems(new GameTime()); 
     } 

     private static void UpdateGems(GameTime gameTime) 
     { 
      for (int i = 0; i < gems.Count; ++i) 
      { 
       Gem gem = gems.Peek(); 


       gem.Update(gameTime); 


       if (gem.BoundingCircle.Equals(Player.BoundingRectangle)) 
       { 
        gems.Pop(); 

        OnGemCollected(gem, null); 
       } 
      } 
     } 

     private static void OnGemCollected(Gem gem, Player player) 
     { 

     } 
    } 

    public class Gem 
    { 
     public void Update(GameTime gameTime) 
     { 

     } 

     public BoundingCircle BoundingCircle { get; set; } 
    } 

    public class Enemy 
    { 

    } 

    public class GameTime 
    { 

    } 

    public class BoundingCircle : Bounding 
    { 
     public override bool Equals(object obj) 
     { 
      var temp = (Bounding) obj; 
      return Name.Equals(temp.Name, StringComparison.InvariantCulture); 
     } 
    } 

    public class Player 
    { 
     static Player() 
     { 
      BoundingRectangle = new BoundingRectangle 
       { 
        Name = "def" 
       }; 
     } 

     public static BoundingRectangle BoundingRectangle { get; set; } 
    } 

    public class BoundingRectangle : Bounding 
    { 

    } 

    public abstract class Bounding 
    { 
     public string Name { get; set; } 
    } 

다음과 같이 콘솔 응용 프로그램에 넣을 수 있습니다. 당신의 Equals 함수는 BoundingCircle 클래스에 의해 오버라이드되어야한다는 것에주의하십시오.

관련 문제