vb.net 教程 4-9 二进制文件读写 游戏存档修改器

来源:互联网 发布:mac手游模拟器 编辑:程序博客网 时间:2024/05/29 13:01

前几节学习了读取二进制文件,实际写入二进制文件操作差不多,本节制作一个简单的游戏存档修改器,来说明二进制文件的写入。


记得我的博客第一篇文章是写的《仙剑奇侠传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.IOPublic 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, FileMode.Open, 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 SubEnd Class

运行时如下:

读取情况:

修改情况:

修改后在游戏里面载入存档:


由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录


原创粉丝点击