用VB实现出圈游戏
#1?牐犚弧⒃?
?牐牫鋈τ蜗肥钦庋模河衝个人排成一圈,然后先从任一人开始按顺时针方向依次从1报数,报到数s的人就出圈,下一个再从1开始报,报到s就出圈……一直到最后一人出圈为止。
?牐牨境绦虻氖淙肜锩姘巳Φ淖槌梢刈苋耸齨及n个人的姓名分别通过两文体框实现输入数据。还有做游戏的条件,第一个出圈的人?煹谝淮蔚趓个,后面则是第s个),和以后如何出圈(所报的数s)。输出则是n个人的出圈次序。
?牐犙芯扛梦侍獾囊庖澹憾越饩鋈魏涡问降穆至鳎降姆峙洌遣豢缮俚摹?
#1?牐牰⒋?理过程分析
#2?牐?1.对输入输出问题的分析
?牐犑淙胧葜械娜嗣冉下榉澈苣颜夜媛桑梢允褂檬楸淞縋ep(n),输出时我们可以利用此数组。只有该数组还不能解决所有问题,因为组成出圈游戏的出局是很重要的,一旦出局,将不能再参与圈内的游戏,我们可以使用一记录使用标志数组Flag(n),它和Pep(n)正好一一对应,记录了游戏者的出局情况。
#2?牐?2.查找第一个出圈的人
?牐牳萏跫谝桓龀鋈φ呶颐强梢酝ü缦虏街枵页觯合日业降趓个人,然后以此人为基准(包括此人在内),向后数s,所以就应该是第(r+s-1)个人,如果r+s-1>n,则应该是第(r+s-1)/n 的余数个数。
?牐犚蛭竺嬖谑耸保巳私辉儆杏茫越锹际褂帽曛旧栉猅rue,在以后的应用中将不再用他。这是将后面的人选出圈的规则。
?牐牫绦蛉缦拢?
?牐爇 = r
?牐營f k > n Then k = k Mod n
?牐爇 = k + s - 1
?牐營f k > n Then k = k Mod n
?牐燜lag(k)= True
?牐燭xtOrder.Text = Str(k)+ ":" + Pep(k)+ VbLf+VbCr '输出第一个出圈者
#2?牐?3.查找第2到第n个出圈者
?牐犜谡业?2个出圈者和前面的稍有不同,因为在找第1个时不用考虑已经出圈者,所以在找之前先应该对比一下此人的记录的使用标志,如果标志标识为False(没有使用)才能用它比较,否则向下比较下一人,一直找到第s 个符合情况者,此人便是本次要找的出圈者,并将其记录使用标志设为True,以利于后来使用。查找程序如下:
?牐爕 = 1
?牐燱hile y <= s
?牐爇 = k + 1
?牐營f k > n Then k = k Mod n
?牐營f Flag(k)= False Then y = y + 1
?牐燱end
?牐營f k > n Then k = k Mod n
?牐燜lag(k)= True
?牐燭xtOrder.Text = TxtOrder.Text + Str(k)+ ":" + Pep(k)+ VbLf+VbCr '输出第2-n个出圈者
?牐犚蛭渲猩婕安檎业趓个人出现(r这个序列数比总人数n大的情况),所以在比较前还应该比较 r值的情况,看它是否比n大,如果大,需取其除n的余数。
#2?牐?4.游戏规则
?牐犠鲇蜗酚幸恍┫拗铺跫缛耸南拗疲钌偈?1个人,所以少于1个人是没有意义的,我们可通过最外的一个分支语句来解决。
#1?牐犎B程序
#2?牐?1.界面
?牐牨境绦蛴昧宋甯霰昵?(Label),五个文本框(TextBox)和两命令按钮(CommandButton)。
#2?牐?2.源程序如下??
?牐燚im,n,r,s, k As Integer
?牐燚im he As Integer '定义系统变量
?牐燚im Pep()As String '存放人名数组
?牐燚im Flag()As Boolean '记录数据使用与否标志
?牐燩rivate Sub CmdExit_Click()'退出按钮
?牐燛nd
?牐燛nd Sub
?牐燩rivate Sub CmdJudge_Click()'判断方按钮
?牐牐Ы谋究蛑械娜嗣畔⑹淙胛募?
?牐燨pen "e?焅bitware\vb\200103\input.txt " For Output As #1
?牐燩rint #1, TxtOri.Text
?牐燙lose #1
?牐爊 = Val(TxtTotal.Text)??
?牐爎 = Val(TxtFirst.Text)??
?牐爏 = Val(TxtMostNum.Text)??
?牐營f n > 0 Then '对无人的情况不进行处理
?牐牐е刂酶魇?
?牐燫eDim Pep(1 To n)??
?牐燫eDim Flag(1 To n)??
?牐牐Ы嗣畔⒋嫒胧椋苑奖愦?理
?牐燨pen "e:\bitware\vb\200103\input.txt " For Input As #2 '打开数据存放文件
?牐爂 = 1
?牐燱hile Not EOF(2)??
?牐營nput #2, hs$
?牐燩ep(g)= hs$
?牐爂 = g + 1
?牐燱end
?牐燙lose #2
?牐燜or i = 1 To n '初始使用标志
?牐燜lag(i)= False
?牐燦ext i
?牐爃e = 0 '找第一个出圈者
?牐爇 = r
?牐營f k > n Then k = k Mod n '大于总人数时的处理
?牐爇 = k + s - 1
?牐營f k > n Then k = k Mod n
?牐燜lag(k)= True
?牐燭xtOrder.Text = Str(k)+ ":" + Pep(k)+ vbCr + vbLf '找第2到第N个出圈者
?牐燜or i = 2 To n
?牐爕 = 1
?牐燱hile y <= s
?牐爇 = k + 1
?牐營f k > n Then k = k Mod n
?牐營f Flag(k)= False Then
?牐爕 = y + 1
?牐燛nd If
?牐燱end
?牐營f k > n Then k = k Mod n
?牐燜lag(k)= True
?牐燭xtOrder.Text = TxtOrder.Text + Str(k)+ ":" + Pep(k)+ vbCr + vbLf
?牐燦ext i
?牐燛nd If
?牐燛nd Sub
?牐燩rivate Sub Form_Load()?煟?
?牐爂 = 1 '初始各文本框数据
?牐燭xtTotal.Text = ""
?牐燭xtFirst.Text = ""
?牐燭xtMostNum.Text = ""
?牐燛nd Sub
?牐牐ū境绦蛟赩B6.0/Windows98下调试通过)??