2013-12-08 1 views
0

모두. 나는 minimax 알고리즘의 버전을 학교 프로젝트를 위해 C#에서 실행하려고 노력 중이다. 우리는 단순한 Mancala AI를 만들려고합니다.C#에서 부모 클래스가 자식 메서드를 사용하도록하는 방법이 있습니까?

이 목적으로 미래의 움직임을 시뮬레이션하기 위해 보드에 대한 모든 하위 값과 기타 정보를 포함하는 노드로 구성된 트리를 설정했습니다.

초기에는 보드에 변경 될 때마다 트리를 다시 실행하는 대신, 현재 보드와 일치하는 자식 노드를 찾고 그때부터 모든 작업을 수행하기를 기대하면서 트리에 변경 가능한 루트가 있기를 바랬습니다. 그것을 확장하고 거기에서 일하십시오.

내 트리를 업데이트하는 방법에 대한 이동

, 나는 간단한 for 루프를 시도하고있다 :

for(int i = 0; i < 6; i++) { 
     ... 
      if(bCopy.stonesAt(myPits[i]) == (myPits[myPits.Length-i-1])) 
       myChildren[i]= new MaxNode(...); 
      else 
       myChildren[i] = new MinNode(...); 
     } 
    } else { 
     myChildren[i].addChildren(board, depth); 
    } 
} 

타원은 읽을 수 있도록하기 위해 코드 또는 인수 장소에 있습니다.

이것은 내가 많은 문제를 일으키는 원인이됩니다. Mancala는 당신이 다시 갈 수있게 해주는 움직임이 있기 때문에 주어진 자식 노드가 MinNode인지 아니면 MaxNode인지를 알 수있는 방법이 없습니다. 나는 MinNodes와 MaxNodes를 추상 클래스 DecisionNode의 자식 클래스로 설정했다.

마지막 줄 (myChildren [i] .addChildren (board, depth))이 가장 낮은 수준으로 내려 가서 어느 것이 적절한 지에 따라 MaxNode addChildren 또는 MinNode addChildren을 사용하기를 바랬습니다. 그러나 DecisionNode addChildren 메소드를 사용합니다.

코드는 별개의 클래스에 보관하고 싶습니다. 그렇게 할 방법이 있습니까?

편집 : 나는 이미 DecisionNode.addChildren을 가상으로 설정했고 MinNode & MaxNode addChildren을 재정의로 설정했음을 언급해야합니다. 그러나, 컴파일시에 myChildren [i]의 타입을 알지 못하기 때문에, 그 대신에 부모 클래스가 기본값으로 사용된다. 메서드 호출은 하위 클래스 중 하나 대신

이됩니다.

답변

0

답변을 찾았습니다! 또는 답변이 아니라면 적어도 하나는 작동합니다. AddChildren 추상의 DecisionNode 메소드를 만드는 것이 트릭을 완료 한 것으로 보입니다.

2

myChildren를 호출 [I]는 .addChildren 너무 오래 파생 클래스의 기본 클래스의 메소드 DecisionNode virtualoverride 표시된 것처럼 MinNode.addChildren 또는 MaxNode.addChildren 호출 될 것이다.

예를 들어, 추상 기본 클래스에서, 당신은해야합니다

public abstract class DecisionNode 
{ 
    public virtual void addChildren(...) 
    { 
     ... 
    } 
} 

그리고 당신의 파생 클래스에서

, 당신이 있어야합니다

public class MinNode : DecisionNode 
{ 
    public override void addChildren(...) 
    { 
     ... 
    } 
} 
+0

몇 가지 문제가 있습니다. 기본 클래스에 addchildren을 추상화하고 불평하기 시작한 곳을 확인합니다. –

2

UPDATE :

내가 가진 최근 재귀 적 자손 파서 (parser)를 작성한 유사한 문제. 추상 구문 트리는 구문 분석기가 언어를 나타내는 데 사용하는 구조입니다. 방문자 디자인 패턴을 사용하여 조사 할 것을 적극 권장합니다. 기본적으로 모든 트리 노드에 의해 구현되는 IVisitable 인터페이스를 생성합니다. 그런 다음 구현은 Accept 메소드를 구현하고 자신을 호출하는 모든 IVisitor 인스턴스에 자신의 인스턴스를 전달합니다.

이 패턴을 구현하면 임의로 트리를 탐색하고 기본 코드를 손상시키지 않고 원하는대로 할 수 있습니다. 특히 어떤 노드는 동작을 구현하고 다른 노드는 동작을 구현하지 않을 때 유용합니다. 파생 된 클래스의 반대쪽에서 일종의 기능을합니다.

아무튼, 거꾸로 대답 일찍 죄송합니다.

+0

나는 그것이 어떤 자식 클래스인지 모를 때, 부모 클래스를 통해 자식 클래스에 접근하려고한다. 아이를 통해 부모에게 가려고하지 마십시오. – UrhoKarila

+0

죄송합니다, 저번입니다. 내 뇌는 그것을 거꾸로 읽었다. – drankin2112

관련 문제