标题用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下调试通过)