문제

저는 오늘 일찍 작은 게임에 대한 아이디어를 생각하고 있었는데 그것을 구현하는 방법을 우연히 발견했습니다.아이디어는 플레이어가 약간의 효과를 유발하는 일련의 동작을 수행할 수 있지만 특정 순서로 수행되면 더 큰 효과를 유발할 수 있다는 것입니다.지금까지는 아주 좋았습니다. 나는 이것을 어떻게 해야 하는지 알고 있습니다.분명히, 나는 그것을 더 복잡하게 만들어야 했고(우리는 그것을 더 복잡하게 만드는 것을 좋아하기 때문에), 비록 다르지만 더 큰 효과를 일으키는 시퀀스에 대해 가능한 경로가 두 개 이상 있을 수 있다고 생각했습니다.또한 일부 시퀀스의 일부가 다른 시퀀스의 시작이 될 수도 있고 전체 시퀀스가 ​​다른 더 큰 시퀀스에 포함될 수도 있습니다.이제 나는 이것을 구현하는 가장 좋은 방법을 확실히 모릅니다.그래도 몇 가지 아이디어가 있었어요.

1) 순환 n-연결 리스트를 구현할 수 있습니다.하지만 이동 목록은 끝나지 않기 때문에 스택 오버플로 ™가 발생할 수 있습니다.아이디어는 모든 노드가 n개의 자식을 가지며 명령을 받으면 그의 자식 중 하나로 연결되거나 해당 명령을 수행할 수 있는 자식이 없는 경우 시작으로 다시 연결된다는 것입니다.어린이에게 도착하면 몇 가지 기능이 실행되어 크고 작은 효과를 발생시킵니다.하지만 이로 인해 특정 동작에서 다른 효과로 끝나는 모든 가능한 시퀀스를 처리하기 위해 트리에 중복된 노드가 많이 생길 수 있습니다. 이는 유지 관리가 어려울 수 있지만 확실하지 않습니다.나는 이론적으로만 코드에서 이렇게 복잡한 것을 시도한 적이 없습니다.이 알고리즘이 존재하고 이름이 있습니까?좋은 생각인가요?

2) 상태 머신을 구현할 수 있습니다.그런 다음 연결된 목록을 돌아다니는 대신 함수를 호출하고 그에 따라 시스템 상태를 업데이트하는 거대한 중첩 스위치를 갖게 됩니다.구현하기가 더 간단해 보이지만...잘...재미없어 보이는데...우아하지도 않고.거대한 스위치는 항상 보기 흉해 보이지만 이것이 더 잘 작동할까요?

3) 제안?나는 좋은데 아직 경험이 부족해요.코딩 분야의 좋은 점은 문제가 아무리 이상하더라도 과거에 누군가 해결한 적이 있지만, 어디를 봐야 할지 알아야 한다는 것입니다.누군가는 나보다 더 나은 아이디어를 가지고 있을 수도 있고, 나는 정말 제안을 듣고 싶었습니다.

도움이 되었습니까?

해결책

나는 당신이 말하는 것을 정확히 이해한다고 확신하지는 않지만, 항문의 상황으로서 누군가가 키보드에 끝없는 숫자 스트림을 입력한다고 말합니다. '117'은 마법의 시퀀스입니다. '468'은 또 다른 것입니다. '411799'는 또 다른 것입니다 (첫 번째는 포함).

따라서 사용자가 들어가면 :

55468411799

당신은 *s에서 '마법 이벤트'를 발사하고 싶습니다 :

55468*4117*99*

아니면 그런 것 같아요? 그것이 당신이 말하는 문제와 유사하다면, (Java와 같은 pseudocode)와 같은 것은 어떻습니까?

MagicSequence fireworks = new MagicSequence(new FireworksAction(), 1, 1, 7);
MagicSequence playMusic = new MagicSequence(new MusicAction(), 4, 6, 8);
MagicSequence fixUserADrink = new MagicSequence(new ManhattanAction(), 4, 1, 1, 7, 9, 9);

Collection<MagicSequence> sequences = ... all of the above ...;

while (true) {
  int num = readNumberFromUser();
  for (MagicSequence seq : sequences) {
    seq.handleNumber(num);
  }
}

Magic Sequence는 다음과 같습니다.

Action action = ... populated from constructor ...;
int[] sequence = ... populated from constructor ...;
int position = 0;

public void handleNumber(int num) {
  if (num == sequence[position]) {
    // They've entered the next number in the sequence
    position++;
    if (position == sequence.length) {
       // They've got it all!
       action.fire();
       position = 0; // Or disable this Sequence from accepting more numbers if it's a once-off
    }
  } else {
    position = 0; // missed a number, start again!
  }
}

다른 팁

어쨌든 상태 머신을 구현할 수 있지만 상태 전환을 하드 코드 할 필요는 없습니다.
상태 A에서 상태 B에 대한 연결이 A가 B로 이어질 수 있음을 의미하는 상태의 그래프를 만드십시오.
그런 다음 런타임에 그래프를 가로 질러 플레이어가 어디로 가는지 찾을 수 있습니다.

편집 : 그래프 노드를 다음과 같이 정의 할 수 있습니다.
-상태 -ID
-모든 링크가 정의하는 다른 상태에 대한 링크 목록 :
-상태 -ID
-전도,이 상태에 가기 전에 방문해야 할 상태 목록

당신이 묘사 한 것은 게임 라이브 문명에서 기술 트리와 매우 유사한 소리입니다.

나는 시민 작가들이 어떻게 그들을 지었는지 모르겠지만, 나는 '움직임'을 표현하기 위해 멀티 그래프를 사용하는 경향이있을 것입니다. , 끝까지 여러 경로가 있습니다.

게임의 각 단계에서 어떤 잠재적 옵션을 가질 수 있는지, 일부 옵션에서 다른 옵션에서 다른 옵션을 그리십시오.

그래프는 [상대적으로] 구현 및 활용하기 쉬운 개념이므로 구현을 시작해야합니다.

a처럼 들립니다 신경망. 당신은 하나를 만들고 당신이 찾고있는 다양한 효과를 일으키는 패턴을 인식하도록 훈련 할 수 있습니다.

당신이 묘사하는 것은 종속성 그래프 나 단어 그래프와 다소 유사한 소리입니다. 당신은 그것들을 조사 할 수 있습니다.

@코완, @하비에르:좋은 생각입니다. 추가해도 될까요?

MagicSequence 객체가 사용자 입력의 수신 스트림을 수신하도록 합니다. 즉, 입력(브로드캐스트)을 알리고 각 객체가 내부 입력 스트림에 입력을 추가하도록 합니다.이 스트림은 MagicSequence가 해당 작업을 실행하게 하는 패턴에서 입력이 예상되는 다음 입력이 아닐 때 지워집니다.패턴이 완료되자마자 작업을 실행하고 내부 입력 스트림을 지웁니다.

이를 기다리고 있는 MagicSequences에만 입력을 공급하여 이를 최적화하세요.이 작업은 두 가지 방법으로 수행할 수 있습니다.

  1. 모든 MagicSequence를 해당 패턴의 숫자에 해당하는 이벤트와 연결할 수 있는 개체가 있습니다.MagicSequence(1,1,7)은 got1 및 got7에 자신을 추가합니다. 예를 들면 다음과 같습니다.

    UserInput.got1 += MagicSequnece[i].SendMeInput;

  2. 각 입력 이후 MagicSequences가 유효하지 않은 이벤트에서 등록을 취소하고 유효한 이벤트에 등록하도록 이를 최적화할 수 있습니다.

원하는 각 효과에 대해 작은 상태 머신을 만듭니다. 각 사용자 조치에서 모든 상태 기계에 '방송'을 '방송'합니다. 그때는 신경 쓰지 않지만 일부는 진전하거나 뒤로 갈 수 있습니다. 그들 중 하나가 목표에 도달하면 원하는 효과를 얻으십시오.

코드를 깔끔하게 유지하려면 상태 머신을 하드 코드하지 말고 상태 그래프를 인코딩하는 간단한 데이터 구조를 구축하십시오. 각 상태는 흥미로운 이벤트 목록이있는 노드이며 각각은 다음 상태 노드를 가리 킵니다. 각 기계의 상태는 단순히 적절한 상태 노드에 대한 참조입니다.

편집 : Cowan의 조언은 이것과 같지만 간단한 시퀀스 만 표현하기 위해 그의 상태 기계를 최적화합니다. 특정 문제는 충분 해 보이지만 더 복잡한 조건에는보다 일반적인 해결책이 필요할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top