狡兔“十”窟——趣味游戏“狐狸捉兔子”编辑指南
软件世界
前言:曾经碰到一道非常有趣的竞赛题:围绕着山顶有10个洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身在这十个洞中。先到1号洞找,第二次隔1个洞找,第三次隔两个洞找,以后依此类推,次数不限。”狐狸从早到晚进进出出了1000次,仍然没有找到兔子。亲爱的读者,你能猜到狡猾的兔子在哪个洞里吗?完整程序的下载地址:http://www.cpcw.com/47/game.rar。
一、思路解析
题目很有趣,但如果只用一张纸和一只笔演算,恐怕好久也不能得到结果。遇到这类需要按规律进行大量计算的题目时,我们自然又把希望寄托在程序上了。既然要用程序解答,我们就先来看看思路:
假设寻找次数为step,该去的洞的号数为number,但因为只有10个洞,所以找到的实际的洞则应该为number与10求模的结果。比如说算出来这次狐狸该进第12号洞来找兔子,但由于一共才10个洞,所以要对12求模。12 MOD 10=2,所以最后狐狸要进的洞的号数是1。下面我们来看看具体的规律:
第一次寻找step=1:去number=step+number=1号洞,找到的洞为:i=number mod 10=1;
第二次寻找step=step+1=2:去number=step+number=1+2=3号洞,找到的洞为:i=number mod 10=3;(隔1个洞)
第三次寻找step=step+1=3:去number=step+number=3+3=6号洞,找到的洞为:i=number mod 10=6;(隔2个洞)
第四次寻找step=step+1=4:去number=step+number=4+6=10号洞,找到的洞为:i=number mod 10=0;(隔3个洞)
……
第1000次寻找……
二、编程要点
理解了上述算法后此题就不难求解了。我们采用的编程工具是Delphi。在编程中,为了生动地显示狐狸寻找兔子的过程,我们会用到时钟控件,下面来看看编程中的一些重点部分。
1.首先要设计一个友好的界面
打开Delphi,新建一项目,在主窗体上放置10个圆,表示山洞,并用Label做好标记0-9。然后放置一个Timer控件,三个Edit分别用于设置狐狸奔跑速度、设置循环次数、显示实际进洞的次数、一个ListBox用于输出狐狸没有到达的洞,一个开始按钮(如图1)。
2.程序初始化的准备工作
初始化数组、时钟控件等工作:
procedure TForm1.Image5MouseUp(Se
nder: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
j:integer;
begin
for j:=0 to 9 do
hole[j]:=0; //初始化数组,开始所有洞都没有找过
step:=0;
number:=0;
ListBox1.Clear;//清空列表框
ListBox1.Items.Add ('没进的洞');
Timer1.Interval:=StrToInt(Edit2.Text); //狐狸的速度
Timer1.Enabled:=true;
//初始化进过的洞的标志
Shape0.Pen.Color:=clBlack;
……(把所有圆的边框都设置为黑色,作为狐狸是否到达该洞的标志)
Shape9.Pen.Color:=clBlack;
end;
3.在Timer中写入动态显示狐狸的寻找过程的代码
procedure TForm1.Timer1Timer(Sender: TObject);
var
j:integer;
begin
Shape0.Brush.Color:=clYellow ;
……(每执行一次,都需要把圆的背景颜色复位为黄色,原因是:圆的背景色表示狐狸的位置:狐狸到达山洞时的圆的颜色为绿色,离开后为黄色)
Shape9.Brush.Color:=clYellow ;
//在狐狸动作前需要判断循环次数是否为设定值,如果是则停止狐狸的动作,输出没去过的洞,并把没去过的洞的颜色设置为绿色
if step=StrToInt(Edit3.Text) then //设置狐狸进洞的总次数
begin
for j:=0 to 9 do
begin
if hole[j]=0 then //表示没有进的洞
begin
ListBox1.Items.Add(IntToStr(j));//输出未找过的洞
case j of
0: Shape0.Brush.Color:=clLime;
………………
9: Shape9.Brush.Color:=clLime;
end;
end;
end;
Timer1.Enabled:=false;//停止狐狸的运动
Exit;
end;
//狐狸的运动
step:=step+1; //次数加1
number:=number+step; //第step次找到的洞,这个值要累加
i:=number mod 10; //求模运算,求解狐狸到达第几个洞
hole[i]:=1; //该洞已经找过
Edit1.Text:=IntToStr(step);
case i of 0:
begin
Shape0.Brush.Color:=clLime ; //如果到达第0个洞,0号洞的颜色变为绿色
Shape0.Pen.Color:=clRed; //0号洞的边框颜色变为红色,表示狐狸曾经来过此洞
exit;
end;
……(相似代码,忽略)
9:
begin
Shape1.Brush.Color:=clLime ;
Shape1.Pen.Color:=clRed;
exit;
end;
end;
end;
三、小结
经过编码后,我们就要验证程序了。试运行了一下,由于采用了动态的显示,程序效果非常好,运行界面见图2。
在这个趣味程序的编制过程中,有两点值得注意:一是在程序编制思路分析部分,如何利用好取模运算来解决狐狸实际到达的地点的问题。二是当我们已经分析出了程序思路后,本来可以用更简单的编码来完成程序,但我们使用了Timer控件结合多种颜色的圆圈来非常直观地显示狐狸的动作。也就是说,即使是在面对一些很简单的问题的时候,我们也要注意程序界面是否友好、用户的感受这些最基本的问题。


