前几节学习了读取二进制文件,实际写入二进制文件操作差不多,本节制作一个简单的游戏存档修改器,来说明二进制文件的写入。
记得我的博客第一篇文章是写的《仙剑奇侠传3 外传》存档文件修改器(请参看:《[vb6]仙剑3外传的存档修改器》),当时是用vb6写的。
想想也是十多年过去了。
十多年过去已经很少在电脑上玩游戏了,但是还保留了 大富翁4超时空之旅。
刚上大学那会儿,电脑还是486、586,还没有win32,不过已经有了大富翁、仙剑这样的优秀游戏,
我那时候就开始玩大富翁2和仙剑,现在还记忆犹新。
好了不说闲话,进入正题。
大富翁4的存档文件在安装目录下,从 SAVE0.DAT至SAVE6.DAT,其中Save0.dat是自动存档。
玩家相关数据和存放位置:
现金在 2C,长度为3字节。
存款在 30,长度为3字节。
点卷在 40,长度为2字节。
窗体设计界面如下:
OpenFileDialog的设置如下:
全部代码如下:
Imports System.IO Public Class Form3 Dim savefile As String Private Sub btnOpen_Click(sender As Object,e As EventArgs) Handles btnOpen.Click If ofdSaveFile.ShowDialog <> DialogResult.OK Then Exit Sub End If savefile = ofdSaveFile.FileName Call readSave() End Sub Private Sub readSave() Dim intXj As Integer = 0 Dim intCk As Integer = 0 Dim intDq As Int16 = 0 Dim fs As New FileStream(savefile,FileMode.Open,FileAccess.Read) Try If fs.CanSeek Then Dim br As New BinaryReader(fs) fs.Seek(44,SeekOrigin.Begin) intXj = br.ReadInt32() intCk = br.ReadInt32() fs.Seek(12,SeekOrigin.Current) intDq = br.ReadInt16() br.Close() End If fs.Close() lblInfo.Text = "读取存档完毕" Catch ex As Exception lblInfo.Text = "读取存档出错:" & ex.Message End Try txtXj.Text = intXj.ToString txtCk.Text = intCk.ToString txtDq.Text = intDq.ToString End Sub Private Sub btnSave_Click(sender As Object,e As EventArgs) Handles btnSave.Click Dim intXj As Integer = Integer.Parse(txtXj.Text) Dim intCk As Integer = CInt(txtCk.Text) Dim intDq As Int16 = CType(txtDq.Text,Int16) Using fs As New FileStream(savefile,FileAccess.Write) Try If fs.CanSeek Then Dim bw As New BinaryWriter(fs) bw.Seek(44,SeekOrigin.Begin) '定位流位置,相对于流开始的44字节 bw.Write(intXj) '写入一个Integer数据 bw.Write(intCk) '写入一个Integer数据 bw.Seek(12,SeekOrigin.Current) '相对当前流的12个字节 bw.Write(intDq) '写入一个int16数据 bw.Close() End If lblInfo.Text = "修改存档完毕" Catch ex As Exception lblInfo.Text = "写入存档出错:" & ex.Message End Try End Using End Sub End Class
运行时如下:
读取情况:
修改情况:
修改后在游戏里面载入存档:
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看 vb.net 教程 目录
原文链接:https://www.f2er.com/vb/256522.html