用VB实现出圈游戏

某些单位由于工作性质决定须排班,工作非常烦琐,最好是用计算机解决,其实这和下面的出圈游戏的方法是类似的。有兴趣的朋友不妨将下面的程序改动一下,说不定对单位的信息化工作有重大的贡献呢!
  #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下调试通过)