Ho usato il motore Tads3 (www.tads3.org) per alcune delle avventure testuali che ho scritto. È più per programmatori di computer, ma un linguaggio molto potente. Se sei un programmatore, Tads3 sarà molto più facile da programmare più velocemente di Inform7, che ho usato anche in precedenza. Il problema con Inform7 per i programmatori è famoso quanto "indovina il verbo" è per i giocatori di avventure testuali in quanto se non scrivi le tue frasi MOLTO attentamente interromperai il gioco. Se hai la pazienza di farlo, puoi facilmente scrivere un parser in Java usando la classe Tokenizer. Esempio che ho scritto usando un JTextArea globale e un array String [] globale. Elimina i caratteri indesiderati tranne le foglie AZ e 0-9 e il punto interrogativo (per una scorciatoia da comando "aiuto"):
// 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
... ho tralasciato la definizione della classe principale e il metodo di inizializzazione variabile (), ecc. Perché si presume che se conosci Java sai già come configurarlo. La classe principale per questo dovrebbe probabilmente estendere JFrame e nel tuo metodo main () vuoto statico pubblico crearne un'istanza. Eventualmente parte di questo codice aiuta.
EDITED - Okay, quindi ora quello che faresti dopo è creare una classe Actions e cercare un'azione (es. "Get lamp" o "drop sword"). Per semplificare, dovresti avere un oggetto o un metodo RoomScan per scansionare tutto ciò che è visibile nell'ambito e scansionare solo quegli oggetti su quell'azione. L'oggetto stesso gestisce la gestione delle azioni e per impostazione predefinita è necessario che una classe Item gestisca tutte le azioni note in modo predefinito, che può essere sovrascritto. Ora, se per esempio, un oggetto che vuoi "ottenere" è trattenuto da un personaggio non giocatore, la risposta predefinita per ottenere quell'oggetto trattenuto dal suo proprietario dovrebbe essere qualcosa del tipo "Non te lo lascerà avere". Ora dovresti creare un sacco di risposte di azione predefinite a questo nella classe Item o Thing. Questo deriva fondamentalmente da una prospettiva Tads3 su tutto il design. Perché in Tads3 ogni elemento ha la propria routine di gestione delle azioni predefinita su di essa che il parser chiama se un'azione su di essa è inizializzata. Quindi ... te lo sto solo dicendo, Tads3 ha già tutto questo a posto, quindi è MOLTO facile programmare un'avventura testuale in quella lingua. Ma se vuoi farlo da zero, come in Java (sopra), personalmente lo gestirò allo stesso modo in cui è stato progettato Tads3. In questo modo, puoi sovrascrivere le azioni predefinite gestendo le routine su diversi oggetti stessi, quindi ad esempio se vuoi "ottenere la lampada" e il maggiordomo lo tiene in mano, potrebbe innescare una risposta nel metodo di azione "get" di default per Item o Oggetto e dirti che "Il maggiordomo si rifiuta di consegnare la lampada di ottone". Voglio dire ... una volta che sei stato un programmatore abbastanza a lungo come me, allora è tutto molto facile. Ho più di 50 anni e lo faccio da quando avevo 7 anni. Mio padre era un istruttore di Hewlett Packard negli anni '70, quindi ho imparato da lui inizialmente un TON sulla programmazione al computer. Sono anche nelle riserve dell'esercito degli Stati Uniti come fondamentalmente un amministratore di server ora. Um ... sì, quindi non arrenderti. Non è così difficile una volta scomposto in quello che vuoi che faccia il tuo programma. A volte tentativi ed errori sono il modo migliore per affrontare questo tipo di cose. Basta testarlo e vedere e non mollare mai. Va bene? La codifica è un'arte. Può essere fatto in molti modi diversi. Non lasciare che un modo o l'altro sembrino bloccarti in un angolo del design. Sono anche nelle riserve dell'esercito degli Stati Uniti come fondamentalmente un amministratore di server ora. Um ... sì, quindi non arrenderti. Non è così difficile una volta scomposto in quello che vuoi che faccia il tuo programma. A volte tentativi ed errori sono il modo migliore per affrontare questo tipo di cose. Basta testarlo e vedere e non mollare mai. Va bene? La codifica è un'arte. Può essere fatto in molti modi diversi. Non lasciare che un modo o l'altro sembrino bloccarti in un angolo del design. Sono anche nelle riserve dell'esercito degli Stati Uniti come fondamentalmente un amministratore di server ora. Um ... sì, quindi non arrenderti. Non è così difficile una volta scomposto in quello che vuoi che faccia il tuo programma. A volte tentativi ed errori sono il modo migliore per affrontare questo tipo di cose. Basta testarlo e vedere e non mollare mai. Va bene? La codifica è un'arte. Può essere fatto in molti modi diversi. Non lasciare che un modo o l'altro sembrino bloccarti in un angolo del design.