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


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

主题:想做一个排位表

美女呀,离线,留言给我吧!
采菊东篱下
  21楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/10 15:16:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:象棋排赛.foxdb

你看这个文件吧,密码:888888,没生成编号了。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  22楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106665 积分:542508 威望: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

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  23楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/10 20:15: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
For Each ds As DataRow In DataTables("对阵表").DataRows
    If ds Is Nothing Then
        ds =  DataTables("对阵表").DataRows.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 Integer)
                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
Next
DataTables("对阵表").Save()
[此贴子已经被作者于2020/4/11 8:52:01编辑过]

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  24楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/11 9:48:00 [只看该作者]

因为我删了对阵表的所有行,
For Each ds As DataRow In DataTables("对阵表").DataRows
    If ds Is Nothing Then
        ds =  DataTables("对阵表").DataRows.AddNew()
    End If
Next
这段代码不起作用,它不是空值,而是空表,要先判断空表、空值才能添加行,
For Each ds As DataRow In DataTables("对阵表").DataRows
    Dim rll As Boolean = True
    For Each c As DataCol In DataTables("对阵表").DataCols
        If c.Name.StartsWith("_") = False
            If (c.IsBoolean = False And  not ds.IsNull(c.Name)) OrElse (c.IsBoolean  AndAlso ds(c.Name) = True)
                rll = False
                Exit For
            End If
        End If
    Next
    If rll Then
        Output.Show("空行,ID" & ds("_Identify"))
    Else
        all = False
    End If
Next
If all Then
    'Output.Show("空表")
'End If
    ds = DataTables("对阵表").AddNew()
End If
我在论坛搜到判断空表代码,把红色标注行改为下面两行,报错,应怎么写?谢谢。
[此贴子已经被作者于2020/4/11 11:24:19编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  25楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106665 积分:542508 威望: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

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  26楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/11 11:23: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 all As Boolean = True
For Each ds As DataRow In DataTables("对阵表").DataRows
    If DataTables("对阵表").DataRows.count = 0 OrElse DataTables("对阵表").DataRows Is Nothing Then
        DataTables("对阵表").AddNew
        ds("桌号") = 0
    End If
    Dim di4 As Integer = ds("桌号")
    Dim dr As DataRow = DataTables("比赛积分").SQLfind("棋赛名称 = '" & di1 & "'")
    If DataTables("比赛积分").DataRows.count = 0 OrElse 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 Integer)
                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
Next
DataTables("对阵表").Save()

红色标注的代码我单独执行能增一行,但执行所有代码就没反应了,哪出了问题?我总觉For Each ds As DataRow In DataTables("对阵表").DataRows这行定义有问题,因为把ds替换到红色标注代码的相应位置,报错。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  27楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106665 积分:542508 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/11 11:35:00 [只看该作者]

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

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  28楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/11 12:06:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:7777.png
图片点击可在新窗口打开查看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:象棋排赛.foxdb
密码:888888
报错了,请教表示什么意思?
[此贴子已经被作者于2020/4/11 12:07:07编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  29楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2020/4/11 12:16:00 [只看该作者]

看了楼主的表,觉得有点乱。但必须提醒:规则决定思路,思路决定编程。别为难版主了。
1、如果是循环积分赛,每个人都互相见面了,就直接按总积分排名即可,只需用到两个表:基本信息表和比赛明细表。
基本信息表是父表,包括:比赛名称(用于关联)、编号(用于关联)、姓名(存在重名)、单位(用于识别)、手机号码(用于联系)、积分;
比赛明细表是子表,包括:比赛名称(用于关联)、红方编号(用于关联)、黑方编号、红方得分;
两表关联之后,父表的积分是子表的红方得分之和。
如果是10人参赛,每个人的红方和黑方均出现9次,则子表就有10*9=90行。
如果红方是张三、黑方是李四,且红方2:1胜,则红方编号为张三编号、黑方编号为李四编号的行上,红方得分填2;同时,在红方编号是张三编号、黑方编号是李四编号的行上,红方得分填1。
如果不存在重名,则无需采用编号,直接用姓名关联。
2、如果是分组淘汰赛,也只需用到上述两个表,只是子表需要增加轮次、组号和胜方编号。
如果是10人参赛,第1轮抽号分成5组,号码1和2、3和4、5和6、7和8、9和10分别为1、2、3、4、5组,单轮淘汰。
第2轮的1组是原1和2组的胜出者,2组是原3和4组的胜出者,3组是原5组的胜出者。
这第2轮在人多的时候可以假设为第n轮,剩下5人可以继续实行分组淘汰赛(第3组轮空),也可以采用循环积分赛。
如果是分组淘汰赛,则第n+1轮剩下3人,即第1、2组的胜出者和第3组的轮空者。此时可以采用循环积分赛。
如果参赛人数满足2的n次方,则最后应该是4人直至2人,争夺冠亚军,第3、4名争夺季军。
如果中途有人退赛,则不退的人可以直接晋级,也可以让轮空者补缺,这是规则问题了。
还有一种公正的方法:每轮结束,胜出者全部重新抽号决定分组和轮空。在人多的时候,就要求必须在规定的时间内完成每轮比赛。
[此贴子已经被作者于2020/4/11 12:28:45编辑过]

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  30楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2020/4/11 13:30:00 [只看该作者]

  你的思维特殊化、窄了,一个大型比赛常七、八十人,连续2、3天比赛,同分者很多,单从个人累计积分比较很难分出高低,还要统计其交战过对手累计积分,两者排序,才显高下,尽管如此还会有很多同分的,我加入的象棋群,里面全是大学教授、律师,他们常同群或跨群比赛,有时还组织地方棋协间、教育界、律师界跨行业象棋比赛,我设计的排位软件不单排位,还做为记录历次比赛盛况,以备他们以后查看。比赛积分表为后台原始记录,对阵表结合统计功能生成排位顺序,表格格式是教授、专业象棋裁判、特级象棋大师发到群里现用的,作为数据库记录、备查是我的设想,他们组织的棋赛非常多,如能系统地保存下来,随时备查将是非常好的辅助工具。所以要三个表,一个基本信息表,记录不同棋赛人员信息,一个对阵排位表,排位表是根据基本信息表指定棋赛名称参赛人数生成随机号码,所以要编号,编号对应具体参赛人,然后安桌位顺序入坐的,一个比赛积分表,作为后台原始记录,整个软件不是为单个比赛专设,你觉得我问多了是在为难版主,我也一直在努力学啊,我是想好了代码,但遇到问题请教版主的,不是半个代码都没有,不动脑筋直接套取版主代码,问的过程也是我加深学的过程,就如刚才的问题,用了循环语句,表行不可能为空,所以我的代码不起效。
  版主一开始就要我找数学非常好的人写算化,其实算化不复杂,如果单纯为结果我完全可用excel代写,但作为专门记录软件用数据库设计是最好的,所以我做了,一边学一边做。
[此贴子已经被作者于2020/4/11 17:44:39编辑过]

 回到顶部
总数 120 上一页 1 2 3 4 5 6 7 8 9 10 下一页 ..12