以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 想做一个排位表 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=148549) |
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/9 21:29:00 -- 想做一个排位表
密码:888888 窗口按钮事件里已用文字注识了我想实现的效果,我想了很久,代码写得非常乱,涉及的问题太多了,还是请教一下老师吧,谢谢。 [此贴子已经被作者于2020/4/9 21:32:38编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2020/4/9 21:36:00 -- 没看懂。请使用文字描述一下计算规则,然后手工填写截图说明一下效果。 |
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/9 21:45:00 -- 当比赛积分表中没有窗口表头上对应的棋赛名称记录时,安对阵表格式要求对基本信息表中对应的棋赛名称,随机生成不安编号顺序的坐号,这是首轮比赛的代码。 下轮比赛先判断如果基本信息表中的棋赛名称等于对阵表表头上的棋赛名称,并且基本信息表中的退赛场次序号列标明退赛场序号(如以4,5,6,表示第4,5,6场不参赛,此号不参与这几场赛随机排坐),根据后台比赛积分表统计指定棋赛名称选手们的上轮止累计积分,曾交战对手累计积分,并安此由高分到低分排序,如两项积分都相等的人数大于2,分数相等部分人在有选择情况下尽量避免和曾对战过的人交手(即排除重复编号),然后随机生成分数与之对应的坐位. [此贴子已经被作者于2020/4/9 22:03:13编辑过]
|
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/9 21:57:00 -- 对阵表是排位表,安排桌号的,比赛积分表是记录表,把对阵表里各场比赛的当前积分记录至此,下一场比赛时对阵表中的上轮止累计积分、曾交战对手累计积分都是根据比赛积分表中的积分统计的,上轮止累计积分统计的是自己的成绩,曾交战对手累计积分统计的是同棋赛、与自己交手对手的积分。 |
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/9 22:08:00 -- 弄懂这个复杂代码可举一反三应用到企业管理中的人员排班上。 |
||||
-- 作者:有点蓝 -- 发布时间:2020/4/9 23:01:00 -- 搞不定。另请高明吧,找个数学好的算法高手 |
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/10 0:30:00 -- 以下是引用有点蓝在2020/4/9 23:01:00的发言: 搞不定。另请高明吧,找个数学好的算法高手 算法并不高深,对阵表上的当前局成绩是比赛后输进去的,比赛积分表上的积分就是把对阵表上的成绩安编号对应的基本信息表上的姓名保存到哪的,没有什么深奥,主要是代码我不会写,来一段段拆分,慢慢来: 当比赛积分表中没有对阵表表头上的棋赛名称记录时,安对阵表格式要求对基本信息表中对应的棋赛名称,随机生成不安编号顺序的坐号. DataTables("对阵表").StopRedraw()\'停止对窗口上table控件绑定的表格绘制 DataTables("对阵表").DataRows.Clear\'清空窗口上table控件绑定的表格数据 Dim bsrq As WinForm.DateTimePicker = e.Form.Controls("rq")\'定义窗口上的日期控件 Dim qsmc As WinForm.DropDownBox = e.Form.Controls("棋赛名称")\'定义窗口上的棋赛名称控件 Dim di1 As String = qsmc.Value\'定义窗口上的棋赛名称变量为字符型 Dim m As WinForm.TextBox = e.Form.Controls("第几轮")\'定义窗口上的第几轮控件 Dim di2 As Integer = m.Value\'定义窗口上的第几轮变量为整数型 Dim di3 As Date = bsrq.Value\'定义窗口上的日期变量为日期型 \'以上为定义窗口上的控件和变量,要不要这样定义,请指正。 Dim dr As DataRow = DataTables("比赛积分").SQLfind("棋赛名称 = \'" & di1 & "\' And 第几轮比赛 = \'" & di2 & "\'")\'定义dr为当比赛积分表上的棋赛名称和第几轮比赛等于窗口控件上的棋赛名称和第几轮比赛上的行 Dim di4 As Integer = dr("桌号") = 0\'定义di4为符合上面条件的行对应的桌号变量 \'下面是根据基本信息表上的棋赛名称等于窗口控件上的棋赛名称,姓名不为空,身份列为参赛人,安桌号顺序生成以人数个数不安顺序随机生成编号,编号对应基本信息表上对应的姓名、编号,就是他应坐的桌号。 If dr Is Nothing Then di1 = qsmc.Value di2 = 1 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 dr("红方_编号") = ls1(0) dr("黑方_编号") = ls1(1) End If Next Else [此贴子已经被作者于2020/4/10 9:36:10编辑过]
|
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/10 0:31:00 -- 请教这段代码这样写对不对? |
||||
-- 作者:有点蓝 -- 发布时间:2020/4/10 8:56:00 -- 对不对测试看结果 |
||||
-- 作者:采菊东篱下 -- 发布时间:2020/4/10 9:50:00 -- 不用生成了,我看出不对了,dr是比赛积分表上的行变量,生成的数带不到对阵表上,所以还要定义对阵表上的行变量,对阵表上的数据生成后带进比赛积分表的。 |