Я использовал движок Tads3 (www.tads3.org) для некоторых текстовых приключений, которые я написал. Это больше для программистов, но очень мощный язык. Если вы программист, Tads3 будет намного проще кодировать вещи быстрее, чем Inform7, который я также использовал ранее. Проблема с Inform7 для программистов так же известна, как «угадай глагол», для игроков текстовых приключений в том, что если вы не ОЧЕНЬ напишите свои предложения ОЧЕНЬ тщательно, вы сломаете игру. Если у вас есть терпение, вы можете легко написать синтаксический анализатор на Java с помощью класса Tokenizer. Пример, который я написал с использованием глобального JTextArea и глобального массива String []. Он удаляет ненужные символы, кроме листьев AZ и 0-9, а также вопросительного знака (для ярлыка команды «help»):
// put these as global variables just after your main class definition
public static String[] parsed = new String[100];
// outputArea should be a non-editable JTextArea to display our results
JTextArea outputArea = new JTextArea();
/*
* parserArea is the JTextBox used to grab input
* and be sure to MAKE sure somewhere to add a
* java.awt.event.KeyListener on it somewhere where
* you initialize all your variables and setup the
* constraints settings for your JTextBox's.
* The KeyListener method should listen for the ENTER key
* being pressed and then call our parseText() method below.
*/
JTextArea parserArea = new JTextArea();
public void parseText(){
String s0 = parserArea.getText();// parserArea is our global JTextBox
s0 = s0.replace(',',' ');
s0 = s0.replaceAll("[^a-zA-Z0-9? ]","");
// reset parserArea back to a clean starting state
parserArea.setCaretPosition(0);
parserArea.setText("");
// erase what had been parsed before and also make sure no nulls found
for(int i=0;i < parsed.length; i++){
parsed[i] = "";
}
// split the string s0 to array words by breaking them up between spaces
StringTokenizer tok = new StringTokenizer(s0, " ");
// use tokenizer tok and dump the tokens into array: parsed[]
int iCount = 0;
if(tok.countTokens() > 0){
while(tok.hasMoreElements()){
try{
parsed[iCount] = tok.nextElement().toString();
if(parsed[iCount] != null && parsed[iCount].length()>1){
// if a word ENDS in ? then strip it off
parsed[iCount] = parsed[iCount].replaceAll("[^a-zA-Z0-9 ]","");
}
}catch(Exception e){
e.printStackTrace();
}
iCount++;
}
/*
* handle simple help or ? command.
* parsed[0] is our first word... parsed[1] the second, etc.
* we can use iCount from above as needed to see how many...
* ...words got found.
*/
if(parsed[0].equalsIgnoreCase("?") ||
parsed[0].equalsIgnoreCase("help")){
outputArea.setText("");// erase the output "screen"
outputArea.append("\nPut help code in here...\n");
}
}
// handle other noun and verb checks of parsed[] array in here...
}// end of if(tok.countTokens() > 0)...
}// end of public void parseText() method
... Я пропустил определение основного класса и переменную initialize () и т. Д., Поскольку предполагается, что если вы знаете Java, вы уже знаете, как его настроить. Основной класс для этого, вероятно, должен расширять JFrame, и в вашем публичном статическом методе void main () просто создайте его экземпляр. Надеюсь, что часть этого кода поможет.
EDITED - Хорошо, теперь вы должны создать класс Actions и отсканировать действие (например, «получить лампу» или «бросить меч»). Чтобы упростить его, вам понадобится объект или метод RoomScan, чтобы сканировать все видимое в области действия и проверять только те объекты в этом действии. Сам объект обрабатывает обработку действий, и по умолчанию у вас должен быть класс Item, который обрабатывает все известные действия способом по умолчанию, который может быть переопределен. Теперь, если, например, предмет, который вы хотите «получить», удерживается неигровым персонажем, ответ по умолчанию для получения этого предмета, принадлежащего его владельцу, должен выглядеть примерно так: «Не позволит вам его получить». Теперь вам нужно создать тонну стандартных ответов на это в классе Item или Thing. В основном это происходит с точки зрения Tads3 по всему дизайну. Потому что в Tads3 у каждого элемента есть своя собственная процедура обработки действий по умолчанию, которую парсер вызывает, если действие над ним инициализировано. Итак ... Я просто говорю вам, Tads3 уже имеет все это на месте, так что ОЧЕНЬ легко кодировать в текстовом приключении на этом языке. Но если вы хотите сделать это с нуля, как в Java (см. Выше), то лично я бы поступил так же, как и Tads3. Таким образом, вы можете переопределить действия по умолчанию, обрабатывающие процедуры для самих различных объектов, поэтому, например, если вы хотите «получить лампу», а дворецкий ее держит, это может вызвать ответ в методе действия «get» по умолчанию для Item. или возразите и скажите, что «Дворецкий отказывается отдать медную лампу». Я имею в виду ... как только вы станете программистом достаточно долго, как я, тогда это все ОЧЕНЬ легко. Мне более 50 лет, и я занимаюсь этим с семи лет. Мой отец был инструктором Hewlett Packard в 70-х, поэтому я сначала узнал от него ТОННО по программированию. Я также в резерве армии США в качестве администратора сервера. Хм ... да, так что не сдавайся. Это не так сложно, если вы действительно разберетесь с тем, что вы хотите, чтобы ваша программа делала. Иногда метод проб и ошибок - лучший способ подобного рода вещей. Просто проверь это и смотри, и никогда не сдавайся. Ладно? Кодирование - это искусство. Это можно сделать разными способами. Не позволяйте так или иначе, кажется, загнать вас в угол дизайна. м также в резерве армии США в качестве администратора сервера. Хм ... да, так что не сдавайся. Это не так сложно, если вы действительно разберетесь с тем, что вы хотите, чтобы ваша программа делала. Иногда метод проб и ошибок - лучший способ подобного рода вещей. Просто проверь это и смотри, и никогда не сдавайся. Ладно? Кодирование - это искусство. Это можно сделать разными способами. Не позволяйте так или иначе, кажется, загнать вас в угол дизайна. м также в резерве армии США в качестве администратора сервера. Хм ... да, так что не сдавайся. Это не так сложно, если вы действительно разберетесь с тем, что вы хотите, чтобы ваша программа делала. Иногда метод проб и ошибок - лучший способ подобного рода вещей. Просто проверь это и смотри, и никогда не сдавайся. Ладно? Кодирование - это искусство. Это можно сделать разными способами. Не позволяйте так или иначе, кажется, загнать вас в угол дизайна.