2013-11-15 65 views
0

我正在製作一個基於文本的遊戲的控制檯應用程序,我需要保存諸如HP和Money之類的值,並且能夠稍後檢索它們。C# - 保存控制檯遊戲值

我試過使用設置,但問題是,他們依靠文件名和文件路徑,這意味着如果他們中的一個發生了變化,整個保存將不會被加載(這是一個問題,因爲大多數玩家會更改文件名稱)。

所以,我希望能夠將所有變量值保存到文本文件並稍後檢索它們。

是否有可能有效地做出這樣的事情?

謝謝,如果有人可以幫忙。

回答

0

一個選項是保存到My Documents中的文件(或子文件夾中的文件)。

要獲得路徑 - Environment.GetFolderPathMyDocuments

var root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); 
var fileName = Path.Combine(root, "MyGame.sav"); 

比讀/寫設置你喜歡的任何方式。

你也可以考慮其他文件夾一樣LocalApplicationData ...

+0

閱讀/寫作是我面臨的主要問題......是否有一種高效但不太複雜的方法來處理所有變量? – BlueRay101

+0

@ BlueRay010 ...存儲JSON或使用XmlSerialization非常容易,但從大多數角度來看並不「高效」(除了正確性,數據的可讀性和編寫代碼的簡易性)。您需要提供更多信息以獲得您問題「高效」部分的良好答案。 –

+0

好的,我的意思是將所有變量保存到.txt文件,然後從文本文件中檢索它們。我想盡可能縮短這一點。我該怎麼做? – BlueRay101

2

你可以使用簡單的類由IO命名空間提供的文件操作。
在這裏你可以找到無數的例子

Common I/O Tasks

但總而言之,我建議按照這個僞

  • 找到您要存儲的數據
  • 創建這個文件的文件夾文件夾
  • 用你的變量準備一個緩衝區來寫入
  • 關閉t他提交

因此,讓我們開始第一個任務

string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
string folder = Path.Combine(folder, "myappNameDataFolder"); 
Directory.CreateDirectory(folder); 
string dataFile = Path.Combine(folder, "myappNameDataFile"); 

在這裏,我們試圖建立由Windows常見到這臺計算機的所有用戶應用數據保留的特殊文件夾內的文件夾。請參閱枚舉Environment.SpecialFolder。這是存儲您的值的最佳位置,因爲您擁有在其中讀取/寫入文件的所有權限。

現在你準備使用普通StreamWriter類

using(StreamWriter sw = new StreamWriter(dataFile, true)) 
{ 
    .... 

在上面的語句中,StreamWriter的是用塊內創建,以確保其關閉,並在年底摧毀創建該文件夾中文件封閉塊。

現在您可以構建緩衝區來存儲變量。在這裏,我只顯示一個變量,我想,這些變量在該點的代碼

StringBuilder sb = new StringBuilder(); 
    sb.Append("HP=" + valueForHPToSave.ToString(); 
    .... other variables follow this line 

的可寫緩衝區流和關閉和處置流

sw.Write(sb.ToString()); 
} 

反向操作(讀取應用程序啓動時的值)只是使用StreamReader,ReadAllLines並在等號處拆分每行以恢復原始值的問題

另一種方法是使用由幀提供的內置serialization mechanism掃。
在這種情況下你建立了一個名爲AppState類和你同Serializable屬性標記它

using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

[Serializable()] 
public class AppState 
{ 
    public int HPValue {get; set;} 
    .... other variables to store/read from the serialization stream 
} 

這樣做的目的是存儲恢復所需的所有變量有這個類寫入和磁盤加載的一個實例您的應用程序的狀態。

現在,您可以在主類中聲明AppState類的全局實例,並開始在執行應用程序期間存儲值。

public class Program 
{ 
    public static AppState stateVariables = new AppState(); 

    public static void Main() 
    { 
      // read back the values of stateVariables here... (see later) 
      ... 
      stateVariables.HPValue = 100; 
      ... 
    } 
} 

當應用程序關閉你應用程序啓動時你回使用類似的方法

public class Program 
{ 
    public static AppState stateVariables = new AppState(); 

    public static void Main() 
    { 
      string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
      string folder = Path.Combine(folder, "myappNameDataFolder"); 
      Directory.CreateDirectory(folder); 
      string dataFile = Path.Combine(folder, "myappNameDataFile"); 
      if (File.Exists(dataFile)) 
      { 
       using(Stream stateStream = File.OpenRead(dataFile)) 
       { 
        BinaryFormatter deserializer = new BinaryFormatter(); 
        stateVariables = (AppState)deserializer.Deserialize(stateStream); 
       } 
      } 
    } 
} 

請仔細閱讀值使用這樣

string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
string folder = Path.Combine(folder, "myappNameDataFolder"); 
Directory.CreateDirectory(folder); 
string dataFile = Path.Combine(folder, "myappNameDataFile"); 
using(Stream stateStream = File.Create(dataFile)) 
{ 
    BinaryFormatter serializer = new BinaryFormatter(); 
    serializer.Serialize(stateStream, stateVariables); 
} 

代碼寫你的類的實例,注意我沒有測試過這個代碼,並且要完全理解,請看更多關於Serialization on MSDN

+0

非常感謝,但是沒有更簡單的方法嗎?例如,我看到有人使用數據和類似的東西來更快地將值寫入文本文件。 – BlueRay101

+0

+1。作爲構建保存位置的示例。我會避免發明自定義文本格式,而不是使用標準的JSON/XML ...也可能需要一些自定義的二進制序列化來實現一些(未定義的)性能目標。 –

+0

@AlexeiLevenkov可能你是對的。太多的細節丟失,這只是一個起點OP – Steve