2015-08-08 50 views
4

我正在使用C++爲一個學校項目創建一個基於文本的遊戲,遊戲通過允許用戶從每個場景中的選項列表中選擇一個選項來工作;類似於Choice of Games託管的遊戲的工作方式。由於這個原因,我有大量的文本必須顯示在我的遊戲中,但是我無法確定在程序中處理大量文本時的正確約定。我應該簡單地使用std :: cout並將文本直接寫入代碼中,或者我應該將文本文件寫入使用的std :: ifstream以讀取文本。基於C++文本的遊戲中的文本應該在代碼中還是在外部文件中?

我唯一主要關心的是使用文件來保存文本,因爲每次選擇用戶都會顯示不同的段落結果,因此我相信我需要爲每個段落創建一個文本文件,這似乎會導致更多的問題(比如使用錯誤的文件名或者使我的代碼誤導致遊戲從錯誤的文件中讀取),而不是直接將代碼寫入代碼。如果有一種方法可以讀取文本文件的特定部分,那麼知道這一點很有用,但是我目前還不知道這種方法。然而,我對C++是新手,我確信有很多我還沒有學習,所以如果這樣的方法確實存在,我不會感到驚訝。

任何幫助都非常感謝,無論是簡單地告訴我是否應該將文本輸入到我的代碼或文件中,告訴我是否有方法從文本文件的特定部分讀取文本。再次,我非常感謝您提供的任何幫助。

回答

3

我推薦使用外部文件。它使得內容的更改變得更加容易,並且不需要重新編譯整個程序以獲得簡單的錯字。

您可以使用一個文件,並用空行將每個段落分開。在這一點上抓住「空行之間的所有文本」是微不足道的。

如果選項導致段落選擇跳過文件,您可以給它們ID並通過在文件中線性搜索給定ID來即時加載它們。

- 編輯 -

作爲每這裏請求是一種算法或兩個:

算法1:

  1. 給每個段的ID,通常一個簡單的數字就行在段落的正上方。
  2. 用空行分隔每個數字段落對。
  3. 逐行解析文件,尋找僅包含數字的「行」。
  4. 從那一刻起,你找到了你正在尋找的段落,直到下一個空白處爲止,這段文字的內容才被刪除。
  5. 顯示給用戶。

算法2(推薦):

  1. 使用XML來存儲你的段落和它們的ID。
  2. 使用TinyXML2解析文件:http://www.grinninglizard.com/tinyxml2/index.html
+1

你有解釋(或鏈接到一個),你如何選擇從哪個段落讀取? –

10

請不要把顯示的文字轉換成代碼。這是一個反模式。您必須重新編譯您的遊戲,以便進行每次小的文本更改(如修改拼寫錯誤),以及進行重大更改(如翻譯爲其他語言)。

大多數編程語言的慣例是將所有顯示的文本放入(幾個)資源文件或屬性文件中作爲鍵值對,其中代碼僅引用要顯示的段落的鍵,值將爲從該外部文件加載。 (通常在啓動時一次)。不需要爲每個段落使用一個文件,但是必須解析kv對。將會有實用程序供您重複使用。

3

如果你不打算給你的遊戲翻譯成其他語言,你是你自己的,這兩種方法都有其優缺點:在源

  • 文:易寫,文字接近的地方它在哪裏使用。
  • 資源文件中的文本:更容易刪除重複的字符串,強制更好的文本數據結構。

如果你只是想象你的應用程序可以被翻譯,那麼你應該把所有文本放在源文件中。你甚至可以找到框架,這將有助於你的翻譯爲Gnu gettext,但你可以找到其他人,例如qt有它自己的翻譯工具。

3

在程序文件中存儲文本不是一個好的編程習慣。這會導致不必要的代碼膨脹(它甚至不是代碼),如果需要更改文本,則需要重新編譯。

一個簡單的解決方案就是創建一個文本文件,並仔細格式化,例如行號或空格,以便您可以取出所需的文本。

更優雅的解決方案是將必要的文本放在xml或json文件中,並在必要時將它們讀入您的程序中。這將是一個不錯的選擇。