据说可以用链表???我自己做了个QQ游戏的扑克记牌器,分析剩下没出的牌我觉得用数组很难删除元素,所以用了个Directinary词典,把0-53个元素排好,把出现的牌Remove掉,词典的数据就自动少了,而且还是按照从小到大排列,虽然好,但是觉得没学会算法,不怎么样记录其它两人出牌的数据的累计,把出牌后的数据进行排序,用数组我也不会,这方面我就用了集合Colection,但是用了集合我也只能按照他出牌的顺序进行累计记录,不知道怎么排序~~~~
请教各位,用什么方法好???虽然考虑过链表,但网上找来了很多代码,大都是有点缺陷的代码,不怎么如何用

解决方案 »

  1.   

    好像没有你想的那么麻烦吧?用用户自定义类型不就行了吗?
    type card
      ... as ...
      ...
    end type
    public cards(1 to 54) as card
      

  2.   

    为什么要添加删除?定义包含所有扑克牌的数组,然后修改其相应元素的属性就行了。比如:
    type card
      showed as boolean
      owner as string
      ......
    end type
    public hongtao(1 to 13) as card,fangpian(1 to 13) as card,....
    然后就可以用hongtao(3).showed=true等等,定义这样的数组大大简化排序问题,当然这只是一个思路,具体怎么实现还得按照你的意思进行构思和优化,反正就这么几张扑克牌,也不必太在乎算法问题。
      

  3.   

    楼上的2位~~~我是需要添加删除元素的`~~~如果单单把对应的未打出来的扑克Image的Visible设置为不可见,那就不用添加删除了我是要每打出一些牌,未出现的牌的图片显示出来是紧凑在一起的,而且是有序的排成一行~~~把其它2家打出来的牌也记录起来,用相应的图片显示,而且也是从大到小排列的~~~
      

  4.   

    将对数组的操作封装成类,模拟集合的方法就可以了,这样你基本上代码都不必要改。比如 集合的 add 方法,你也封装一个,然后将数组redim ,将新项目加进去;还有 remove 方法,就是复制一个新数组,复制时将不需要的元素去掉。
    对于很少数据的操作,比如才54张扑克,集合会慢很多吗?那是你不能检测到的差距,也许做1万次,才差0.1秒而已。我用集合模拟过 Directinary 对象,原因是不想发行时带多一个 script.Directinary 组件,没感觉慢多少。
      

  5.   

    楼上的 "勇哥"    用集合模拟过 Directinary 对象,你怎么做的?能不能把代码给偶研究研究???我觉得 Directinary 好就好在 Remove的时候可以指定一个Key,而不是一个索引,因为索引会因为元素的减少而变化,Key就不会了````所以我比较喜欢Directinary,它在删除Key后,元素还是按照原来的顺序,这个正是我需要的我的记牌器就是用Directinary的,但是确实是要添加一个组件才可以~~~请教你是怎么用集合模拟它的呢???
      

  6.   

    集合也可以用KEY的。不过KEY要是一个非数字符串,否则它可能识别成 indexadd 方法的第二个参数就是 keyDim x As Collection
    x.add "xxx","a1"   'a1 即是key取的时候 x.item("a1") 就行了。
      

  7.   

    这是我的类代码。没有完全实现 dictionary 的方法,因为其它的我不需要。如果你需要,可以添加。Option Explicit'**************************************************************
    '*类模块名称:clsDictionary
    '*类模块说明:词典类,用集合模拟
    '*
    '*备注:用以代替 Script.Dictionary 对象
    '*
    '*作者:阿勇
    '*日期:2006-09-21 15:57:14
    '***************************************************************Private Const ModalName = "clsDictionary"'*key的前导字符,防止添加数字串 key 后,取出时识别成 index
    Private Const preKey As String = "_"   
    Private m_Dict As CollectionPublic Sub Add(ByVal Key As String, ByVal Item As Variant)
        m_Dict.Add Item, preKey & Key
    End SubPublic Function Exists(ByVal Key As String) As Boolean
        Exists = Exist1(Key) Or Exist2(Key)
    End FunctionPrivate Function Exist1(ByVal Key As String) As Boolean
    On Error GoTo proc_err    Dim xItm As Variant
        Set xItm = m_Dict.Item(preKey & Key)
        
        Exist1 = True
        Exit Functionproc_err:End FunctionPrivate Function Exist2(ByVal Key As String) As Boolean
    On Error GoTo proc_err    Dim xItm As Variant
        xItm = m_Dict.Item(preKey & Key)
        
        Exist2 = True
        Exit Functionproc_err:End FunctionPublic Sub Remove(ByVal Key As String)
        m_Dict.Remove preKey & Key
    End SubPublic Sub RemoveAll()
    '    Dim i As Long
    '    For i = m_Dict.Count To 1 Step -1
    '        m_Dict.Remove i
    '    Next
        Set m_Dict = Nothing
        
        Set m_Dict = New Collection
    End SubPublic Property Get Count() As Long
        Count = m_Dict.Count
    End PropertyPublic Property Get Item(ByVal Key As String) As Variant
    On Error GoTo proc_err    Set Item = m_Dict.Item(preKey & Key)
        Exit Property
        
    proc_err:
        Item = m_Dict.Item(preKey & Key)
        
    End PropertyPublic Property Get Items() As Collection
        Set Items = m_Dict
    End PropertyPrivate Sub Class_Initialize()
        Set m_Dict = New Collection
    End SubPrivate Sub Class_Terminate()
        Set m_Dict = Nothing
    End Sub
      

  8.   

    用法:
    将它存为 cls 文件,加入工程。然后将你原来声明为:
    dim ... as [new] script.Dictionary 或
    dim ... as [new] Dictionary中的 diceionary 替代为 clsdDictionary ,其它代码不必改就能去掉 script.dictionary 对象的引用了。
    当然如果你用的 dictionary 其它方法该类没有提供会出错了,把没实现的方法实现即可以了。
      

  9.   

    TO:勇哥
    **************************************************************************
    集合也可以用KEY的。不过KEY要是一个非数字符串,否则它可能识别成 indexadd 方法的第二个参数就是 keyDim x As Collection
    x.add "xxx","a1"   'a1 即是key取的时候 x.item("a1") 就行了。
    *************************************************************************集合添加元素的方法我知道~~~~我是觉得集合删除元素不适合我做记牌器集合删除元素是 x.Remove (Index)而Dictionary删除元素是 x.Remove (Key)通过删除指定的索引Index,会导致集合原来的元素对应的索引会变化而Dictionary删除的是Key,不存在变化的问题
      

  10.   

    集合的 remove 一样支持 keyx.remove "a1"这样 a1 这个 key 就移掉了。我上面贴的类代码中不是已实现了 remove 方法吗,参数就是 key 而非 index 
      

  11.   

    噢```,不好意思,我还没试过Remove Key,因为我在代码编辑框里输入 x.Remove,后面就马上出现一个代码提示(INDEX)所以我以为集合删除元素只能通过指定的INDEX,我等下去试试能不能Remove Key