| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 429 人关注过本帖
标题:【求助】用VB怎么实现随机关联控件
只看楼主 加入收藏
baiduqusi
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-3-9
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
【求助】用VB怎么实现随机关联控件
比如说有个2*2的格子,我想让(1.1)和(1.2)(2.2)关联,(1.2)和(2.1)(2.2)关联,以此类推。点(1.1)时关联的两个格子变成背景色,再点(1.2)时(2.1)也变成背景色,(2.2)已经是背景色就变回前景色。自定义X*X个格子,每个格子都要关联两个,随机的,不能关联本身。用vb应该怎么做??
搜索更多相关主题的帖子: 背景色 格子 
2014-03-09 13:11
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
回复 楼主 baiduqusi
首先,你格子数不一定能被3整除,所以有一个空白格子的问题。
其次,点(1.1)时关联的两个格子变成背景色,再点(1.2)时(2.1)也变成背景色,(2.2)已经是背景色就变回前景色
这句语我的理解是 点击格子的本身不变色,它关联的两个格子变色。不知对不对
第三,你这个程序的要求没说清楚,是不是显示格子就可以,还是必须使用控件。

下面的代码是使用 显示格子的。

-------------------------
窗体:
在窗体上放一个 Picture1 ,大小 为一个正方形便可,大一些更好。
我写程序时的大小是 4815 * 4815 缇,放 5*5 的格子时,DEBUG 正好。
工程就不上传了。因为只用一个控件。

程序代码:
Option Explicit
Dim N As Long            '格子的大小

Dim GD As Long           '每个格子的大小(画图)
Dim BJ As Long           '边距

Private Type 坐标
    z As Long           '值,未使用
    X As Long           '坐标
    Y As Long
    L1 As Long          '关联的元素的下标
    L2 As Long
    zt As Boolean           '当前状态
End Type

Const ColorQ = &H8000000F           '前景色,系统前景色,一般为白
Const colorB = &HFFFF00             '背景色, BGR 顺序

Dim G() As 坐标         '每个格子的数据

Private Sub Form_Load()

Randomize               '初始化随机数发生器

Dim s As String

Do                      '使用死循环要求输入格子数量
s = InputBox("请输入一个2以上,10以内的,以便生成网络", "初始大小")

If IsNumeric(s) Then            '如果输入的是数值
    N = Int(Val(s))             '取值,并取整
    If N < 2 Or N > 10 Then N = 0       '是否在范围内
Else
    N = 0
End If
Loop While N = 0                '不符合要求重新循环

ReDim G(N * N)                  '初始化元素

Picture1.AutoRedraw =True 
Call 画框                       '画框

Call 关联                       '产生关联

End Sub

Private Sub 关联()
Dim J1 As Long

J1 = Int(N * N / 3)         '按3倍数计算有多少组关联,剩余部分(1个或2个)不管

Dim i As Long
Dim j As Long

For i = 1 To J1
    'j = NEXTG               '先产生一个没有关联的
    j = NEXTRNDG               '先产生一个没有关联的
    '------这两种产生新一组关联的方式在最终结果上有区别--------
    '第一种会让剩余的空白元素在最后几格内的几率更大
    '第二种会让剩余的空白元素在前面一些的几率更大,看实际使用哪一种
    '如果需要让剩余的空白元素随机出现在任意格,那么需要先把空白元素标识出来再去生成关联
        
    G(j).L1 = NEXTRNDG(j)       '先产生一个随机 第一元素 ,并关联上
    G(G(j).L1).L1 = j       '反关联 也关联上
    
    G(j).L2 = NEXTRNDG(j)   '产生第二个关联
    G(G(j).L1).L2 = G(j).L2     '把第一个关联的元素也关联到第二个元素上
    
    G(G(j).L2).L1 = j           '针对第二个元素,关联到初始元素和第一元素上
    G(G(j).L2).L2 = G(j).L1
Next i

End Sub


Private Sub 画框()

'每边留 150 缇 ,计算每个格子的大小
'再按格子大小修正为 像素
GD = (Picture1.ScaleHeight - 300) / N
GD = Int(GD / Screen.TwipsPerPixelX) * Screen.TwipsPerPixelX

'再根据格子大小修正每边的距离
BJ = (Picture1.ScaleHeight - GD * N) / 2

Dim i As Long

Dim X As Long, Y As Long

For i = 1 To N * N
'计算坐标
    If i Mod N = 0 Then           '每行的最后一格,需要特殊处理
        G(i).X = BJ + (N - 1) * GD
        G(i).Y = BJ + Int(i / N - 1) * GD
    Else                          '其余的不需要特殊处理
        G(i).X = BJ + (i Mod N - 1) * GD
        G(i).Y = BJ + Int(i / N) * GD
    End If
    '画一个空格,分两步画,第一次是用背景画填充的方块,第二次再画格子线
    Picture1.Line (G(i).X, G(i).Y)-(G(i).X + GD, G(i).Y + GD), ColorQ, BF
    Picture1.Line (G(i).X, G(i).Y)-(G(i).X + GD, G(i).Y + GD), , B
Next i

End Sub

Public Function NEXTG()     '返回下一个没有关联的元素
Dim i As Long
For i = 1 To N * N                      '从第一个元素找起,找到没有任何关联的元素。
    If G(i).L1 = 0 Or G(i).L2 = 0 Then
        Exit For
    End If
Next i
NEXTG = i
End Function

Public Function NEXTRNDG(Optional cs As Long = 0)         '随机返回一个没有关联的元素
Dim i As Long

Do                          '与上一个函数相比,顺序号是随机而以,都是找一个没有任何关联的元素
i = Int(Rnd() * N * N + 1)
If G(i).L1 = 0 And G(i).L2 = 0 Then
    If cs > 0 Then
        If i <> cs Then Exit Do
    Else
        Exit Do
    End If
End If
Loop

NEXTRNDG = i

End Function


Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'按下鼠标,不分左右键

Dim x1 As Long, y1 As Long
Dim i As Long
x1 = Int((X - BJ) / GD)             '换算成格子的2维坐标
y1 = Int((Y - BJ) / GD)
i = y1 * N + x1 + 1                 '换算元素的下标

If i <= N * N And i > 0 Then               '如果换算的下标在范围内
    If G(i).L1 > 0 Then             '置状态
        'G(i).zt = Not G(i).zt      '本身变色
        G(G(i).L1).zt = Not G(G(i).L1).zt   '关联的格子变色
        G(G(i).L2).zt = Not G(G(i).L2).zt
        Call 画单个块(i)
        Call 画单个块(G(i).L1)
        Call 画单个块(G(i).L2)
    End If
End If

'Call debugprint                     'DEBUG,显示每个元素的属性

End Sub

Private Sub 画单个块(cs As Long)
    
    If G(cs).zt Then
        Picture1.Line (G(cs).X, G(cs).Y)-(G(cs).X + GD, G(cs).Y + GD), colorB, BF
    Else
        Picture1.Line (G(cs).X, G(cs).Y)-(G(cs).X + GD, G(cs).Y + GD), ColorQ, BF
    End If
    '画格子线
    Picture1.Line (G(cs).X, G(cs).Y)-(G(cs).X + GD, G(cs).Y + GD), , B
End Sub

Private Sub debugprint()
'DEBUG ,显示每个元素的属性
Dim i As Long
Dim j As Long

For i = 1 To N * N
    j = 1
    debugprintsub i, 1, "index:", i
    
    j = j + 1
    debugprintsub i, j, "X:", G(i).X
    
    j = j + 1
    debugprintsub i, j, "Y:", G(i).Y
    
    j = j + 1
    debugprintsub i, j, "L1:", G(i).L1
    
    j = j + 1
    debugprintsub i, j, "L2:", G(i).L2

    j = j + 1
    debugprintsub i, j, "ZT:", G(i).zt

Next i

End Sub

Private Sub debugprintsub(index As Long, js As Long, caption As String, value As Variant)
    
    Picture1.CurrentX = G(index).X + 30                     '定位
    Picture1.CurrentY = G(index).Y + 30 + 135 * (js - 1)
    Picture1.Print caption; value                           '显示内容

End Sub


[ 本帖最后由 风吹过b 于 2014-3-9 21:20 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2014-03-09 21:18
快速回复:【求助】用VB怎么实现随机关联控件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019641 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved