ฉันใช้เครื่องมือ Tads3 (www.tads3.org) สำหรับการผจญภัยข้อความที่ฉันเขียน มันมากขึ้นสำหรับโปรแกรมเมอร์คอมพิวเตอร์ แต่ภาษาที่ทรงพลังมาก หากคุณเป็นโปรแกรมเมอร์ Tads3 จะสามารถเขียนโค้ดได้เร็วกว่า Inform7 ซึ่งฉันเคยใช้มาก่อนเช่นกัน ปัญหากับโปรแกรม Inform7 สำหรับโปรแกรมเมอร์นั้นมีชื่อเสียงโด่งดังในฐานะ "เดาคำกริยา" สำหรับผู้เล่นที่ชอบผจญภัยข้อความในกรณีที่คุณไม่ได้เขียนประโยคของคุณอย่างระมัดระวังคุณจะต้องทำลายเกม หากคุณมีความอดทนที่จะทำคุณสามารถเขียน parser ใน Java โดยใช้คลาส Tokenizer ตัวอย่างที่ฉันเขียนโดยใช้ JTextArea ทั่วโลกและสตริงทั่วโลก [] มันจะแยกอักขระที่ไม่ต้องการออกจาก 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 และในโมฆะหลักคงที่โมฆะสาธารณะ () ของคุณเพียงแค่สร้างตัวอย่างของมัน หวังว่ารหัสนี้จะช่วยได้บ้าง
แก้ไข - เอาล่ะดังนั้นตอนนี้สิ่งที่คุณต้องทำต่อไปคือสร้างคลาสการกระทำและสแกนหาการกระทำ (เช่น "รับหลอดไฟ" หรือ "วางดาบ") เพื่อให้ง่ายขึ้นคุณจะต้องมีวัตถุหรือวิธีการ RoomScan เพื่อสแกนทุกสิ่งที่มองเห็นได้ในขอบเขตและสแกนหาวัตถุเหล่านั้นในการกระทำนั้นเท่านั้น วัตถุเองจัดการการจัดการการกระทำและโดยค่าเริ่มต้นคุณควรมีคลาสรายการจัดการการกระทำที่รู้จักทั้งหมดในวิธีการเริ่มต้นซึ่งสามารถ over - ridden ตอนนี้ถ้าเช่นรายการที่คุณต้องการที่จะ "รับ" ถูกเก็บไว้โดยตัวละครที่ไม่ใช่ผู้เล่นการตอบสนองเริ่มต้นสำหรับการรับไอเท็มที่เจ้าของรายการนั้นควรจะเป็นเช่น "การไม่ยอมให้คุณมี" ตอนนี้คุณต้องสร้างการตอบกลับการกระทำเริ่มต้นเป็นตันในรายการหรือชั้นสิ่ง นี่คือพื้นฐานมาจากมุมมองของ Tads3 ในทุกการออกแบบ เนื่องจากใน Tads3 แต่ละไอเท็มมีรูทีนการจัดการแอ็คชันเริ่มต้นของตัวเองซึ่ง parser เรียกว่าหากมีการเริ่มต้นแอ็คชัน ดังนั้น ... ฉันแค่บอกคุณ Tads3 มีสิ่งนี้อยู่แล้วดังนั้นมันง่ายมากที่จะเขียนโค้ดในการผจญภัยข้อความในภาษานั้น แต่ถ้าคุณต้องการที่จะทำตั้งแต่เริ่มต้นเช่นใน Java (ด้านบน) จากนั้นฉันจะจัดการกับมันแบบเดียวกับที่ Tads3 ได้รับการออกแบบ ด้วยวิธีนี้คุณสามารถแทนที่การกระทำเริ่มต้นที่จัดการกิจวัตรบนวัตถุที่แตกต่างกันได้เองตัวอย่างเช่นหากคุณต้องการ "รับหลอดไฟ" และผู้ดูแลถือไว้ หรือวัตถุแล้วบอกคุณว่า "พ่อบ้านปฏิเสธที่จะมอบตะเกียงทองเหลือง" ฉันหมายถึง ... เมื่อคุณเป็นโปรแกรมเมอร์มานานพอที่ฉันมีแล้วนี่คือสิ่งที่ง่ายมาก ฉันอายุมากกว่า 50 ปีและทำสิ่งนี้มาตั้งแต่อายุ 7 ขวบพ่อของฉันเป็นอาจารย์สอนของฮิวเลตต์แพคการ์ดในยุค 70 ดังนั้นฉันจึงเรียนรู้ TON จากเขาในตอนแรกเกี่ยวกับการเขียนโปรแกรมคอมพิวเตอร์ ฉันยังอยู่ใน US Army Reserve เพราะโดยทั่วไปเป็นผู้ดูแลเซิร์ฟเวอร์แล้ว อืมใช่แล้วอย่ายอมแพ้ ไม่ใช่เรื่องยากเมื่อคุณแยกแยะสิ่งที่คุณต้องการให้โปรแกรมทำ บางครั้งการลองผิดลองถูกเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ เพียงแค่ทดสอบและดูและไม่เคยยอมแพ้ ตกลง? การเข้ารหัสเป็นศิลปะ สามารถทำได้หลายวิธี อย่าให้ทางใดทางหนึ่งดูเหมือนจะบล็อกคุณในมุมของการออกแบบ m ยังอยู่ใน US Army Reserve ซึ่งโดยทั่วไปเป็นผู้ดูแลเซิร์ฟเวอร์ในขณะนี้ อืมใช่แล้วอย่ายอมแพ้ ไม่ใช่เรื่องยากเมื่อคุณแยกแยะสิ่งที่คุณต้องการให้โปรแกรมทำ บางครั้งการลองผิดลองถูกเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ เพียงแค่ทดสอบและดูและไม่เคยยอมแพ้ ตกลง? การเข้ารหัสเป็นศิลปะ สามารถทำได้หลายวิธี อย่าให้ทางใดทางหนึ่งดูเหมือนจะบล็อกคุณในมุมของการออกแบบ m ยังอยู่ใน US Army Reserve ซึ่งโดยทั่วไปเป็นผู้ดูแลเซิร์ฟเวอร์ในขณะนี้ อืมใช่แล้วอย่ายอมแพ้ ไม่ใช่เรื่องยากเมื่อคุณแยกแยะสิ่งที่คุณต้องการให้โปรแกรมทำ บางครั้งการลองผิดลองถูกเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ เพียงแค่ทดสอบและดูและไม่เคยยอมแพ้ ตกลง? การเข้ารหัสเป็นศิลปะ สามารถทำได้หลายวิธี อย่าให้ทางใดทางหนึ่งดูเหมือนจะบล็อกคุณในมุมของการออกแบบ