빌립의 대답은 이미 올바른 방향을 보여줍니다. 데이터 구조가 불필요하게 장황하다고 생각합니다. 짧은 텍스트는 읽고 쓰기가 더 쉽습니다.
텍스트가 짧을수록 알고리즘이 조금 더 복잡 해지더라도 알고리즘을 한 번만 작성하지만 대부분의 시간은 스토리를 작성하고 유지하는 데 소비되므로 많은 가치가 있습니다. 따라서 대부분의 시간을 할애하는 부분을 쉽게 만들 수 있도록 최적화하십시오.
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" }
];
이 디자인에 대한 몇 가지 설명 :
전체 이야기는 하나의 배열로 작성됩니다. 숫자를 제공 할 필요는 없으며 배열 구문에 의해 자동으로 제공됩니다. 첫 번째 항목에는 색인 0이 있고 다음 항목에는 색인 1이 있습니다.
대부분의 경우 다음 단계의 번호를 쓸 필요는 없습니다. 나는 대부분의 텍스트 줄이 가지 가 아니라고 가정합니다 . "다음 단계는 다음 항목입니다"를 기본 가정으로 설정하고 그렇지 않은 경우에만 메모를 작성하겠습니다.
점프하려면 숫자가 아닌 레이블을 사용하십시오 . 그런 다음 나중에 몇 줄을 추가하거나 제거하면 스토리의 논리가 유지되므로 숫자를 조정할 필요가 없습니다.
선명도와 부족함 사이의 합리적인 타협점을 찾으십시오. 예를 들어, "message"대신 "m"을 쓰는 것이 좋습니다. 왜냐하면 가장 많이 사용되는 명령이므로 짧게 만들면 텍스트를보다 읽기 쉽게 만들 수 있기 때문입니다. 그러나 나머지 키워드를 줄일 필요는 없습니다. (단, 당신이 원하는대로 할. 중요한 것은 그것이 가장 명료하게하는 것입니다 당신을 위해 . 다른 방법으로는 유효한 키워드로 모두 "M"과 "메시지"를 지원할 수 있습니다.)
게임 알고리즘은 다음과 같아야합니다.
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 에서 영감을 얻었습니다. Ren'Py 는 웹이 아닌 JavaScript가 아닌 원하는 것이 아니지만 멋진 아이디어를 줄 수 있습니다.