Usei o mecanismo Tads3 (www.tads3.org) para algumas das aventuras de texto que escrevi. É mais para programadores de computador, mas uma linguagem muito poderosa. Se você é um programador, o Tads3 será muito mais fácil de codificar as coisas mais rapidamente do que o Inform7, que eu já usei antes. O problema com o Inform7 para programadores é tão famoso quanto "adivinhe o verbo" é para jogadores de aventuras de texto, pois se você não escrever suas frases com muito cuidado, irá interromper o jogo. Se você tiver paciência para fazer isso, poderá escrever facilmente um analisador em Java usando a classe Tokenizer. Exemplo que escrevi usando um JTextArea global e uma matriz String [] global. Ele remove caracteres indesejados, exceto deixa AZ e 0-9, bem como o ponto de interrogação (para um atalho de comando "ajuda"):
// 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
... Eu deixei de fora a definição de classe principal e o método da variável initialize (), etc. porque é assumido que, se você conhece Java, já sabe como configurá-lo. A classe principal para isso provavelmente deve estender o JFrame e, em seu método público static void main (), crie apenas uma instância dele. Espero que parte desse código ajude.
EDITADO - Ok, agora o que você faria a seguir é criar uma classe Actions e procurar uma ação (por exemplo, "obter lâmpada" ou "soltar a espada"). Para simplificar, você precisa ter um objeto ou método do RoomScan para verificar tudo o que estiver visível no escopo e verificar apenas os objetos dessa ação. O próprio objeto lida com a manipulação de ações e, por padrão, você deve ter uma classe Item para lidar com todas as ações conhecidas de uma maneira padrão, que pode ser substituída. Agora, se, por exemplo, um item que você deseja "receber" é mantido por um personagem que não é jogador, a resposta padrão para manter esse item pelo proprietário deve ser algo como "O não permitirá que você o tenha". Agora você teria que criar várias respostas de ação padrão para isso na classe Item ou Coisa. Isso basicamente vem da perspectiva do Tads3 em todo o design. Como no Tads3, cada item possui sua própria rotina de manipulação de ações padrão, que o analisador chama se uma ação for inicializada. Então ... só estou lhe dizendo, o Tads3 já possui tudo isso, por isso é MUITO fácil codificar em uma aventura de texto nesse idioma. Mas se você quiser fazer isso do zero, como em Java (acima), eu pessoalmente lidaria com isso da mesma maneira que o Tads3 foi projetado. Dessa forma, você pode substituir ações padrão que manipulam rotinas em objetos diferentes, por exemplo, se você deseja "obter lâmpada" e o mordomo a está segurando, isso pode desencadear uma resposta no método de ação "obter" padrão para Item ou Objete e diga que "o mordomo se recusa a entregar a lâmpada de bronze". Quero dizer ... depois que você é programador há tempo suficiente como eu, tudo isso é MUITO fácil. Tenho mais de 50 anos e faço isso desde os 7 anos. Meu pai era instrutor da Hewlett Packard nos anos 70, então aprendi uma TONELADA dele inicialmente em programação de computadores. Também estou nas Reservas do Exército dos EUA como administrador de servidores agora. Hum ... sim, então não desista. Não é tão difícil assim que você realmente divide o que deseja que seu programa faça. Às vezes, tentativa e erro é a melhor maneira de fazer esse tipo de coisa. Apenas teste e veja e nunca desista. OK? Codificação é uma arte. Isso pode ser feito de muitas maneiras diferentes. Não deixe que, de um jeito ou de outro, pareçam obstruí-lo em um canto do design. m também nas Reservas do Exército dos EUA como basicamente um administrador de servidor agora. Hum ... sim, então não desista. Não é tão difícil assim que você realmente divide o que deseja que seu programa faça. Às vezes, tentativa e erro é a melhor maneira de fazer esse tipo de coisa. Apenas teste e veja e nunca desista. OK? Codificação é uma arte. Isso pode ser feito de muitas maneiras diferentes. Não deixe que, de um jeito ou de outro, pareçam obstruí-lo em um canto do design. m também nas Reservas do Exército dos EUA como basicamente um administrador de servidor agora. Hum ... sim, então não desista. Não é tão difícil assim que você realmente divide o que deseja que seu programa faça. Às vezes, tentativa e erro é a melhor maneira de fazer esse tipo de coisa. Apenas teste e veja e nunca desista. OK? Codificação é uma arte. Isso pode ser feito de muitas maneiras diferentes. Não deixe que, de um jeito ou de outro, pareçam obstruí-lo em um canto do design.