2012-01-18 2 views
4

나는 Game of Life 클론에서 일하고있다. (wiki와 연결될 수 없다. 기본적인 기능은 끝났지 만 사용자가 자신의 규칙을 정의 할 수있는 옵션을 제공하고자합니다. 생활 규칙의 표준 게임은 다음과 같습니다.동적 if 문?

2 인 또는 3 인근의 세포가 계속 살아 있습니다.

0-1 및 4-8 인접 셀이 사망합니다.

3 이웃을 가진 죽은 세포가 살아납니다.

두 개의 if 문으로는 쉽게 수행 할 수 있습니다. 그러나 사용자는 다음과 같이 정의 할 수도 있습니다.

1-3 또는 5-7 이웃의 셀이 계속 유지됩니다.

다른 번호의 셀이 죽습니다.

2 또는 4 이웃을 가진 죽은 세포가 살아납니다.

if 문에서 어떻게 구현할 수 있습니까? 어떤 종류의 목록을 사용하여 확인할 수 있습니까?

편집 : 여기에 훌륭한 해결책이 있습니다. 내 코드에 가장 적합한 것이 무엇인지 판단해야합니다. 여전히 응답하는 사용자 : 사용자 입력을 올바르게 처리 할 수 ​​있습니다.)

How many neighbors to stay alive?, How many neighbours to become alive when dead?의 텍스트 상자에 질문하는 창이 나타납니다. 이들은 또한 입력이 유효한지 확인합니다.

내가, 값 전달 될 함께 열거를 정의 NoChange 죽을 것

+0

몇 가지 다양한 옵션을 사용자가 정의 할 수 있습니까? 그것은 제한되거나 무제한의 옵션입니까? – CloudyMarble

+0

위키 백과 관련하여; 사이트의 영어 버전 일뿐입니다. 다른 버전 (예 : 스페인어 버전)을 통해 액세스하고 Google 크롬의 번역 기능을 사용하여 볼 수 있습니다. 다른 방법으로는 Google의 캐싱 시스템을 통해 영어 페이지의 며칠 이전 캐시 된 버전에 액세스 할 수 있습니다. 마지막으로 브라우저에서 자바 스크립트를 사용 중지하면 영어 버전에 액세스 할 수 있습니다. –

+1

@ O.D : 제한된 양의 옵션이 있습니다. 모든 셀에는 8 개의 이웃이 있으며이 규칙 중 일부는 살아 있는지 여부에 따라 다릅니다. –

답변

1

난 단지 세포가 죽어 가도록 조건을 확인한다. 나는 선을 따라 제 기능을 구성합니다 :

bool CalculateIfDead(Cell c, int[] deadlyCountRules) 
{  
    foreach(int n in deadlyCountRules) 
    { 
     if(c.NeighbourCount == n) 
     { 
     return true; 
     } 
    } 
    return false; 
} 
+0

또한 전파 할 것인지 또는 아무것도하지 않을 것인지 결정할 수있는 다른 방법이 필요합니다. 이웃들은 두 기능을 모두 사실로 평가했습니다. –

1

(이 Unity3D에서 C#을).

그런 다음 가능한 이웃 (0-8)의 각 수에 대해 해당 유형의 요소가있는 목록/배열을 만듭니다. 그런 다음 사용자는이 목록을 몇 가지 방법으로 설정할 수 있습니다 (쉼표로 구분 된 열거 형 목록, 열로 분리 된 다음 분할되어 열거 형으로 캐스트 될 수 있음).

다음은 이웃을 세고 조회를 수행하고 이에 따라 행동하는 것뿐입니다.

var UserActionList = 
    "Die, Die, NoChange, NoChange, Propogate, Propogate, Die, Die, Die" 
    .Split(',').Select(s => Enum.Parse(typeof(CellAction), s).ToArray(); 

// Count neighbours 

swtich(UserActionList[NeighboursCount]) 
{ 
    case Die: 
    ///// 

    case Propogate: 
    ///// 
} 
+0

좋은 해결책. 첫 줄을 매번 호출하는 것은 조금 비 효과적입니다. – rekire

+0

사용자 입력의 예가 바로 그것입니다. 사용자 입력이 변경되면 오류 검사 등을 통해 배열을 만들 수 있습니다. –

+0

당신이 옳습니다. 그것은 처음 생각이었습니다. – rekire

0

은 당신이 아마해야합니까 클래스

class DyingRule 
{ 

    enum RuleResult{ Neutral , Death , Lives}; 

    //evaluates if according to this rule 
    //death occurs.. pass parameter as needed 
    RuleResult Evaluate(); 
} 

그리고 여러분의 코드 어딘가에 당신이 그들의 벡터를 유지 같은 것입니다. 사용자는 벡터를 추가하고 자체 규칙을 추가 할 수 있습니다.

당신은 선택적으로 당신은 규칙에 대한 우선 순위를 가지고 규칙이 다른

0

음을 대체하는 경우 그들을 따라 정렬 할 수 있습니다

foreach (currentRule in Rules) 
    { 
      RuleResult r = currentRule.Evaluate(); 
      if (r == Death) 
      { 
       ProcessDeath(); 
       break; 
      } 
      else if (r == Lives) 
      { 
       ProcessLiving(); 
       break; 
      } 
    } 

로 평가, 주요 문제는 다른 번호와 함께 "셀은 _ "절. 두 가지 옵션이 있습니다.

- 그 절을 사용하지 못하게하고 사용자가 정확히 어떤 숫자로 무엇을하는지 지정하게하십시오.

- 해당 경우를 마지막으로 처리하고 현재 할당되지 않은 값을 지정하십시오.

구현 방법은 #neighbours => IAction (IAction은 동일, 종료 또는 증가 중 하나임) 배열입니다. 가능한 유한 수의 이웃 수만 있기 때문에 주어진 데이터에서 맵을 쉽게 채울 수 있습니다. 그런 다음 if 문도 필요하지 않습니다. 배열과 관련된 경우 인덱스의 IAction을 직접 호출합니다. 현재 이웃 수와 비교합니다.

1

솔루션 matix를 시도해보십시오.

bool life[] = new bool[] {false, false, true, true, false, false, false, false, false}; 
bool die[] = new bool[] {true, true, false, false, true, true, true, true, true}; 
bool alive[] = new bool[] {false, false, false, true, false, false, false, false, false}; 

bool shouldLife=live[count]; 
bool shouldDie=die[count]; 
bool getAlive=alive[count]; 
0

사용자는 무제한 당신이 번역 및 사용자 정의를 확인하고 클래스를 포함하여 C# 코드 파일을 생성 할 수도 규칙의 수, 실행을하게 정의 할 수 음 경우 C# 용 CodeDom 공급자를 통해 어셈블리로 컴파일하고 실행합니다. 이 파일은 사용자 정의에서 생성 된 statetments 인 경우 all의 결과를 리턴해야합니다.

옵션의 수가 제한되어있는 경우 벡터를 저장하는 파일을 저장할 수 있습니다.이 파일에는 죽은 원인이되는 모든 조합의 이진 배열이 들어 있습니다.