构造一个角色类 , 角色有技能若干 。 
   先将技能定义成类, 然后定义  一个该技能类的集合 。 
   最后在角色类模块里调用这个集合类。
   
   不知道我这种思想对不对。  如果是该这样子做。 那么如何实施呢,  请朋友给我,在角色类中构造关联的代码。  关于类  和 集合的编写 代码,我 已经略微知道一点了。  
   
    对了, 在gameres中提问时 ,无意中了解到  在集合中 使用一些高深的排序算法 . 好像是链表之类的吧, 不知道有何应用.  我的技能集合粗略估计是8种技能. .之所以不分开定义 ,是考虑到最后保存到数据库时可以使用循环 ,

解决方案 »

  1.   

    写了一天终于写出了一点东西。 然‘而刚刚测试 ,即遭重创  。首先创建 Estate(能力)  Nskill(技能)  ill(疾病)  三个类  .  最后创建顶层类  human (角色 ) 
     
       其中human 代码如下 . 
    '保持属性值的局部变量
    Private mvarHp As Estate '局部复制
    '保持属性值的局部变量
    Private mvarLogist As Nskill '局部复制
    '保持属性值的局部变量
    Private mvarDkangL As Nskill '局部复制
    '保持属性值的局部变量
    Private mvarEP As Estate '局部复制
    Private mvarBP As Estate '局部复制
    '保持属性值的局部变量
    Private mvarZhs As Nskill '局部复制
    Private mvarAmbition As Nskill '局部复制
    '保持属性值的局部变量
    Private mvartactics As Nskill '局部复制
    Private mvarhardiness As Nskill '局部复制
    Private mvarregimen As Nskill '局部复制
    Private mvarStudy As Nskill '局部复制
    '保持属性值的局部变量
    Private mvarillness As ill '局部复制
    Public Sub Checkill()
      Dim a, b, c, d
      a = mvarHp.value < mvarHp.Max * 0.2
      b = mvarEP.value < mvarEP.Max * 0.2
      c = mvarBP.value < mvarBP.Max * 0.2
      d = Rnd < (0.5 - 0.15 * mvarDkangL.Grade) * (1 - mvarLogist.Grade)
      If ((a Or b Or c) And d) Then
        
        
      
    End SubPrivate Sub AdvanceChk()
     Randomize
     Dim X As Integer
     X = CInt(100 * Rnd)
    Select Case X
       Case 50 To 100  '45%得A类病
         mvarillness.Grade = 1
       Case 20 To 49  '30%得B类病
         mvarillness.Grade = 2
       Case 0 To 19 '
         mvarillness.Grade = 3
       End Select
       mvarillness.Start = Now
       mvarHp.value = mvarHp.value - mvarillness.Thp
       mvarBP.value = mvarBP.value - mvarillness.Tbp
       mvarEP.value = mvarEP.value - mvarillness.Tep
       mvarillness.CheckDone = True
    End Sub
    Public Property Set illness(ByVal vData As ill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.illness = Form1
        Set mvarillness = vData
    End Property
    Public Property Get illness() As ill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.illness
        Set illness = mvarillness
    End Property
    Public Property Set Study(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.Study = Form1
        Set mvarStudy = vData
    End Property
    Public Property Get Study() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.Study
        Set Study = mvarStudy
    End Property
    Public Property Set regimen(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.regimen = Form1
        Set mvarregimen = vData
    End Property
    Public Property Get regimen() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.regimen
        Set regimen = mvarregimen
    End Property
    Public Property Set hardiness(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.hardiness = Form1
        Set mvarhardiness = vData
    End Property
    Public Property Get hardiness() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.hardiness
        Set hardiness = mvarhardiness
    End Property
    Public Property Set tactics(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.tactics = Form1
        Set mvartactics = vData
    End Property
    Public Property Get tactics() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.tactics
        Set tactics = mvartactics
    End Property
    Public Property Set Ambition(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.Ambition = Form1
        Set mvarAmbition = vData
    End Property
    Public Property Get Ambition() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.Ambition
        Set Ambition = mvarAmbition
    End Property
    Public Property Set Zhs(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.Zhs = Form1
        Set mvarZhs = vData
    End Property
    Public Property Get Zhs() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.Zhs
        Set Zhs = mvarZhs
    End Property
    Public Property Set BP(ByVal vData As Estate)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.BP = Form1
        Set mvarBP = vData
    End Property
    Public Property Get BP() As Estate
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.BP
        Set BP = mvarBP
    End Property
    Public Property Set EP(ByVal vData As Estate)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.EP = Form1
        Set mvarEP = vData
    End Property
    Public Property Get EP() As Estate
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.EP
        Set EP = mvarEP
    End Property
    Public Property Set DkangL(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.DkangL = Form1
        Set mvarDkangL = vData
    End Property
    Public Property Get DkangL() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.DkangL
        Set DkangL = mvarDkangL
    End Property
    Public Property Set Logist(ByVal vData As Nskill)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.Logist = Form1
        Set mvarLogist = vData
        
    End Property
    Public Property Get Logist() As Nskill
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.Logist
        Set Logist = mvarLogist
    End Property
    Public Property Set Hp(ByVal vData As Estate)
    '向属性指派对象时使用,位于 Set 语句的左边。
    'Syntax: Set x.HP = Form1
        Set mvarHp = vData
        mvarHp.Ename = Hp
        If mvarHp.value < 0.2 * mvarHp.Max And Rnd < (0.5 - 0.15 * DkangL.Grade) * (1 - Logist.Grade) Then
          mvarillness.Check = True
          mvarillness.Start = Now
        End If
    End PropertyPublic Property Get Hp() As Estate
    '检索属性值时使用,位于赋值语句的右边。
    'Syntax: Debug.Print X.HP
        Set Hp = mvarHp
    End Property测试窗体
     dim  tiexue As human
     
    Private Sub Form_Load()
    Set tiexue = New human
     tiexue.Hp.value = 100
    tiexue.BP.value = 100
    tiexue.EP.value = 100
    End Sub
    运行就开始显示 对象变量未设置或with 块变量未设置 . 这是怎么回事啊 ? 
    难道嵌套类里的属性是不允许外部赋值的 ????? 
    那我做这些还有什么用 ?  真郁闷啊.   
    请高手来救救急啊。  
      

  2.   

    理解错误,当然可以赋值。
    从你错误提示看,是因为你的类没有实例化引起的。
    Set tiexue = New human只是实例化了角色类
    而mvarHp、mvarEP、mvarBP却没见有实例化的代码,
    最简单的办法就是在角色类初始化时加入
    set mvarHp=new ...
    set mvarEp=new ...
    set mvarBp=new ...