我正在用c#创建一个游戏,我发生了一个问题。我希望我的游戏将窗帘标签保存到一个txt文件中,这里我给你一个例子:
Label1.Text = "Character Name: "
Label2.Text = "Level: "
Label3.Text = "Exp: "
现在我想做的是检索"字符名称:[名称]"从一个txt文件?但是当你退出游戏时,我也想把名字保存到一个txt文件中。这里可能是一个更好的例子:
我想从文本文件中检索级别:[LVL],当玩家完成并退出我的游戏时,我希望它覆盖现有的行,在那里有新的级别?
我想我需要使用StringReader
或StringWriter
下面是一个使用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;
您可以尝试使用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
如果. net framework 3.5及更高版本不可用,您可以使用System.Xml
命名空间中的类。看到
- .NET框架中的XML类和c#提供了简单、可扩展的数据操作
- 使用XPath和XmlDocument操作XML数据 使用XmlDocument类编写XML
…c# xmldocument.
你可以试试SQLite。它是保存在文本文件中的数据库。您将能够比使用自己的纯文本更好地组织数据。
另一个选择是使用旧的INI文件。这里有一个很棒的使用c#的一个INI文件处理类的例子,它将帮助你处理这个问题。下面是使用它的一个例子:
创建如下文件
INIFile ini = new INIFile("C:\test.ini");
使用IniWriteValue
将新值写入section中的特定键,或者使用IniReadValue
从特定section中的键中读取值
这是我最终使用的代码,它工作得很好:
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