用VB实现出圈游戏 赵玉勇 2001年 20期 某些单位由于工作性质决定须排班,工作非常烦琐,最好是用计算机解决,其实这和下面的出圈游戏的方法是类似的。有兴趣的朋友不妨将下面的程序改动一下,说不定对单位的信息化工作有重大的贡献呢!   #1一、原理   出圈游戏是这样的:有n个人排成一圈,然后先从任一人开始按顺时针方向依次从1报数,报到数s的人就出圈,下一个再从1开始报,报到s就出圈……一直到最后一人出圈为止。   本程序的输入里面包含了圈的组成要素总人数n及n个人的姓名分别通过两文体框实现输入数据。还有做游戏的条件,第一个出圈的人第一次第r个,后面则是第s个),和以后如何出圈(所报的数s)。输出则是n个人的出圈次序。   研究该问题的意义:对解决任何形式的轮流,公平的分配,是不可少的。   #1二、处理过程分析   #21.对输入输出问题的分析   输入数据中的人名比较麻烦很难找规律,可以使用数组变量Pep(n),输出时我们可以利用此数组。只有该数组还不能解决所有问题,因为组成出圈游戏的出局是很重要的,一旦出局,将不能再参与圈内的游戏,我们可以使用一记录使用标志数组Flag(n),它和Pep(n)正好一一对应,记录了游戏者的出局情况。   #22.查找第一个出圈的人   根据条件,第一个出圈者我们可以通过如下步骤找出:先找到第r个人,然后以此人为基准(包括此人在内),向后数s,所以就应该是第(r+s-1)个人,如果r+s-1>n,则应该是第(r+s-1)/n 的余数个数。   因为后面在数人数时,此人将不再有用,所以将记录使用标志设为True,在以后的应用中将不再用他。这是将后面的人选出圈的规则。   程序如下:   k = r   If k > n Then k = k Mod n   k = k + s - 1   If k > n Then k = k Mod n   Flag(k)= True   TxtOrder.Text = Str(k)+ ":" + Pep(k)+ VbLf+VbCr '输出第一个出圈者   #23.查找第2到第n个出圈者   在找第2个出圈者和前面的稍有不同,因为在找第1个时不用考虑已经出圈者,所以在找之前先应该对比一下此人的记录的使用标志,如果标志标识为False(没有使用)才能用它比较,否则向下比较下一人,一直找到第s 个符合情况者,此人便是本次要找的出圈者,并将其记录使用标志设为True,以利于后来使用。查找程序如下:   y = 1   While y <= s   k = k + 1   If k > n Then k = k Mod n   If Flag(k)= False Then y = y + 1   Wend   If k > n Then k = k Mod n   Flag(k)= True   TxtOrder.Text = TxtOrder.Text + Str(k)+ ":" + Pep(k)+ VbLf+VbCr '输出第2-n个出圈者   因为其中涉及查找第r个人出现(r这个序列数比总人数n大的情况),所以在比较前还应该比较 r值的情况,看它是否比n大,如果大,需取其除n的余数。   #24.游戏规则   做游戏有一些限制条件,如人数的限制,最少是1个人,所以少于1个人是没有意义的,我们可通过最外的一个分支语句来解决。   #1三、VB程序   #21.界面   本程序用了五个标签(Label),五个文本框(TextBox)和两命令按钮(CommandButton)。   #22.源程序如下   Dim,n,r,s, k As Integer   Dim he As Integer '定义系统变量   Dim Pep()As String '存放人名数组   Dim Flag()As Boolean '记录数据使用与否标志   Private Sub CmdExit_Click()'退出按钮   End   End Sub   Private Sub CmdJudge_Click()'判断方按钮   '将文本框中的人名信息输入文件   Open "e\bitware\vb\200103\input.txt " For Output As #1   Print #1, TxtOri.Text   Close #1   n = Val(TxtTotal.Text)   r = Val(TxtFirst.Text)   s = Val(TxtMostNum.Text)   If n > 0 Then '对无人的情况不进行处理   '重置各数组   ReDim Pep(1 To n)   ReDim Flag(1 To n)   '将人名信息存入数组,以方便处理   Open "e:\bitware\vb\200103\input.txt " For Input As #2 '打开数据存放文件   g = 1   While Not EOF(2)   Input #2, hs$   Pep(g)= hs$   g = g + 1   Wend   Close #2   For i = 1 To n '初始使用标志   Flag(i)= False   Next i   he = 0 '找第一个出圈者   k = r   If k > n Then k = k Mod n '大于总人数时的处理   k = k + s - 1   If k > n Then k = k Mod n   Flag(k)= True   TxtOrder.Text = Str(k)+ ":" + Pep(k)+ vbCr + vbLf '找第2到第N个出圈者   For i = 2 To n   y = 1   While y <= s   k = k + 1   If k > n Then k = k Mod n   If Flag(k)= False Then   y = y + 1   End If   Wend   If k > n Then k = k Mod n   Flag(k)= True   TxtOrder.Text = TxtOrder.Text + Str(k)+ ":" + Pep(k)+ vbCr + vbLf   Next i   End If   End Sub   Private Sub Form_Load()   g = 1 '初始各文本框数据   TxtTotal.Text = ""   TxtFirst.Text = ""   TxtMostNum.Text = ""   End Sub   (本程序在VB6.0/Windows98下调试通过)