Tạo mô tả tấn công theo kiểu MUD đúng ngữ pháp


13

Tôi hiện đang làm việc trên một trò chơi dựa trên văn bản, trong đó kết quả của một vòng chiến đấu diễn ra như thế này

%attacker% inflicts a serious wound (12 points damage) on %defender%

Ngay bây giờ, tôi chỉ trao đổi% kẻ tấn công% với tên của kẻ tấn công và% defender% cho tên của người phòng thủ. Tuy nhiên, mô tả hoạt động, nhưng không đọc chính xác. Vì trò chơi chỉ là tất cả văn bản, tôi không muốn sử dụng các mô tả chung chung (chẳng hạn như "Bạn sử dụng Tấn công yêu tinh để kiếm 5 điểm", có thể giải quyết vấn đề)

Làm cách nào để tạo mô tả chính xác cho các trường hợp trong đó% kẻ tấn công% đề cập đến

  • "Bạn", người chơi? "Bạn gây ra ..." là sai
  • "Ong", hay số nhiều khác? Tôi cần bằng cách nào đó để biết tôi nên thêm tiền tố vào tên "The"
  • Nếu% kẻ tấn công% là một danh từ chung chung, chẳng hạn như "Yêu tinh", nó sẽ đọc kỳ lạ trái ngược với% kẻ tấn công% là một tên. So sánh "Yêu tinh gây ra ..." so với "Thanh kiếm Aldraic gây ra ...."

Làm thế nào để các trò chơi dựa trên văn bản thường giải quyết các vấn đề như vậy?

Câu trả lời:


15

Cách tiếp cận% kẻ tấn công% có thể được mở rộng để bao gồm một số thông tin khác ngoài tên của các đối tượng:

  1. Động từ có thể là số ít hoặc số nhiều. Điều này phụ thuộc vào đối tượng. "Bạn tấn công X" (đối tượng người thứ 2 số ít) so với "Extrakun tấn công X" (đối tượng người thứ 3 số ít) so với "Yêu tinh tấn công X" (đối tượng người thứ 3 số nhiều). Hầu hết các động từ chỉ cần -sthêm nhưng có một vài ngoại lệ.
  2. Danh từ có thể là một danh từ riêng (" Goblin Tấn công X") hoặc một danh từ chung (" Một yêu tinh tấn công X"). Các danh từ chung bắt đầu bằng âm nguyên âm nên sử dụng "an" thay vì "a". Nó có thể là một danh từ chung nhưng chỉ có một trường hợp trong bối cảnh hiện tại (" Yêu tinh tấn công X").
  3. Danh từ có thể thay đổi về số lượng, từ số không ("Bạn đánh không có yêu tinh ") thành một ("Bạn đánh một con yêu tinh ") thành nhiều ("Bạn đánh ba con yêu tinh "). Nhiều danh từ chỉ cần một -shoặc -esthêm nhưng có nhiều trường hợp ngoại lệ.
  4. Đối tượng và đối tượng có thể đơn giản (" Một con yêu tinh ") hoặc hợp chất (" Một con yêu tinh và anh trai của cô ấy ").
  5. Các danh từ chung ở đầu câu cần được viết hoa, nhưng nếu danh từ đó có một bài viết hoặc nếu đó là từ ghép bạn muốn chỉ viết hoa từ đầu tiên. Danh từ thích hợp luôn được viết hoa.
  6. Vị trí chủ ngữ (" Cô ấy đánh con yêu tinh") và vị trí đối tượng ("Con yêu tinh đánh cô ấy ") sử dụng các đại từ khác nhau.
  7. Sở hữu có thể được tạo ra bằng cách thêm 'snếu số ít (" Rìu của yêu tinh "), 'nếu số nhiều ("Hai trục của yêu tinh "), nhưng đại từ có quy tắc riêng (" Rìu của bạn ").

Đối với tiếng Anh, tôi đã viết cho Python một thư viện tạo văn bản có nguồn gốc từ MUD có tên là JaysHouseMOO. Hãy nghiên cứu hoặc sao chép . Nó không có một thư viện tốt các trường hợp đặc biệt; bạn sẽ phải thêm nó với các từ được sử dụng trong trò chơi của bạn. Tôi sợ mã được chuyển của tôi không được kiểm tra rộng rãi. Nó cũng có thể cần thêm các trường hợp được thêm vào cho các trò chơi (nó được thiết kế cho MUD xã hội, không phải MUD chơi game).

Ví dụ của bạn sẽ được viết là "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Những con số %1, %2, %3nói với nó mà đối tượng sẽ được thay thế; I/ ibảo nó thêm một bài viết gián tiếp ("a", "an") nếu cần; nnói với nó để hiển thị danh từ mà không có bài viết; :(inflicts)nói với nó để chia động từ cho đối tượng đó.

Đây là đầu ra để hiển thị cho kẻ tấn công, người phòng thủ và cho mọi người khác:

$ python
>>> import msg
>>> m = "%1I %1:(inflicts) a serious wound (%2n damage) on %3i."
>>> attacker = msg.GenderedObject('Amit', 'm', 'proper')
>>> defender = msg.GenderedObject('goblin', 'm', 'unique')
>>> points = (12, 'point')
>>> msg.Msg().sub_parties({1: attacker, 2: points, 3: defender}, 
                          m, [attacker, defender])
(['You inflict a serious wound (12 points damage) on the goblin.', 
  'Amit inflicts a serious wound (12 points damage) on you.'], 
 'Amit inflicts a serious wound (12 points damage) on the goblin.')

Lưu ý nếu bạn đã cho nó, (1, 'point')nó sẽ được in "1 điểm" thay vì "1 điểm". Đó là điều khiến tôi gặp rắc rối trong văn bản trò chơi, vì vậy tôi đảm bảo bao gồm một tính năng để dễ dàng in đúng.

Đây là một ví dụ khác, với danh từ ghép và "a" vs. "an":

>>> m = "%1I %1:(hits) %2'n %2'(head)."
>>> a1 = msg.GenderedObject('goblin', 'm', 'normal')
>>> a2 = msg.GenderedObject('orc', 'm', 'normal')
>>> d1 = msg.GenderedObject('Amit', 'm', 'proper')
>>> d2 = msg.GenderedObject('Extrakun', 'm', 'proper')
>>> msg.Msg().sub_parties({1: [a1, a2], 2: [d1, d2]}, m, [d1, d2])
(["A goblin and an orc hit your and Extrakun's heads.", 
  "A goblin and an orc hit Amit's and your heads."], 
 "A goblin and an orc hit Amit's and Extrakun's heads.")

Những ví dụ này bằng tiếng Anh, và chỉ theo dõi nam / nữ, đại từ, động từ số ít / số nhiều / danh từ và danh từ riêng / chung. Những gì bạn cần theo dõi sẽ khác nhau giữa các ngôn ngữ và loại văn bản trong trò chơi của bạn. Trong tiếng Tây Ban Nha có đại từ chính thức và không chính thức. Một số ngôn ngữ có dạng động từ nam tính và nữ tính. Đại từ tiếng Nhật phụ thuộc vào trạng thái của chủ ngữ so với đối tượng. Trong một số ngôn ngữ, cách chia động từ có thể bao gồm chủ ngữ. Xác định tất cả các loại văn bản bạn muốn tạo và ngôn ngữ bạn muốn dịch và điều đó sẽ cho bạn biết những gì bạn cần theo dõi trong các đối tượng trò chơi của mình. Khi bạn đang tạo nội dung, bạn có thể bao gồm các chú thích cần thiết và các trường hợp đặc biệt.


1
+1, tóm tắt tuyệt vời về các vấn đề. Một điều tôi sẽ nói thêm là người chơi có xu hướng khá tha thứ cho các lỗi ngữ pháp nhỏ đối với văn bản được tạo như thế này miễn là phần còn lại của thông tin (lượng thiệt hại, nguồn, mục tiêu, procs) là chính xác - bắn đúng ngữ pháp 95% , bởi vì 5% cuối cùng là khó khăn vô lý.

6

Thay vì có một chuỗi duy nhất và cố gắng thay thế nó đúng cách, bạn có thể có cả một chuỗi chúng. Bắt đầu với các đối tượng. Bạn biết đấy, khi tạo mob, nên gọi nó là gì. Bạn có thể cung cấp cho nó một thuộc tính cụ thể, tách biệt với tên của nó, để thay thế thành chuỗi tấn công. Vũ khí có thể có nhiều chuỗi cho sự đa dạng, và có thể thay thế chi tiết hơn. Thay vì 'kẻ tấn công', họ có thể hỏi cụ thể về 'kẻ tấn công-đại từ' hoặc 'tên kẻ tấn công'. Mob cũng có thể có phiên bản số nhiều của các số nhận dạng này, nếu 'ong' của bạn được đại diện bởi nhiều mob và không chỉ một mob duy nhất tình cờ được gọi là 'ong'.

Vì vậy, bạn sẽ có một mob như

name = goblin
pronoun = he
plural = goblins
proper = goblin
common = a goblin
specific_common = the goblin
possessive = the goblin's
possessive_pronoun = his

Sau đó, chuỗi tấn công của bạn yêu cầu các mục cụ thể như vậy ..

% kẻ tấn công-đại từ% hit% defender-đặc biệt_common% cho% damage%! % defender-đại từ% thực sự cảm thấy rằng một!


5

Có một bộ mô-đun cho Perl bắt đầu với Lingua :: EN :: Inflect liên quan đến các vấn đề này. Ngay cả khi bạn đang sử dụng một ngôn ngữ khác, các lựa chọn API được thực hiện có thể giúp bạn đóng khung thiết kế của riêng bạn.


Tiện lợi! Cũng có một cổng Python của thư viện này: pypi.python.org/pypi/inflect/0.2.1
amitp

3

Cách tôi xử lý điều này là thông qua một tập hợp lớn hệ thống, trong số những thứ khác, liên quan đến việc mô hình hóa thông điệp dưới dạng cấu trúc dữ liệu chứ không phải là một chuỗi. Các giá trị cho kẻ tấn công và người phòng thủ là đối tượng thực tế của chúng; động từ ("inflict" trong tin nhắn của bạn) được đánh dấu như vậy và biết đối tượng cho người thực hiện nó, để trình kết xuất tin nhắn biết rằng nó cần được hiển thị ở ngôi thứ nhất cho diễn viên và người thứ hai cho mọi người khác. Các đối tượng cũng biết liệu danh từ của họ có phù hợp hay không (và do đó, nên áp dụng "the" hay "a / an" cho họ), có những mô hình dữ liệu cho phép tôi chỉ định rằng "the" hoặc "a / an "Thông thường sẽ được dự kiến ​​sẽ được áp dụng cho một danh từ không phù hợp ở vị trí đó, và nhiều hơn nữa.

Chủ đề này trên Mudconnector rất giống với câu hỏi của bạn và tôi đi sâu vào chi tiết hệ thống của tôi ở đó. Về cơ bản, cách tôi làm là những gì bạn muốn nếu bạn muốn hoàn toàn không bị ràng buộc bởi các khả năng cơ bản của hệ thống nhắn tin của bạn và sẵn sàng trả giá khi học. (Giống như vi so với nano.)


0

Tôi sẽ khuyên bạn nên KISS (giữ cho nó đơn giản một cách ngu ngốc) và khai thác lợi thế của giao diện văn bản.

Đơn giản hóa, đơn giản hóa, đơn giản hóa càng nhiều càng tốt. Loại bỏ sự phức tạp trước khi bạn bắt đầu nghĩ về tiền mã hóa. Thay vì một câu, hãy sử dụng hai câu để mô tả một sự kiện, giống như nhiều trò chơi khác. Bạn có nhớ cổng của Baldur không? Đây không phải là một trò chơi văn bản, nhưng thiệt hại được mô tả bằng văn bản;)


Phân chia thông tin giữa nguồn của sự kiện và hậu quả của nó.

Ví dụ :

  • Merlin sử dụng một câu thần chú của quả cầu lửa.
  • Madmax bị trúng 3 điểm sát thương.
  • Một con yêu tinh bị trúng 2 điểm lửa.
  • Một con yêu tinh bị trúng 10 điểm lửa.
  • Vân vân...

Tôi cũng khuyên bạn nên luôn luôn sử dụng số ít người thứ ba, nó sẽ là danh từ riêng hoặc chung.

Hơn nữa, mặc dù tiếng Anh là ngôn ngữ quốc tế quan trọng, nhưng nếu bạn muốn có nhiều tác động về mặt cảm xúc và chạm đến một thị trường lớn hơn, bạn có thể cần phải dịch trò chơi của mình sang các ngôn ngữ khác.

Nếu bạn có ý định làm như vậy, hãy lưu ý rằng cấu trúc câu có thể khác nhau trong các ngôn ngữ khác. Theo Wikipedia , 45% ngôn ngữ có sẵn xây dựng câu theo thứ tự SOV (chủ ngữ-đối tượng-động từ), trong đó 42% (như tiếng Anh) xây dựng câu theo thứ tự SVO; như tiếng anh


Baldur's Gate có một công cụ đồ họa đầy đủ để đi kèm với nó để hiển thị đầu ra, nhưng đối với một tiểu thuyết tương tác, văn bản là tất cả giao diện và phản hồi ở đó. Nó nên được đánh bóng hơn cho trường hợp đó, IMHO.
Extrakun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.