📄 form1.frm
字号:
VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form 服务器
Caption = "服务器"
ClientHeight = 6960
ClientLeft = 60
ClientTop = 450
ClientWidth = 12315
LinkTopic = "Form1"
ScaleHeight = 6960
ScaleWidth = 12315
StartUpPosition = 3 '窗口缺省
Begin VB.Timer Timer1
Interval = 60000
Left = 4320
Top = 120
End
Begin VB.ListBox List2
Height = 5280
Left = 360
TabIndex = 0
Top = 960
Width = 9975
End
Begin MSWinsockLib.Winsock gWinsock
Index = 0
Left = 1680
Top = 240
_ExtentX = 741
_ExtentY = 741
_Version = 393216
RemotePort = 1979
LocalPort = 1980
End
Begin MSWinsockLib.Winsock gWinsock
Index = 1
Left = 2160
Top = 240
_ExtentX = 741
_ExtentY = 741
_Version = 393216
RemotePort = 1979
LocalPort = 1980
End
Begin MSWinsockLib.Winsock gWinsock
Index = 2
Left = 2640
Top = 240
_ExtentX = 741
_ExtentY = 741
_Version = 393216
RemotePort = 1979
LocalPort = 1980
End
Begin MSWinsockLib.Winsock Winsock1
Left = 120
Top = 120
_ExtentX = 741
_ExtentY = 741
_Version = 393216
RemotePort = 1979
LocalPort = 1980
End
End
Attribute VB_Name = "服务器"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim MaxIndex As Integer
Private Type userIdStruct
UserName As String ''用户名
PassWord As String ''密码
Name As String ''角色名称
zl As Byte ''战力
Hj As Long ''金钱
Lc As Long ''粮草
Sb As Long ''士兵
Mj As Byte ''米价
End Type
Dim UserId(41) As userIdStruct ''最多允许41个用户登录
Dim gSockId(41) As Integer ''gWinsock连接对应的用户名在userIdStruct里的索引
Dim Mj As Byte ''服务器的米价
Rem 群发信息
Private Sub GroupSend(ByVal S As String)
On Error GoTo E
For i = 0 To MaxIndex - 1
gWinsock(i).SendData S + "#"
DoEvents
Next i
Exit Sub
E:
Err.Clear
End Sub
Private Sub Form_Load()
On Error GoTo E
MaxIndex = 0
Mj = Int(Rnd * 60) + 30
''关闭服务
If Winsock1.State <> 0 Then Winsock1.Close
''启动服务
Winsock1.Listen
Exit Sub
E:
''提示:服务器启动失败
Err.Clear
End Sub
Rem 执行gWinsock接受到的数据
Rem Index:gWinsock的索引 S表示收到的字符串
Private Sub ExecData(Index As Integer, S As String)
Dim i As Integer
Dim j As Integer
''去掉“#”号
For i = 1 To Len(S)
If Mid(S, i, 1) = "#" Then Mid(S, i, 1) = " "
Next i
Call CutNv(S)
S = Trim(S)
nv(1) = Trim(nv(1))
If S = "读取玩家信息" Then
For i = 0 To 41
If IsNumeric(UserId(i).PassWord) = True Then gWinsock(Index).SendData "用户," + UserId(i).Name + "#"
Next i
End If
''建立用户
If nv(0) = "Create" Then
For i = 0 To 41
''空的未建用户空间
If IsNumeric(UserId(i).PassWord) = False Then
''建立用户
UserId(i).UserName = nv(1)
UserId(i).PassWord = nv(3)
UserId(i).Name = nv(1) ''用户名即玩家名称
''初始化财产
UserId(i).zl = 33 ''开始时1级
UserId(i).Hj = 100
UserId(i).Lc = 1000000
UserId(i).Sb = 5000
UserId(i).Mj = Mj
Exit Sub
End If
Next i
End If
If nv(0) = "Login" Then
nv(1) = Trim(nv(1))
''寻找用户
For i = 0 To 41
''找到用户
If nv(1) = Trim(UserId(i).UserName) Then
If Trim(nv(3)) = Trim(UserId(i).PassWord) Then
''登录成功
gWinsock(Index).SendData "LoginOK" + "#": DoEvents
gSockId(Index) = i ''gSockId记录第Index个连接是哪个诸侯(哪个用户数据)
''给这个用户发送所有用户
Call GroupSend("列表," + UserId(i).Name + "#")
''向新登录的用户发送当前所有用户信息
For j = 0 To 41
If IsNumeric(UserId(j).PassWord) Then gWinsock(Index).SendData "列表," + UserId(j).Name: DoEvents
Next j
Exit Sub
End If
End If
Next i
gWinsock(Index).SendData "UserError" + "#"
DoEvents
End If
''买米
If nv(0) = "买米" Then
With UserId(gSockId(Index))
.Lc = .Lc + Val(nv(1)) ''米增加
.Hj = .Hj - (Val(nv(1)) / Mj) ''黄金减少
gWinsock(Index).SendData "交易成功" + "#"
DoEvents
End With
End If
''卖米
If nv(0) = "卖米" Then
With UserId(gSockId(Index))
.Lc = .Lc - Val(nv(1)) ''米增加
.Hj = .Hj + (Val(nv(1)) / Mj) ''黄金减少
gWinsock(Index).SendData "交易成功" + "#"
DoEvents
End With
End If
If nv(0) = "征兵" Then
With UserId(gSockId(Index))
.Lc = .Lc - Val(nv(1)) ''
.Hj = .Hj - (Val(nv(1)) / 10) ''
.Sb = .Sb + Val(nv(1))
gWinsock(Index).SendData "征兵成功" + "#"
DoEvents
End With
End If
If S = "Get用户列表" Then
''发送所有用户
For i = 0 To 41
If IsNumeric(UserId(i).PassWord) Then
gWinsock(Index).SendData "列表," + UserId(i).Name + "#"
End If
Next i
End If
If S = "Get名字" Then
gWinsock(Index).SendData "名字," + UserId(gSockId(Index)).Name + "#": DoEvents ''发送姓名给当前连接
End If
If S = "Get战力" Then
gWinsock(Index).SendData "战力," + Str(UserId(gSockId(Index)).zl) + "#": DoEvents ''发送等级给当前连接
End If
If S = "Get金钱" Then
gWinsock(Index).SendData "金钱," + Str(UserId(gSockId(Index)).Hj) + "#": DoEvents ''发送金钱给当前连接
End If
If S = "Get粮草" Then
gWinsock(Index).SendData "粮草," + Str(UserId(gSockId(Index)).Lc) + "#": DoEvents ''发送粮草给当前连接
End If
If S = "Get士兵" Then
gWinsock(Index).SendData "士兵," + Str(UserId(gSockId(Index)).Sb) + "#": DoEvents ''发送士兵给当前连接
End If
If S = "Get米价" Then
gWinsock(Index).SendData "米价," + Str(Mj) + "#": DoEvents ''发送米价给当前连接
End If
If nv(0) = "战争" Then
j = 0
''寻找战争方
For i = 0 To 41
If Trim(UserId(i).Name) = Trim(nv(1)) Then
Call 战争(gSockId(Index), i)
gWinsock(Index).SendData "士兵," + Str(UserId(gSockId(Index)).Sb) + "#": DoEvents ''发送士兵数量给进攻方
gWinsock(gSockId(i)).SendData "士兵," + Str(UserId(gSockId(i)).Sb) + "#": DoEvents ''发送士兵数量给防守方
Exit Sub
End If
Next i
End If
If nv(0) = "发送" Then
Call GroupSend(nv(1))
End If
End Sub
Rem 收到数据
Private Sub gWinsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim S As String
Dim i As Integer
Dim j As Integer
gWinsock(Index).GetData S
List2.AddItem S + Chr(13) + Chr(10)
If List2.ListCount > 30 Then List2.RemoveItem (0)
j = CountCode(S)
If j < 2 Then
''去掉#号
For i = 1 To Len(S)
If Mid(S, i, 1) = "#" Then Mid(S, i, 1) = " "
Next i
''服务器只收到一条数据,直接执行
Call ExecData(Index, S)
Else
''服务器收到多条数据
Call CutNv2(S)
''将数据分开到nv2中,并依次执行
For i = 1 To j
Call ExecData(Index, nv2(i - 1))
Next i
End If
'List2.AddItem S + Chr(13) + Chr(10)
End Sub
Private Sub 战争(i As Integer, j As Integer)
Dim a As Integer, b As Integer
With UserId(i)
.Sb = .Sb - UserId(j).zl ''i方减兵
UserId(j).Sb = UserId(j).Sb - UserId(i).zl ''j方减兵
Call GroupSend(.Name + "攻击" + UserId(j).Name + ",杀了" + Str(.zl) + "个兵,自己也损失了" + Str(UserId(j).zl) + "个兵。")
''如果进攻方士兵小于0
If .Sb < 0 Then
Call GroupSend(.Name + "战败!")
.Sb = 0
End If
''如果防守方士兵小于0
If UserId(j).Sb < 0 Then
UserId(j).Sb = 0
Call GroupSend(UserId(j).Name + "已经无力招架,大家还是放过他吧!")
End If
End With
End Sub
Rem 每分钟改变一次米价
Private Sub Timer1_Timer()
Dim i As Integer
'On Error GoTo e
Randomize Timer
Mj = Int(Rnd * 60) + 30
For i = 0 To 41
If IsNumeric(UserId(i).PassWord) Then
''如果gWinsock(i).State是连接的
If gWinsock(i).State = 7 Then gWinsock(i).SendData "米价," + Str(Mj) + "#": DoEvents ''发送米价给当前连接
End If
Next i
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
On Error GoTo E
''如果超过41人
If MaxIndex > 41 Then
Winsock1.Accept requestID
Winsock1.SendData "用户已满#"
Winsock1.Close
End If
Winsock1.Close
gWinsock(MaxIndex).Accept requestID
MaxIndex = MaxIndex + 1
Winsock1.Listen
Exit Sub
E:
Err.Clear
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -