用VB实现出圈游戏

Author: 赵玉勇 Date: 2001年 20期

?牐犇承┑ノ挥捎诠ぷ餍灾示龆ㄐ肱虐啵ぷ鞣浅7乘觯詈檬怯眉扑慊饩觯涫嫡夂拖旅娴某鋈τ蜗返姆椒ㄊ抢嗨频摹S行巳さ呐笥巡环两旅娴某绦蚋亩幌拢挡欢ǘ缘ノ坏男畔⒒ぷ饔兄卮蟮墓毕啄兀?
  #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下调试通过)??