⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.frm

📁 vb网络游戏开发示范程序
💻 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 + -