微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题用VB实现出圈游戏
栏目软件世界
作者赵玉勇
发布2001年20期
  某些单位由于工作性质决定须排班,工作非常烦琐,最好是用计算机解决,其实这和下面的出圈游戏的方法是类似的。有兴趣的朋友不妨将下面的程序改动一下,说不定对单位的信息化工作有重大的贡献呢!
   一、原理
  出圈游戏是这样的:有n个人排成一圈,然后先从任一人开始按顺时针方向依次从1报数,报到数s的人就出圈,下一个再从1开始报,报到s就出圈……一直到最后一人出圈为止。
  本程序的输入里面包含了圈的组成要素总人数n及n个人的姓名分别通过两文体框实现输入数据。还有做游戏的条件,第一个出圈的人第一次第r个,后面则是第s个),和以后如何出圈(所报的数s)。输出则是n个人的出圈次序。
  研究该问题的意义:对解决任何形式的轮流,公平的分配,是不可少的。
   二、处理过程分析
   1.对输入输出问题的分析
  输入数据中的人名比较麻烦很难找规律,可以使用数组变量Pep(n),输出时我们可以利用此数组。只有该数组还不能解决所有问题,因为组成出圈游戏的出局是很重要的,一旦出局,将不能再参与圈内的游戏,我们可以使用一记录使用标志数组Flag(n),它和Pep(n)正好一一对应,记录了游戏者的出局情况。
   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 '输出第一个出圈者
   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的余数。
   4.游戏规则
  做游戏有一些限制条件,如人数的限制,最少是1个人,所以少于1个人是没有意义的,我们可通过最外的一个分支语句来解决。
   三、VB程序
   1.界面
  本程序用了五个标签(Label),五个文本框(TextBox)和两命令按钮(CommandButton)。
   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   
  Print   , TxtOri.Text
  Close   
  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   '打开数据存放文件
  g = 1
  While Not EOF(2)
  Input   , hs$
  Pep(g)= hs$
  g = g + 1
  Wend
  Close   
  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下调试通过)