Tôi đã sử dụng công cụ Tads3 (www.tads3.org) cho một số cuộc phiêu lưu văn bản tôi đã viết. Đó là nhiều hơn cho các lập trình viên máy tính mặc dù nhưng một ngôn ngữ rất mạnh mẽ. Nếu bạn là lập trình viên, Tads3 sẽ dễ dàng viết mã mọi thứ nhanh hơn so với Inform7, điều mà tôi đã sử dụng trước đây. Vấn đề với Inform7 dành cho lập trình viên cũng nổi tiếng như "đoán động từ" dành cho người chơi phiêu lưu văn bản ở chỗ nếu bạn không viết câu RẤT cẩn thận, bạn sẽ phá game. Nếu bạn đủ kiên nhẫn để làm điều đó, bạn có thể dễ dàng viết một trình phân tích cú pháp trong Java bằng cách sử dụng lớp Tokenizer. Ví dụ tôi đã viết bằng mảng JTextArea toàn cầu và mảng String [] toàn cầu. Nó loại bỏ các ký tự không mong muốn ngoại trừ lá AZ và 0-9 cũng như dấu chấm hỏi (cho phím tắt lệnh "trợ giúp"):
// 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
... Tôi đã bỏ qua định nghĩa lớp chính và phương thức khởi tạo biến (), v.v. bởi vì nó được giả sử nếu bạn biết Java, bạn đã biết cách thiết lập nó. Lớp chính cho điều này có lẽ nên mở rộng JFrame và trong phương thức void static () tĩnh công khai của bạn chỉ cần tạo một thể hiện của nó. Hy vọng rằng một số mã này sẽ giúp.
EDITED - Được rồi, vì vậy bây giờ những gì bạn sẽ làm tiếp theo là tạo một lớp Hành động và quét một hành động (tức là "lấy đèn" hoặc "thả kiếm"). Để đơn giản hơn, bạn phải có một đối tượng hoặc phương thức RoomScan để quét mọi thứ hiển thị trong phạm vi và chỉ quét những đối tượng trên hành động đó. Đối tượng tự xử lý việc xử lý hành động và theo mặc định, bạn nên có một lớp Item xử lý tất cả các hành động đã biết theo cách mặc định, có thể bị quá tải. Bây giờ, nếu ví dụ, một vật phẩm bạn muốn "lấy" được giữ bởi một nhân vật không phải người chơi, thì phản hồi mặc định để nhận vật phẩm đó do chủ sở hữu của nó nắm giữ sẽ là một cái gì đó như "The will let you have it". Bây giờ bạn phải tạo một tấn phản hồi hành động mặc định cho điều này trong lớp Item hoặc Thing. Điều này về cơ bản đến từ một quan điểm Tads3 trên tất cả các thiết kế. Bởi vì trong Tads3, mỗi mục có thói quen xử lý hành động mặc định riêng trên nó mà trình phân tích cú pháp gọi nếu một hành động trên nó được khởi tạo. Vì vậy, ... tôi chỉ nói với bạn rằng, Tads3 đã có sẵn tất cả những thứ này, vì vậy thật dễ dàng để viết mã trong một cuộc phiêu lưu văn bản bằng ngôn ngữ đó. Nhưng nếu bạn muốn làm điều đó từ đầu, như trong Java (ở trên), thì cá nhân tôi sẽ xử lý nó giống như cách Tads3 được thiết kế. Theo cách đó, bạn có thể ghi đè các hành động mặc định xử lý các thói quen trên các đối tượng khác nhau, vì vậy, ví dụ nếu bạn muốn "lấy đèn" và quản gia đang giữ nó, nó có thể kích hoạt phản hồi trong phương thức hành động "lấy" mặc định cho Mục hoặc Object và nói với bạn rằng "Người quản gia từ chối trao chiếc đèn bằng đồng." Ý tôi là ... một khi bạn đã là một lập trình viên đủ lâu như tôi có, thì đây là tất cả những thứ RẤT dễ dàng. Tôi đã hơn 50 tuổi và đã làm việc này từ khi tôi 7 tuổi. Cha tôi là một hướng dẫn viên của Hewlett Packard vào những năm 70 nên tôi đã học được một TON từ ông ban đầu về lập trình máy tính. Hiện tại tôi cũng đang ở trong Quân đội Hoa Kỳ, về cơ bản là quản trị viên máy chủ. Ừm ... ừ, vậy đừng bỏ cuộc. Không khó lắm một khi bạn thực sự chia nhỏ nó thành những gì bạn muốn chương trình của bạn làm. Đôi khi thử và sai là cách tốt nhất để tiếp tục loại công cụ này. Chỉ cần kiểm tra nó và xem và đừng bao giờ bỏ cuộc. Được chứ? Viết mã là một nghệ thuật. Nó có thể được thực hiện theo nhiều cách khác nhau. Đừng để cách này hay cách khác dường như chặn bạn vào một góc trên thiết kế. m cũng trong Quân đội Hoa Kỳ về cơ bản là một quản trị viên máy chủ. Ừm ... ừ, vậy đừng bỏ cuộc. Không khó lắm một khi bạn thực sự chia nhỏ nó thành những gì bạn muốn chương trình của bạn làm. Đôi khi thử và sai là cách tốt nhất để tiếp tục loại công cụ này. Chỉ cần kiểm tra nó và xem và đừng bao giờ bỏ cuộc. Được chứ? Viết mã là một nghệ thuật. Nó có thể được thực hiện theo nhiều cách khác nhau. Đừng để cách này hay cách khác dường như chặn bạn vào một góc trên thiết kế. m cũng trong Quân đội Hoa Kỳ về cơ bản là một quản trị viên máy chủ. Ừm ... ừ, vậy đừng bỏ cuộc. Không khó lắm một khi bạn thực sự chia nhỏ nó thành những gì bạn muốn chương trình của bạn làm. Đôi khi thử và sai là cách tốt nhất để tiếp tục loại công cụ này. Chỉ cần kiểm tra nó và xem và đừng bao giờ bỏ cuộc. Được chứ? Viết mã là một nghệ thuật. Nó có thể được thực hiện theo nhiều cách khác nhau. Đừng để cách này hay cách khác dường như chặn bạn vào một góc trên thiết kế.