V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BROWNURSIDAE
V2EX  ›  程序员

VB 21 点游戏的问题

  •  
  •   BROWNURSIDAE · 2015-10-12 13:43:52 +08:00 · 2152 次点击
    这是一个创建于 3129 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是一个新手,想实现抽牌不重复,现在思路是做一个数组,然后每次随机抽到一张牌就放一张进去,然后再抽下一张和数组里面的数据比对,重复了就再随机抽取一张,现在挺乱的,想不出来怎么写,求指导

    for i 1 to 52
    t=Int(Rnd()*52+1)
    p1=t
    next i

    然后怎么把 p1 存放到数组然后判断, p1 是用来做图片序号的,写的不好,希望调教
    13 条回复    2015-10-13 07:27:05 +08:00
    rock_cloud
        1
    rock_cloud  
       2015-10-12 13:53:41 +08:00
    每抽到一张就放到最后,然后在前边 n-1 张里随机选,再抽一张再放到倒数第二个,然后从前面 n-2 个里选。
    BROWNURSIDAE
        2
    BROWNURSIDAE  
    OP
       2015-10-12 14:03:07 +08:00
    @rock_cloud 比如我 dim arr ( 0 to 51 )
    然后我怎么把 p1 弄到这个 arr 里??不理解
    rock_cloud
        3
    rock_cloud  
       2015-10-12 14:33:40 +08:00   ❤️ 1
    这个是 VB 的语法么?是这样:
    弄一个数组,赋值为 1 到 n ,然后随机的在前 n 个里选一个,之后交换选出的值和第 n 个值,然后 n = n - 1 ,一共重复这个操作 n-1 次。最后得到的数组就是一个包含随机值的数组。
    VB 语法不懂,你看看我这个描述能实现吗?
    BROWNURSIDAE
        4
    BROWNURSIDAE  
    OP
       2015-10-12 14:34:39 +08:00
    @rock_cloud 我看看我第一次接触编程没啥基础
    RitianZhao1988
        5
    RitianZhao1988  
       2015-10-12 15:40:31 +08:00
    @BROWNURSIDAE 不用弄,把选出的牌的值设置为-1 ,下次碰到-1 直接跳过重循环就好
    也可以在生成的时候先随机排序,下次按序号抽就可以了 XD
    maomaomao001
        6
    maomaomao001  
       2015-10-12 15:51:28 +08:00 via Android
    这样很麻烦吧,万一随机出来连续几个一样的,所以还是用表的结构吧,用完一个删一个
    bingwenshi
        7
    bingwenshi  
       2015-10-12 15:54:16 +08:00
    直接把所有的牌做下随机序,然后从头取就行了
    BROWNURSIDAE
        8
    BROWNURSIDAE  
    OP
       2015-10-12 15:57:49 +08:00
    @maomaomao001 用表是不是要数据库的意思?
    BROWNURSIDAE
        9
    BROWNURSIDAE  
    OP
       2015-10-12 15:58:31 +08:00
    @bingwenshi 怎么把所有牌做随机序然后从头取?能贴个小代码块吗??
    maomaomao001
        10
    maomaomao001  
       2015-10-12 16:04:28 +08:00 via Android
    @BROWNURSIDAE 不是那个表,是链表的表,数据结构
    play78
        11
    play78  
       2015-10-12 20:01:19 +08:00
    其实这个不用那么复杂的,最简单的办法是 先按顺序写入,然后随机交换位置就可以了,这样就可以保证不重复了,对于几十个数来说,效率也不是很低,随机性也还可以。

    Private Sub Command1_Click()
    Randomize
    Dim pk(55) As Integer
    Dim ss As String
    '52 张按顺序摆放
    For i = 1 To 52
    pk(i) = i
    Next i
    '随机打乱
    For i = 1 To 1000
    t1 = Int(Rnd() * 52 + 1)
    t2 = Int(Rnd() * 52 + 1)
    a = pk(t1)
    pk(t1) = pk(t2)
    pk(t2) = a
    Next i
    '输出
    For i = 1 To 52
    ss = ss + Str(pk(i)) + " "
    Next i
    Print ss
    End Sub
    这样是不是好理解多了。
    firemiles
        12
    firemiles  
       2015-10-12 20:38:28 +08:00
    l = [i for i in range(1,53)]
    for i in range(52):
    card = random.choice(l)
    l.remove(card)
    print card

    用 python 的 random.choice 就是随机抽取
    自己实现也就是产生个剩下牌数的随机数,然后把牌取走
    bsx1990
        13
    bsx1990  
       2015-10-13 07:27:05 +08:00 via iPhone
    将楼上的两种方式还原成生活中的场景吧:
    一种是拿一副扑克牌在手上,随机抽一张放在桌子上, 52 张都抽完了,也就结束了。
    另一种是将这副扑克牌摊开在桌子上,然后像搓麻将一样的洗牌,洗完了也就结束了。
    是不是好理解了呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3494 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:41 · PVG 08:41 · LAX 17:41 · JFK 20:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.