C#-保存控制台游戏值

C#-保存控制台游戏值,c#,variables,save,C#,Variables,Save,我正在制作一个控制台应用程序,它是一个基于文本的游戏,我需要保存诸如HP和Money之类的值,并能够在以后检索它们 我尝试过使用设置,但问题是它们依赖于文件名和文件路径,这意味着如果其中一个更改,则不会加载整个保存(这是一个问题,因为大多数玩家都会更改文件名) 所以我希望能够将变量的所有值保存到文本文件中,并在以后检索它们 这有可能使这样的事情更有效率吗 如果有人能帮忙,谢谢。一个选项是将文件保存到我的文档中的文件(或子文件夹中的文件) 获得路径 而不是以你喜欢的方式读/写你的设置 您还可以考虑

我正在制作一个控制台应用程序,它是一个基于文本的游戏,我需要保存诸如HP和Money之类的值,并能够在以后检索它们

我尝试过使用设置,但问题是它们依赖于文件名和文件路径,这意味着如果其中一个更改,则不会加载整个保存(这是一个问题,因为大多数玩家都会更改文件名)

所以我希望能够将变量的所有值保存到文本文件中,并在以后检索它们

这有可能使这样的事情更有效率吗


如果有人能帮忙,谢谢。

一个选项是将文件保存到我的文档中的文件(或子文件夹中的文件)

获得路径

而不是以你喜欢的方式读/写你的设置


您还可以考虑其他文件夹,如“代码> LoalAppultDATION< /COD>…< /P> > P>您可以使用IO命名空间提供的文件操作的简单类。
在这里你可以找到许多例子

但总而言之,我建议遵循以下伪代码

  • 找到要存储数据的文件夹
  • 在此文件夹中创建一个文件
  • 准备一个包含要写入的变量的缓冲区
  • 关闭文件
让我们从第一个任务开始

string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string folder = Path.Combine(folder, "myappNameDataFolder");
Directory.CreateDirectory(folder);
string dataFile = Path.Combine(folder, "myappNameDataFile");
在这里,我们尝试在windows为该计算机的所有用户公用的应用程序数据保留的特殊文件夹中构建一个文件夹。请参阅枚举。这是存储您的值的最佳位置,因为您拥有读取/写入文件的所有权限

现在,您可以使用common StreamWriter类在该文件夹中创建文件了

using(StreamWriter sw = new StreamWriter(dataFile, true))
{
   ....
在上面的语句中,StreamWriter是在using块中创建的,以确保它在封闭块的末尾关闭和销毁

现在可以构建缓冲区来存储变量。这里我只展示了一个变量,我假设这些变量在代码的这一点上是可用的

   StringBuilder sb = new StringBuilder();
   sb.Append("HP=" + valueForHPToSave.ToString();
   .... other variables follow this line
将缓冲区写入流,关闭并处置流

    sw.Write(sb.ToString());
}
反向操作(在应用程序启动时读回值)只是使用StreamReader、ReadAllLines和在等号处拆分每一行以恢复原始值的问题

另一种方法是使用框架提供的内置功能。
在这个场景中,您构建了一个名为
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;
          ...
     }
}
当应用程序关闭时,使用如下代码编写类的实例

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);
}
当应用程序启动时,使用类似的方法读回值

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);
              }
          }
     }
}

请注意,我还没有测试过这段代码,为了完全理解,请阅读更多关于

的内容,非常感谢,但是没有更简单的方法吗?例如,我看到有人使用数据和类似的东西更快地将值写入文本文件。+1。用于构造保存位置的示例。我会避免发明自定义文本格式而不是使用标准JSON/XML。。。此外,根据注释,可能需要一些自定义二进制序列化来实现某些(未定义的)性能目标。@AlexeiLevenkov您可能是对的。缺少太多的细节,这只是OPC的一个起点不清楚您的意思是什么,但是有许多方法可以在磁盘上写入数据和多种格式(XML、JSON、二进制)。这个例子只是展示了写文本数据的基本方法,它不是最快的方法,但是,它很简单,除非你有数千兆字节要存储,否则它不会改变游戏的性能。那么,将所有变量写入文本文件并在以后检索它们的最短方法是什么呢?我知道你已经告诉我了,但可能还有一个稍微短一点的方法。阅读/写作是我的主要问题。。。是否有一种高效但不太复杂的方法来处理所有变量?@BlueRay010。。。存储JSON或使用XmlSerialization非常简单,但从大多数角度来看并不“高效”(除了数据的正确性、可读性和编写代码的方便性)。您需要提供更多的信息,以便为问题的“高效”部分获得好的答案。好的,我的意思是将所有变量保存到.txt文件中,然后从文本文件中检索它们。我想把这件事做得尽可能短。我怎么做?
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);
              }
          }
     }
}