让大脑练“功夫”——智力过河编程指南

编程魔方

前言:智力过河是一个考你大脑逻辑思维能力的游戏。在河边有8个人等待过河,游戏任务是在满足一系列条件下利用一条船把人都送到河的另一边。由于人数众多,在这样的复杂情况下来完成任务自然就需要动一番脑筋了。

周星驰忙着在电影上玩功夫,我们就站在软件设计者的角度,让大脑也来练练“功夫”。就让我们赶紧来看看如何制作这个程序吧。本期程序下载地址:http://www.cpcw.com/51/game.rar。

一、功夫的套路——游戏规则

功夫开练前,先要弄明白怎么个玩法,我们先来看看智力过河的游戏规则:

游戏中有8个人(爸爸、妈妈、小偷、警察、男孩1、男孩2、女孩1、女孩2),在从河的一边到另一边的过程中必须满足下列条件:

1.只有爸爸、妈妈、警察才能开船。

2.爸爸不在男孩身边时,妈妈要欺负任意一个男孩。

3.妈妈不在女孩身边时,爸爸要欺负任意一个女孩。

4.警察不在这一家人身边时,小偷要欺负这一家六人。

5.船一次可以载一个或两个人。

二、功夫的练法——游戏制作思路

知道了游戏规则,我们就可以来探讨游戏是怎么制作的了。为了讲述清楚,我们先来看看整个程序制作的逻辑要点。

(1)判断前的准备

编制这个游戏的主要工作就是判断玩家点击某个人或者发送开船命令时程序该依据规则作何响应。举个例子:点击小偷,把小偷装上船。然后发送开船命令,这时程序依据游戏规则进行逻辑判断,由于小偷不具备开船的能力,因此游戏不能进行下去并给出相关提示。

那么要依据游戏规则进行判断先要做哪些工作呢?主要有以下这几点:

1.船在河南还是河北:shipposition为1表示船在河南,为2表示船在河北。

2.船上有多少人:shipnum记录船上人员个数。

3.是否允许上船:result为1表示允许,为2表示不允许。

4.每个人所在位置:为每个人建立一个变量记录此人所在位置,比如fatherposition(爸爸的位置),为1表示爸爸在河南,为2表示爸爸在河北,为3表示爸爸在船上。

5.船的两个座位是否有人:建立两个变量ShipSeat1、ShipSeat2:值为1表示有人坐在此座位上,为0表示无人坐在此座位上。

6.船的启停,用Timer来动态实现,当发送开船命令后启动时钟程序,当船到达彼岸后时钟自动停止。这里需要考虑两点:首先是船在什么时候停止,另外船在行进过程中,如果用户点击了某个人或者再次发送开船命令,这时系统应该将这些操作视为无效并作出相应提示。

(2)依据游戏规则对事件作出响应

有了前面的准备工作,我们就可以根据游戏提供的规则,对人物点击事件进行相应的处理了:

如果在河南的渡口上船:

1.判断河南剩余人员是否满足游戏规则。

2.判断船上人员是否满足游戏规则。

3.判断船上人员和河北人员是否满足游戏规则。

如果在河北的渡口上船:

1.判断河北剩余人员是否满足游戏规则。

2.判断船上人员是否满足游戏规则。

3.判断船上人员和河南人员是否满足游戏规则。

注意在满足条件后才可以执行过河,过河后要对相关全局变量重新赋值。

在发送过河命令事件中还需要进行下列逻辑判断:

1.满足游戏规则:只有爸爸、妈妈、警察才能开船;

2.判断当船上只有一个人时(爸爸、妈妈、警察三者之一),河两岸人员是否会发生冲突。

三、我出哪一招——实现方法的选择

当了解了整个的编程思路后,就可以动手编程了。由于细节较多,不可能一一讲述,这里只简单讲一下两种实现方法的选择。

我们先来看第一种方法:在每个人员的OnClick事件中进行逻辑判断,判断是否允许此人可以上船,如果可以上船,再对相关变量赋值,然后在开船按钮的OnClick事件中进行逻辑判断,判断是否可以开船。如果可以开船,启动开船时钟程序,动态模拟开船。

再来看看另一种更直接的方法:我们只在开船按钮的OnClick事件中进行所有的逻辑判断,当满足条件后就可以模拟开船。

这两种思路都能实现程序,那我们采用哪种方法呢?这里笔者选择的是第一种思路。原因是这样的、当船上有一个人后,再点击另一个人,如果条件不满足就不允许此人上船(不改变这个人的Top和Left)。而第二种思路是如果不满足条件,还要玩家手动卸载人员,从玩法考虑,第二种方法就不人性化,所以首选第一种实现方法。但如果从编程的难易程度来讲,则用第二种方法编码可能实现要容易些。程序界面可参考图1。

51-e13-1-3.jpg
图1

四、收功——制作扩展及小结

为了让我们的程序更加有趣,我们可以考虑设置一些小机关。这里考虑到不是每个人都能做出来,因此我们可以在主窗体上做一个隐形机关,发现这个机关就可以找到答案哦(部分答案如图2)。

51-e13-2-1.jpg
图2

总的来讲,游戏的算法容易理解,编码难度不大。但由于相关的游戏规则较多,所以在实现的时候需要大家的细致和耐心才能完成程序。另外在众多复杂的条件中如何理清程序思路、提高编码效率也值得大家探讨。