Ich habe die Tads3-Engine (www.tads3.org) für einige der von mir geschriebenen Textabenteuer verwendet. Es ist zwar mehr für Computerprogrammierer, aber eine sehr mächtige Sprache. Wenn Sie ein Programmierer sind, wird Tads3 viel einfacher zu programmieren sein als Inform7, das ich zuvor auch verwendet habe. Das Problem mit Inform7 für Programmierer ist so berühmt wie "rate das Verb" für Spieler von Text-Abenteuern, denn wenn Sie Ihre Sätze nicht SEHR sorgfältig schreiben, brechen Sie das Spiel. Wenn Sie die Geduld dazu haben, können Sie mit der Tokenizer-Klasse problemlos einen Parser in Java schreiben. Beispiel Ich habe mit einem globalen JTextArea und einem globalen String [] -Array geschrieben. Es werden unerwünschte Zeichen entfernt, mit Ausnahme von AZ und 0-9 sowie des Fragezeichens (für eine "Hilfe" -Befehlsverknüpfung):
// 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
... Ich habe die Hauptklassendefinition und die Variable initialize () - Methode usw. weggelassen, da davon ausgegangen wird, dass Sie, wenn Sie Java kennen, bereits wissen, wie Sie das einrichten. Die Hauptklasse hierfür sollte wahrscheinlich JFrame erweitern und in Ihrer öffentlichen statischen void main () -Methode nur eine Instanz davon erstellen. Hoffentlich hilft ein Teil dieses Codes.
BEARBEITET - Okay, jetzt müssen Sie eine Actions-Klasse erstellen und nach einer Action suchen (z. B. "Lampe holen" oder "Schwert fallen lassen"). Zur Vereinfachung benötigen Sie ein RoomScan-Objekt oder eine RoomScan-Methode, um alle im Bereich sichtbaren Objekte und nur die Objekte in dieser Aktion zu scannen. Das Objekt selbst handhabt die Aktionsbehandlung. Standardmäßig sollte eine Item-Klasse alle bekannten Aktionen auf eine Standardweise handhaben, die überschrieben werden kann. Wenn ein Gegenstand, den Sie "bekommen" möchten, beispielsweise von einem Nicht-Spieler-Charakter gehalten wird, sollte die Standardantwort für das Halten dieses Gegenstands durch seinen Besitzer ungefähr so lauten: "Das lässt Sie nicht zu." Jetzt müssten Sie in der Item- oder Thing-Klasse eine Menge Standardaktionsantworten dafür erstellen. Dies kommt im Grunde genommen aus der Sicht von Tads3 auf das gesamte Design. Denn in Tads3 hat jedes Element seine eigene Standardroutine für die Aktionsbehandlung, die der Parser aufruft, wenn eine Aktion darauf initialisiert wird. Also ... ich sage Ihnen nur, Tads3 hat all dies bereits implementiert, so dass es SEHR einfach ist, in einem Textabenteuer in dieser Sprache zu programmieren. Aber wenn Sie es von Grund auf neu machen möchten, wie in Java (oben), dann würde ich persönlich damit genauso umgehen, wie Tads3 entworfen wurde. Auf diese Weise können Sie Standardaktionen überschreiben, die Routinen für verschiedene Objekte selbst verarbeiten. Wenn Sie also beispielsweise "Lampe abrufen" möchten und der Butler diese festhält, kann dies eine Antwort in der Standardaktionsmethode "Get" für Item auslösen oder Wenden Sie sich an und sagen Sie: "Der Butler weigert sich, die Messinglampe abzugeben." Ich meine ... wenn Sie lange genug wie ich Programmierer waren, dann ist das alles SEHR einfach. Ich bin über 50 Jahre alt und mache dies seit meinem siebten Lebensjahr. Mein Vater war in den siebziger Jahren ein Hewlett Packard-Ausbilder, also lernte ich von ihm zunächst eine TON in Computerprogrammierung. Ich bin jetzt auch als Serveradministrator in den US Army Reserves. Ähm ... ja, also gib nicht auf. Es ist nicht so schwer, wenn Sie es auf das herunterbrechen, was Ihr Programm tun soll. Manchmal ist Versuch und Irrtum der beste Weg, um solche Dinge zu tun. Einfach testen und sehen und niemals aufgeben. Okay? Codierung ist eine Kunst. Dies kann auf viele verschiedene Arten geschehen. Lassen Sie sich von der einen oder anderen Seite nicht vom Design abhalten. Ich bin auch in den US Army Reserves als Server Administrator tätig. Ähm ... ja, also gib nicht auf. Es ist nicht so schwer, wenn Sie es auf das herunterbrechen, was Ihr Programm tun soll. Manchmal ist Versuch und Irrtum der beste Weg, um solche Dinge zu tun. Einfach testen und sehen und niemals aufgeben. Okay? Codierung ist eine Kunst. Dies kann auf viele verschiedene Arten geschehen. Lassen Sie sich von der einen oder anderen Seite nicht vom Design abhalten. Ich bin auch in den US Army Reserves als Server Administrator tätig. Ähm ... ja, also gib nicht auf. Es ist nicht so schwer, wenn Sie es auf das herunterbrechen, was Ihr Programm tun soll. Manchmal ist Versuch und Irrtum der beste Weg, um solche Dinge zu tun. Einfach testen und sehen und niemals aufgeben. Okay? Codierung ist eine Kunst. Dies kann auf viele verschiedene Arten geschehen. Lassen Sie sich von der einen oder anderen Seite nicht vom Design abhalten.