0

我正在用 c# 创建一个游戏,但我遇到了一个问题。我希望我的游戏将窗帘标签保存到 txt 文件中,这里举个例子:

Label1.Text = "Character Name: "
Label2.Text = "Level: "
Label3.Text = "Exp: "

现在我想做的是从 txt 文件中检索“字符名称:[名称]”?但我也想在退出游戏时将名称保存到 txt 文件中。所以这可能是一个更好的例子:

我想从 txt 文件中检索 Level: [LVL],当玩家完成并退出我的游戏时,我希望它用新级别覆盖现有的行?

我想我需要使用StringReaderor StringWriter

4

5 回答 5

2

这是一个使用 XML 序列化和数据模型的快速示例。确保using System.Xml.Serialization;文件顶部有一个命名空间导入行。

将您希望保存/加载的数据声明为一个简单的类,例如:

public class SaveData
{
    public string CharacterName { get; set; }
    public int Level { get; set; }
    public int Experience { get; set; }
}

当您要保存时,请构建该数据模型:

SaveData saveState = new SaveData()
{
    CharacterName = myCharacter.Name,
    Level = myCharacter.Level,
    Experience = myCharacter.Experience
};

要保存到文件,请使用XmlSerializer该类并打开文件流以将其序列化为:

public void SaveStateToFile(SaveData state)
{
    XmlSerializer serializer = new XmlSerializer(typeof(SaveData));
    using (TextWriter writeFileStream = new StreamWriter(@"C:\savefile.xml"))
    {
        serializer.Serialize(writeFileStream, state);
    }
}

这将创建一个包含以下内容的 xml 文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<SaveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CharacterName>John</CharacterName>
  <Level>10</Level>
  <Experience>9001</Experience>
</SaveData>

因此,如果需要,这应该很容易编辑。要重新加载数据:

public SaveData LoadStateFromFile()
{
    XmlSerializer serializer = new XmlSerializer(typeof(SaveData));
    using (FileStream readFileStream = new FileStream(@"C:\savefile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        return (SaveData)serializer.Deserialize(readFileStream);
    }
}

这应该为您提供一个很好的类型安全数据模型,然后根据需要重新绑定您的 GUI:

SaveData loadedData = LoadStateFromFile();
Console.WriteLine(loadedData.CharacterName); //John
Console.WriteLine(loadedData.Level); //10
Console.WriteLine(loadedData.Experience); //9001

Label1.Text = "Character Name: " + loadedData.CharacterName;
Label2.Text = "Level: " + loadedData.Level;
Label3.Text = "Exp: " + loadedData.Experience;
于 2013-01-03T03:27:42.737 回答
1

您可以尝试使用 XML 作为设置文件。这是一个非常简单的例子:

创建一个新的 XML 文件,用字符名称填充它并保存:

XElement x = new XElement("Settings");
x.Add(new XElement("CharacterName", "John Doe"));
x.Save("1.xml");

加载保存的 xml 并打印输出:

XElement loaded = XElement.Load("1.xml");
Console.WriteLine(loaded.Element("CharacterName").Value);

这是一篇 MSDN 文章开头:LINQ to XML


如果 .NetFramework 3.5 及更高版本不可用,您可以使用System.Xml命名空间中的类。看

  1. .NET 中的 XML:.NET Framework XML 类和 C# 提供简单、可扩展的数据操作
  2. 使用 XPath 和 XmlDocument 操作 XML 数据
  3. 使用 XmlDocument 类编写 XML

...只是用C# xmldocument谷歌。

于 2013-01-03T03:03:37.143 回答
0

你可以试试SQLite。它是保存在文本文件中的数据库。您将能够比使用自己的纯文本更好地组织数据。

于 2013-01-03T02:56:36.070 回答
0

另一种选择是使用旧的 INI 文件。这是一个很棒的使用 C#示例的 INI 文件处理类,它将帮助您处理它。这是一个使用它的例子:

像这样创建一个INIFile

INIFile ini = new INIFile("C:\\test.ini");

用于IniWriteValue将新值写入节中的特定键或用于IniReadValue从特定节中的键读取值。

于 2013-01-03T03:18:46.643 回答
0

这是我最终使用的代码,它工作正常:

XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateElement("Info");
xmlDoc.AppendChild(rootNode);

XmlNode userNode = xmlDoc.CreateElement("Username");
userNode.InnerText = Username.Text;
rootNode.AppendChild(userNode);

xmlDoc.Save(gameFolder + Username.Text + ".sav");

我使用了来自@Konstantin Vasilcov 的资源

于 2013-01-03T11:20:30.273 回答