フィリップの答えはすでに正しい方向を示しています。データ構造が不必要に冗長であると思うだけです。テキストが短いほど、読みやすくなります。
短いテキストでアルゴリズムが少し複雑になる場合でも、アルゴリズムを1回だけ作成するので、それは価値がありますが、ほとんどの時間はストーリーの作成と維持に費やされます。したがって、ほとんどの時間を費やすパーツをより簡単にするために最適化します。
var story = [
{ m: "Hi!" },
{ m: "This is my new game." },
{ question: "Do you like it?", answers: [
{ m: "yes", next: "like_yes" },
{ m: "no", next: "like_no" },
] },
{ label: "like_yes", m: "I am happy you like my game!", next: "like_end" },
{ label: "like_no", m: "You made me sad!", next: "like_end" },
{ label: "like_end" },
{ m: "OK, let's change the topic" }
];
このデザインのいくつかの説明:
ストーリー全体が1つの配列で記述されています。数値を指定する必要はありません。それらは配列構文によって自動的に提供されます。最初の項目にはインデックス0があり、次の項目にはインデックス1があります。
ほとんどの場合、次のステップの番号を書き込む必要はありません。ほとんどのテキスト行はブランチではないと思います。「次のステップは次の項目です」をデフォルトの仮定とし、それ以外の場合にのみメモをとりましょう。
ジャンプの場合は、数字ではなくラベルを使用してください。その後、後で数行を追加または削除すると、ストーリーのロジックが保持され、数値を調整する必要がなくなります。
明快さと短さの間の合理的な妥協点を見つけます。たとえば、「メッセージ」ではなく「m」と書くことをお勧めします。これは、これまでで最も頻繁に使用されるコマンドであるため、短くするとテキストが読みやすくなります。ただし、残りのキーワードを短くする必要はありません。(ただし、必要に応じて実行してください。重要なのは、読みやすくすることです。または、有効なキーワードとして「m」と「message」の両方をサポートすることもできます)。
ゲームのアルゴリズムは次のようになります。
function execute_game() {
var current_line = 0;
while (current_line < story.length) {
var current_step = story[current_line];
if (undefined !== current_step.m) {
display_message(current_step.m);
if (undefined !== current_step.next) {
current_line = find_label(current_step.next);
} else {
current_line = current_line + 1;
}
} else if (undefined !== current_step.question) {
// display the question: current_step.question
// display the answers: current_step.answers
// choose an answer
// and change current_line accordingly
}
}
}
ちなみに、これらのアイデアはRen'Pyに触発されたものであり、これはあなたが望んでいるものではありません(JavaScriptではなく、Webではありません)が、とにかく素晴らしいアイデアが得られる可能性があります。