2014-01-14 3 views
0

나는 모든 너무 자주 게임 금메달 선수를주기 위해 foreach 루프를 만들고 싶어, 나는 다음과 같은 시도 :무한한 foreach 루프를 만드는 방법은 무엇입니까?

foreach (KeyValuePair<int, string> kVP in names) 
{ 
    player[kVP.Key].gold += 1; 
    continue; 
} 

하지만 그건 무한하지 않습니다. 실제로 금은 1 개 밖에 없으며 멈 춥니 다.

도움이 될 경우 namesDictionary<int, string>입니다.

나는 foreach 루프가 결코 멈추지 않는다는 것을 알지만, 나에게 어떤 금을주지 않는다.

참고 : 누구나, 나는 foreach 루프를 사용해서는 안되지만, 플레이어 []의 []에있는 ID로 플레이어를 식별하기 때문에 kVP.Key가 필요합니다. 나는 다른 루프에서 그걸 얻는 법을 모른다.

+2

거기에'continue'가있을 필요가 없습니다.'continue'에 도달하면 루프의 다음 반복으로 진행됩니다 - 마치 문장이 거기에 없었던 것처럼! (이 경우) –

+3

무한 루프가 결코 멈추지 않는다는 것을 알고 있습니까? 그게 네가 정말로 원하는거야? – Gabe

+0

이미 게임 루프가 실행 중입니까? 그것은 게임 루프와 함께 작동해야 할 것입니다. 무한 루프를 작성하는 경우에도 나머지 게임 로직을 실행하지 않고 루프 내에서 코드를 영원히 실행할 것입니다. –

답변

7

게임이 실행될 때마다 실행되어야하는 게임 루프가 있어야한다. 그 루프에서이 코드가 마지막으로 실행 된 이후로 충분히 길다면 (아마 게임 루프의 모든 반복을 실행하는 것이 아니라 N 번째 반복마다 실행하기를 원하기 때문에이 코드를 실행할 것입니다).

그리고 물론 continue;은 무의미하며 간단히 제거 할 수 있습니다. 몸체의 끝 부분에 도달하면 이미 다음 반복 단계로 진행됩니다. 당신은 중복성을 언급 할 필요가 없으며, 가독성을 넘어선 어떤 것도 상처를 입히지 않습니다. 물론


, 당신이 (이 문제가 해결되지 않는 경우에도) 요청 문자 그대로의 질문에 대답하기 위해, 여기 당신이 궁극적으로 그것을 반복하기 위해 순서에 호출 할 수있는 간단한 확장 방법 :

public static IEnumerable<T> RepeatForever<T>(this IEnumerable<T> sequence) 
{ 
    while (true) 
     foreach (var item in sequence) 
      yield return item; 
} 

따라서 당신이 쓸 수 있도록 :

foreach (KeyValuePair<int, string> kVP in names.RepeatForever()) 
{ 
    player[kVP.Key].gold += 1; 
} 

영원히 금을 계속 추가 할 수 있습니다.

3

무한한 foreach 루프를 만들 수 없습니다. foreach은 특히 컬렉션을 반복하는 데 사용됩니다.

원하는 내용이 아닌 경우 foreach을 사용하지 않아야합니다.

+1

이것은 사실이 아닙니다; 무한 시퀀스를 반복 할 수 있습니다. – Servy

+4

@Servy : 물론, 플랫폼의 특성을 사용하여 그러한 시퀀스를 생성 할 수 있습니다. 그러나 그것의 목적은 OP가 원하는 것 같지 않은 컬렉션을 통해 반복하는 것입니다. –

+0

@Servy foreach의 의도는 유한 컬렉션을 반복하는 것입니다. 여러분이 말하는 것은 기술적으로 사실이지만 foreach는 무한 루프를 만드는 데 특별히 사용되지 않습니다. – Taegost

0

foreach 루프는 여기에서 사용할 적절한 C# 구문이 아닙니다. 정의에 따르면 반복되는 컬렉션의 모든 요소에 대해 한 번 실행됩니다.

당신은 다음 중 하나를 사용하여 시도해야합니다 :()에 대한 동안() 또는이 무한 루프의 한 예입니다

1

동안} {수행

while (true) { 
    // code goes here. It will be run repeatedly, over and over, forever. 
} 

아마 아니다 그러나 당신이 주기적으로 어떤 일이 일어나길 원한다면 무엇을 원합니까? 이것은 즉시 발생하고 while 루프 내에서 코드 실행을 완료하지 마십시오.

+0

+1 표준 방식으로 질문에 대답하기 때문에 (분명히 OP는 요구되는 것을 원치 않으므로 게임의 코드에서 수행하면 안됩니다). –

0

foreachIEnumerable<>을 통과하는 데 사용됩니다. 무한 루프를 찾으려면 을 Running으로 시도해보십시오. 결국 루프를 종료 할 수있는 일종의 플래그가됩니다.

루프를 너무 빨리 실행하고 싶지 않은데, 그렇지 않으면 플레이어가 너무 부자가됩니다. 따라서 반복적으로 실행되도록하려면 지연을 루프에 추가해야합니다.

continue

while(Running) 
{ 
    await Task.Delay(TimeBetweenGoldHandouts); 

    foreach (KeyValuePair<int, string> kVP in names) 
    player[kVP.Key].gold += 1; 
} 

참고 루프의 다음 반복으로 건너하는 데 사용됩니다. 루프의 마지막 항목으로 사용 했으므로 의미가 없습니다.

+0

이것은 일반적으로 전통적인 UI 응용 프로그램에서 문제가되지 않지만 게임은 ... 다릅니다. 이 접근법은 일반적으로 비동기를 사용하는 대신 게임 루프를 사용하는 게임 플랫폼에 대해 무겁습니다. – Servy

+0

@Servy "무거운"부분은 무엇입니까? 'async/await'? 이것이 드물다면 정말 우려 할만한 사건입니까? – Andrew

+0

게임 앱에서 예, 그렇습니다. 너무 많은 "시간"기반 이벤트가 발생하여 타이머의 수 (지연이 구현되는 방법)가 시간이 지남에 따라 작업에 축적되어 문제를 일으 킵니다. 또한, 이러한 타이머는 일반적으로 게임에 대한 정밀도가 충분하지 않습니다. 이벤트 틱 빈도에 대한 제어는 기존 타이머로 얻은 수십 밀리 초 정밀도를 훨씬 넘어서 자주 제어해야합니다. – Servy

2

나는 오해가 있다고 생각합니다. foreachcontinue.

foreach은 시퀀스를 반복합니다.

foreach(var x in sequence) 
{ 
    // ... 
} 

는 기본적으로 (포기하거나 몇 가지 세부 사항을) :

continue 키워드 단지 (있는 경우) 다음 항목으로 이동
using(var iter = sequence.GetEnumerator()) 
{ 
    while(iter.MoveNext()) 
    { 
     var x = iter.Current; 
     // ... 
    } 
} 

- 그것은 while로 돌아갑니다 즉, 다시 테스트 조건.

당신은 무한히, 다음 루프하려면 다음 중 하나를

  • 무한 순서가 (while(true) 작동 것) 무한 루프가 (당신보다 더 많은 단지 컬렉션을 통해 할 수 foreach)
+0

하지만 왜 OP는 어쨌든 영원히 반복되고 싶습니까? 더 적절하게 타이머로 처리 할 수 ​​없습니까? 나는 게임 프로그래머가되었다고 공언하지 않는다. –

+0

@MichaelPerrenoud 분명히 OP는 "영원히 루프"하고 싶지 않습니다. OP에서 "모든 게임 루프에서 코드 실행"이 필요합니다. 질문에 관한 것이 아닙니다. [XY 문제] (http://meta.stackexchange.com/question/66377/what-is-the-xy-problem) –

+0

@MichaelPerrenoud 그와 같은 배경의 금광이 당신을 위해 금을 만들어 내고 있기 때문에 물건을 살 수 있습니다. 그래서 금이 무한히 생성되어야합니다. – user3105642

0

foreach 루프는 한정된 수의 요소가있는 목록을 반복합니다. 그걸 영원히 도망 치기를 원하지 않아. 이를 위해 while 또는 do 루프를 사용합니다.

아마 정확히 당신이 찾고있는 것이 아니지만 foreach를 영원히 돌리는 것이 기술적으로 가능합니다. 끝없는 열거 자 클래스를 작성하여이를 달성 할 수 있습니다. 그러나, 나는 의도적으로 생성 된 코드를 호출 할 것입니다.

관련 문제