Frage

Ich dachte früher heute über eine Idee für ein kleines Spiel und stolperte über, wie es zu implementieren. Die Idee ist, dass der Spieler eine Reihe von Bewegungen zu machen, die eine geringe Wirkung haben, die aber in einer bestimmten Reihenfolge durchgeführt, wenn würde eine größere Wirkung verursachen. So weit, so gut, das ich weiß, wie zu tun ist. Offensichtlich musste ich es komplizierter machen (weil wir lieben es komplizierter zu machen), so dass ich dachte, dass es könnte mehr als ein möglicher Weg für die Folge sein, die sowohl größere Effekte verursachen würden, wenn auch verschiedene. Außerdem kann ein Teil einiger Sequenzen könnte die beggining von anderen Sequenzen, oder sogar ganze Sequenzen durch andere größere Sequenzen enthalten sein. Nun weiß ich nicht sicher den besten Weg, dies zu realisieren. Ich hatte ein paar Ideen, aber.

1) Ich konnte eine kreisförmige n-verknüpften Liste implementieren. Da aber die Liste der Züge nie zu Ende gehen, ich fürchte, es könnte einen Stapelüberlauf ™ führen. Die Idee ist, dass jeder Knoten n Kinder haben würde und auf einen Befehl erhalten hat, könnte es Sie zu einem seiner Kinder oder führen, wenn keine Kinder zu solchen Befehl vorhanden war, führen Sie zum beggining zurück. Bei der Ankunft auf allen Kindern, würde ein paar Funktionen ausgeführt werden, um den kleinen und großen Effekt verursacht. Dies könnte jedoch dazu führen, dass viele duplizierte Knoten auf dem Baum mit allen möglichen Folgen zu bewältigen auf, dass bestimmte Bewegung mit verschiedenen Effekten endet, die ein Schmerz zu halten sein könnte, aber ich bin nicht sicher. Ich habe nie versucht, etwas diesen Komplex auf Code, nur theoretisch. Ist dieser Algorithmus vorhanden sind und einen Namen? Ist es eine gute Idee?

2) Ich könnte eine Zustandsmaschine implementieren. Dann stattdessen um eine verknüpfte Liste von wandernden, würde ich einige Riesen-verschachtelte Schalter haben, die Funktionen aufrufen würde und den Maschinenzustand entsprechend aktualisieren. Es scheint einfacher zu implementieren, aber ... na ja ... nicht Spaß scheint ... noch ellegant. Riesen switchs scheint immer hässlich zu mir, aber würde diese Arbeit besser?

3) Vorschläge? Ich bin gut, aber ich bin weit davon unerfahren. Die gute Sache der kodierenden Bereich ist, dass egal wie seltsam Ihr Problem ist, jemanden, der es in der Vergangenheit gelöst, aber Sie müssen wissen, wo sie suchen müssen. Jemand könnte eine bessere Idee als diejenige, die ich hatte, und ich wollte wirklich Vorschläge hören.

War es hilfreich?

Lösung

Ich bin nicht unbedingt ganz sicher, dass ich genau verstehen, was Sie sagen, sondern als analoge Situation, sagen jemand auf der Tastatur einen endlosen Strom von Zahlen ist die Eingabe. ‚117‘ ist eine magische Sequenz ‚468‘ ein anderes ist, ‚411.799‘ ist ein anderes (die die erste enthält).

Also, wenn der Benutzer eingibt:

  

55468411799

Sie wollen an der * s 'magische Ereignisse' Feuer:

  

55468 * 4117 * 99 *

oder so etwas, nicht wahr? Wenn das analog zu dem Problem, du redest, was ist dann so etwas wie (Java-like Pseudo-Code):

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);
  }
}

während MagicSequence hat so etwas wie:

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!
  }
}

Andere Tipps

Sie möchten vielleicht ohnehin eine Zustandsmaschine implementieren, aber Sie müssen keine Zustandsübergänge codieren.
Versuchen Sie, eine grafische Darstellung von Zuständen zu machen, wo Verbindung zwischen dem Zustand A in den Zustand B bedeuten A nach B
führen kann Dann können Sie zur Laufzeit durchqueren Graphen zu finden, wo Spieler gehen.

Bearbeiten: Sie können Diagrammknoten definieren als:
-state-id
-Liste von Links zu anderen Staaten,  wo jeder Link definiert:
 -state-id
 -precondition, eine Liste der Staaten, was, bevor Sie zu diesem Zustand besucht werden müssen

Was Sie klingt sehr ähnlich wie der Technologie-Baum in einem Spiel live Zivilisation beschreibt.

Ich weiß nicht, wie die Civ Autoren gebaut ihnen, aber ich würde geneigt sein, um einen Multigraphen zu verwenden möglich darzustellen ‚bewegt‘ - wird es einige, die Sie an ohne ‚Erfahrung‘ beginnen, und wenn Sie‘ re in ihnen, wird es mehrere Wege bis zum Ende sein.

Draw-out, was potenzielle Optionen, die Sie in jeder Phase des Spiels haben können, und dann werden die Zeilen von einigen Optionen zu anderen gehen ziehen.

Das sollten Sie bei der Umsetzung einen Start geben, als Graphen sind [relativ] einfache Konzepte zu implementieren und zu nutzen.

Klingt wie ein neuronales Netz rel="nofollow. Sie könnten erstellen und trainieren sie die Muster zu erkennen, dass die verschiedenen Effekte verursachen, die Sie suchen.

Was Sie klingt ein wenig ähnlich ein Abhängigkeitsgraphen oder ein Wortgraphen beschreiben. Sie könnten in solche aussehen.

@Cowan, @Javier: Nette Idee, Geist, wenn ich ihn hinzufügen

?

Lassen Sie die MagicSequence Objekte auf den eingehenden Strom von Benutzereingaben zu hören, ist, dass sie von dem Eingang (Broadcast) benachrichtigen und lassen Sie jeder von ihnen den Eingangsstrom dort internen Eingang hinzufügen. Dieser Strom wird gelöscht, wenn der Eingang nicht die erwartete nächste Eingabe in dem Muster, dass die MagicSequence Feuer seine Wirkung haben würde. Sobald das Muster abgeschlossen ist, die Aktion aus und den internen Eingangsstrom löscht.

diese optimieren, indem nur der Eingang zu den MagicSequences Fütterung, die für sie warten. Dies könnte auf zwei Arten erfolgen:

  1. Sie haben ein Objekt, das alle MagicSequences Verbindung mit Ereignissen können, die mit den Zahlen in ihren Mustern entsprechen. MagicSequence (1,1,7) würde sich in den GOT1 und Got7, zum Beispiel:

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

  2. Sie können diese so optimieren, dass nach jeder Eingabe MagicSequences von ungültigen Ereignissen deregistrieren und registrieren mit gültig denjenigen.

Erstellen Sie eine kleine Zustandsmaschine für jeden Effekt, den Sie wollen würde. bei jeder Benutzeraktion ‚übertragen‘ es auf alle Zustandsmaschinen. die meisten dann nicht egal, aber einige werden vorrücken, oder vielleicht nach hinten gehen. wenn einer von ihnen erreicht es Ziel ist, die gewünschte Wirkung.

Sie den Code ordentlich zu halten, nicht die Zustandsmaschinen codiert, anstatt eine einfache Datenstruktur aufzubauen, die die Zustandsgraphen codieren: jeder Zustand ein Knoten mit einer Liste von interessanten Veranstaltungen, die jeweils ein Punkt auf den Knoten des nächsten Zustandes. Jede Maschine des Staates ist einfach eine Referenz auf den entsprechenden Status Knoten.

edit: Es scheint, Cowan Rat zu diesem äquivalent ist, aber er optimiert seine State-Maschinen nur einfache Sequenzen zu exprimieren. scheint genug für Ihr spezielles Problem, aber komplexere Bedingungen eine allgemeinere Lösung benötigen könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top