Foxtable(狐表)用户栏目专家坐堂 → 想做一个排位表


  共有13473人关注过本帖树形打印复制链接

主题:想做一个排位表

帅哥,在线噢!
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/9 21:36:00 [显示全部帖子]

没看懂。请使用文字描述一下计算规则,然后手工填写截图说明一下效果。

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/9 23:01:00 [显示全部帖子]

搞不定。另请高明吧,找个数学好的算法高手

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/10 8:56:00 [显示全部帖子]

对不对测试看结果

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/10 10:53:00 [显示全部帖子]

使用了空对象,比如ds没有判断是否有值

Dim ds As DataRow =  DataTables("对阵表").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")定义ds为对阵表上的棋赛名称和第几轮比赛等于窗口控件上的棋赛名称和第几轮比赛上的行
Dim dr As DataRow =  DataTables("比赛积分").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")'定义dr为当比赛积分表上的棋赛名称和第几轮比赛等于窗口控件上的棋赛名称和第几轮比赛上的行
Dim di4 As Integer = ds("桌号") = 0'定义di4为符合上面条件的行对应的桌号变量

如:
Dim ds As DataRow =  DataTables("对阵表").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")定义ds为对阵表上的棋赛名称和第几轮比赛等于窗口控件上的棋赛名称和第几轮比赛上的行
if ds isnot nothing then
其它代码
end if

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/10 11:52:00 [显示全部帖子]

如:
Dim ds As DataRow =  DataTables("对阵表").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")定义ds为对阵表上的棋赛名称和第几轮比赛等于窗口控件上的棋赛名称和第几轮比赛上的行
if ds is nothing then
ds =  DataTables("对阵表").addnew
end if
其它代码

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/10 14:35:00 [显示全部帖子]

试试

DataTables("对阵表").DataRows.Clear
Dim bsrq As WinForm.DateTimePicker = e.Form.Controls("rq")
Dim qsmc As WinForm.ComboBox = e.Form.Controls("棋赛名称")
Dim di1 As String = qsmc.Value
Dim m As WinForm.TextBox = e.Form.Controls("第几轮")
Dim di2 As Integer = m.Value = 1
Dim di3 As Date = bsrq.Value
Dim ds As DataRow =  DataTables("对阵表").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")
If ds Is Nothing Then
    ds =  DataTables("对阵表").addnew
    ds("桌号") = 0
End If
Dim di4 As Integer = ds("桌号")
Dim dr As DataRow =  DataTables("比赛积分").SQLfind("棋赛名称 = '" & di1 & "'")
If dr Is Nothing Then
    Dim ls As Integer = DataTables("基本信息").SQLGetValues("棋赛名称|姓名|身份", "棋赛名称 = '" & di1 & "' And 姓名 is not null and 身份 = '参赛人'").Count
    Dim ids1,ids2 As New List(of Integer) '用于存储洗牌前后的位置
    For i As Integer = 0 To ls -1 '准备初始的牌
        ids1.add(i)
    Next
    For i As Integer = 0 To ls - 1 '开始洗牌
        Dim idx As Integer = ids1(rand.Next(0,ids1.count))
        ids2.Add(idx)
        ids1.Remove(idx)
        Dim n = 2
        If ls > = n Then
            Dim ls1 As new List(Of String)
            Do While ls1.count < n
                Dim a = Rand.Next(0, ls)
                If ls1.Contains(a) = False Then
                    ls1.add(ids2(a))
                End If
            Loop
            di4 = di4 + 1
if ls1.count > 0 then ds("红方_编号") = ls1(0)
if ls1.count > 1 then ds("黑方_编号") = ls1(1)
        End If
    Next
End If

DataTables("对阵表").Save()
[此贴子已经被作者于2020/4/10 14:36:36编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/10 15:47:00 [显示全部帖子]

我对排位的算法完全没有概念,也看不懂。我可以看出代码中的问题,但是看不出逻辑的问题,这个要您自己去处理了

问题1、Dim ds As DataRow =  DataTables("对阵表").SQLfind("棋赛名称 = '" & di1 & "' And 第几轮比赛 = '" & di2 & "'")
"对阵表"没有棋赛名称、第几轮比赛这2个列

2、这里的处理是有问题的,红字部分a会大于ids2的数量的。
    For i As Integer = 0 To ls - 1 '开始洗牌
        Dim idx As Integer = ids1(rand.Next(0,ids1.count))
        ids2.Add(idx)
        ids1.Remove(idx)
        Dim n = 2
        If ls > = n Then
            Dim ls1 As new List(Of String)
            Do While ls1.count < n
                Dim a = Rand.Next(0, ls)
                If ls1.Contains(a) = False Then
                    ls1.add(ids2(a))
                End If
            Loop
            di4 = di4 + 1
if ls1.count > 0 then ds("红方_编号") = ls1(0)
if ls1.count > 1 then ds("黑方_编号") = ls1(1)
        End If
如果改为下面用法,没有错误,但是不知道符不符合您的逻辑要求
    For i As Integer = 0 To ls - 1 '开始洗牌
        Dim idx As Integer = ids1(rand.Next(0,ids1.count))
        ids2.Add(idx)
        ids1.Remove(idx)

    Dim n = 2
    If ls >= n Then
        Dim ls1 As new List(Of String)
        Do While ls1.count < n
            Dim a = Rand.Next(0, ls)
            If ls1.Contains(a) = False Then
                ls1.add(ids2(a))
            End If
        Loop
        di4 = di4 + 1
        If ls1.count > 0 Then ds("红方_编号") = ls1(0)
        If ls1.count > 1 Then ds("黑方_编号") = ls1(1)
    End If
    Next

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/11 10:20:00 [显示全部帖子]

判断空表:
if DataTables("对阵表").DataRows.count = 0 then
msgbox("没有数据")
end if

 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/11 11:35:00 [显示全部帖子]

能够进入到For Each ds As DataRow In DataTables("对阵表").DataRows这个循环里面,"对阵表"肯定就不会是空表

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106706 积分:542725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/11 13:40:00 [显示全部帖子]

看22楼第二点
比如ids2有3个项目,索引就只有0/1/2,如果使用了3,如ids2(3),都没有第4个项目,就出现了上面的错误

 回到顶部
总数 41 1 2 3 4 5 下一页