难度比较大!
用面向对象方法和面向对象程序设计语言,实现满足下述要求的单个机器人的活动仿真程序。
问题域概述
创建一个仿真系统,使得用户可以操纵机器人来探索虚拟世界,并观察机器人的行为。
虚拟世界用来模拟现实世界中的不同环境(这里假设它是由14×14的方格构成的,如下图所示)。在虚拟世界的特定区域存在一些障碍物,机器人在运动过程中,必须避开这些障碍物。在虚拟世界的交叉点上可能会放置单个的字符。机器人到达这个位置时,用户可以控制机器人读取这个字符,或者用其他的字符替换这个位置的字符。机器人在虚拟世界中只能沿着交叉点向东、南、西、北四个方向做直线运动(不能走斜线)
机器人维护着两个变量b1和b2,用来保存从虚拟世界中读取的字符。
机器人有6种基本动作:
(1) Move:机器人朝着正前方移动一个交叉点(以上图中的机器人为例,执行一次“Move”动作之后,机器人由位置(8,1)移动到(7,1))。
(2) Left:机器人原地沿逆时针方向旋转90度。
(3) Read:机器人读取其所在位置的字符,并将这个字符的值赋给b1;如果这个位置上没有字符,则不改变b1的当前值。
(4) Write:机器人将b1中的字符写入机器人当前所在的位置,如果这个位置上已经有字符,该字符的值将会被b1的值替代。如果这时b1没有值,即在执行Write动作之前没有执行过任何Read动作,那么需要提示用户相应的错误信息。
(5) b1=b2:将b2的值赋给b1,b1的值被b2的值替代。
(6) b2=b1:将b1的值赋给b2,b2的值被b1的值替代。
用户有3种操控机器人的方法:
(1) 手动控制:通过直接调用机器人的基本动作使机器人产生相应的行为。例如用户直接发送“Move”命令,使机器人移动到下一个交叉点。
(2) 自动控制(Run):事先编排好机器人的动作序列(这里称为指令),直接执行这个指令,使机器人可以连续运作。
(3) 单步控制(Step):是自动控制方式一种特殊形式,只执行指定指令中的一个动作。单步控制与手动控制的区别在于,单步控制时执行的是指令中的动作,只有一种控制方式,即执行下个动作;而手动控制时有6种基本动作可控制。
限定条件
(1) 机器人不能跨越虚拟世界的边界,即机器人的活动范围只能在上图所示的14×14 的方阵内。
(2) 机器人不能穿越障碍物,只能避开。
(3) 若机器人试图跨越边界或穿越障碍物,则必须提示用户,不允许执行这个操作。
(4) 变量b1、b2的值只能通过机器人的“Read”、“b1=b2”、“b2=b1”动作设置,不能在程序中进行初始化。
须仿真的活动
(1) 创建虚拟世界:根据障碍物、字符的特定位置(针对特定的虚拟世界,这些位置在仿真过程中不能改变)和机器人的初始位置,创建机器人的活动环境(这时称虚拟世界处于其初始状态)。虚拟世界处于初始状态时,默认为机器人都面向北方。
(2) 用户手动控制机器人的行为:要能够提供用户直接调用机器人基本动作的方式。
(3) 用户采用自动控制方式操控机器人。
(4) 用户采用单步控制方式操控机器人。
(5) Reset:终止机器人的活动,并回到虚拟世界的初始状态。
(6) 提示用户错误操作:在仿真过程中,若出现错误而导致仿真活动无法继续进行时,要给出明确的错误提示信息。
仿真时的可变参数
(1) 创建虚拟世界所必须的信息(障碍物、字符的位置和机器人的初始位置)必须以文件的形式输入到仿真系统中。这样在仿真的过程中,用户可以通过选择不同的文件来创建不同的虚拟世界,改变机器人的工作环境。
(2) 指令必须以文件形式输入到仿真系统中,这样用户可以通过选择不同的指令文件来改变机器人的行为。
(3) 在执行某条指令时,每两个动作之间可以有短暂的延迟,即机器人需等待这个延迟结束后,才能进行下一个动作。延迟的长短由用户在开始操控机器人之前指定。用户若不指定,则采用仿真系统的默认值:1秒。
开发结果的行为特征
(1) 能够提供用户操控机器人的三种方式;
(2) 有简单的界面,以体现:
• 机器人和字符的当前位置。如果用数据而不是用图形表示,应给出机器人和字符的坐标,如:机器人的位置(8,1),字符F的位置(8,3),等等。
• 机器人的下一步操作(在手动控制方式下,不需要显示)。
• b1、b2的当前值。
注意能说明问题即可,切忌把主要精力放在界面上而忽视了实质问题。
可在完成本作业的基础上,将虚拟世界中的机器人扩展到两个或更多个,并让这些机器人相互交换其变量b1、b2的值,进行协作和通信。也可以将用户手动操控机器人时的动作序列记录下来,自动构成新的指令。也可以把机器人的多次不同执行轨迹,用不同的颜色标注出来。
[此贴子已经被作者于2007-10-17 14:12:20编辑过]