关卡编号:3-1
关卡难度:*
通关条件:南瓜5个,开关0个。
关卡目标:使用for循环来重复执行代码。
关卡3-1场景图如图4.2所示。
图4.2 关卡3-1场景图
本关卡中需要收集5个南瓜,大家思考一下这些南瓜和传送门的分布有什么特点?
首先,主角每次通过传送门,都会站在旁边一列的起点位置;其次,所有传送门到南瓜的距离相等。这样就可以使用for循环收集所有的南瓜了,需要让循环执行几次呢?这需要大家动动脑筋了。
for (int i = 0; i < 5; i++)
{
move();
move();
take();
move();
}
for循环需要执行5次,每次循环收集一列砖块上的南瓜。
循环的初始化计数器i设置为0,继续循环条件设置为i<5,每次循环i增加1。这样就可以让for循环执行5次,在每次循环中,都使用move()命令前进2格,使用take()命令收集南瓜,再使用move()命令进入传送门。
关卡3-1通关路线图如图4.3所示。
图4.3 关卡3-1通关路线图
关卡编号:3-2
关卡难度:*
通关条件:南瓜4个,开关0个。
关卡目标:使用for循环收集四边的南瓜。
关卡3-2场景图如图4.4所示。
图4.4 关卡3-2场景图
本关卡中需要收集4个南瓜,这些南瓜的分布特点是位于正方形四个边上,相对位置也是相同的。主角收集一条边上南瓜的代码,可以在for循环中多次使用。
for(int i = 0; i < 4; i++){
move();
take();
move();
move();
move();
right();
}
根据南瓜的分布位置,主角先移动1格收集南瓜,接下来再向前移动3格,然后右转,主角又站在下一条边的起点上。使用for循环执行上面的代码4次就可以收集到全部的南瓜。关卡3-2通关路线图如图4.5所示。
图4.5 关卡3-2通关路线图
关卡编号:3-3
关卡难度:**
通关条件:南瓜0个,开关8个。
关卡目标:使用for循环打开所有开关。
关卡3-3场景图如图4.6所示。
图4.6 关卡3-3场景图
本关卡中共有8个开关,其中4个处于“关闭”状态,4个处于“打开”状态。因此,完成关卡的关键是打开4个“关闭”状态的开关。
“关闭”状态的开关位于正方形四条边的中心上,距离主角的初始位置都有2格。这样的开关分布,可以方便地使用for循环来打开这些“关闭”状态的开关。
for(int i=0; i<4; i++){
move();
move();
toggle();
left();
left();
move();
move();
left();
}
首先打开主角初始位置前面的开关,然后主角回到初始位置,转身朝向下一个开关方向,这样的过程使用for循环重复4次就可以打开所有的开关。关卡3-3通关路线图如图4.7所示。
图4.7 关卡3-3通关路线图
关卡编号:3-4
关卡难度:**
通关条件:南瓜0个,开关8个。
关卡目标:识别传送门所产生的重复模式。
关卡3-4场景图如图4.8所示。
本关卡中需要收集5个南瓜,需要大家找到这5个南瓜和传送门的分布规律。
图4.8 关卡3-4场景图
如果找不出规律,可以用笔在主角可能的行进线路上画出移动轨迹,看能不能找出规律。找到这个规律,就可以使用for循环收集所有的南瓜了。
for(int i = 0 ; i < 5; i++){
move();
left();
move();
move();
take();
right();
}
从主角的初始位置出发,先向前移动1格,然后左转移动2格,收集南瓜,然后向右转。这里就完成了第一个南瓜的收集,收集第二个南瓜也是一样的过程。这样就可以使用for循环,让收集第一个南瓜的代码重复运行5次,从而收集关卡中所有的南瓜。关卡3-4通关路线图如图4.9所示。
图4.9 关卡3-4通关路线图
关卡编号:3-5
关卡难度:**
通关条件:南瓜0个,开关3个。
关卡目标:将重复模式分解成函数和for循环。
关卡3-5场景图如图4.10所示。
本关卡中需要打开3个开关,这些开关分布在3条支线路径的尽头。在每条支线路径上,主角都要走到开关的位置,打开开关,然后回到支线起点位置。
这个关卡有一定的难度,要完成关卡目标,需要综合运用已经学习过的命令、函数和for循环等知识。
图4.10 关卡3-5场景图
void Move7Step(){
for(int i=0;i<7;i++){
move();
}
}
for(int i = 0; i<3 ; i++) {
move();
move();
right();
Move7Step();
toggle();
left();
left();
Move7Step();
right();
}
完成支线任务的命令集合可以定义成一个函数,然后使用for循环重复调用这个函数。
首先,定义前进7步的函数Move7Step(),用来从支线路径的起点走到开关的位置。
然后,让主角完成一条支线路径的打开开关的过程:向前移动2格,右转,然后使用函数Move7Step()来到开关所在砖块上,打开开关,转身,再调用函数Move7Step()回到分支路线起始位置,向右转。
最后,将“支线代码”放在for循环中,循环次数设定为3,这样就可以打开3个支线路径上的所有开关。
关卡3-5通关路线图如图4.11所示。
图4.11 关卡3-5通关路线图
在编写代码时,大括号和小括号都是成对出现的,永远不会出现单数的情况。因此,书写代码时一定要检查好大括号和小括号,不能丢失。
关卡编号:3-6
关卡难度:***
通关条件:南瓜6个,开关6个。
关卡目标:将多个模式分解成函数和for循环。
关卡3-6场景图如图4.12所示。
图4.12 关卡3-6场景图
本关卡中需打开6个开关和收集6个南瓜,开关和南瓜分布在3列中,并且都是左右对称分布的。
因为每列上南瓜和开关的位置都相同,可以使用for循环重复执行这些命令。为了代码规整易读,可以分别定义收集南瓜的函数和打开开关的函数。
void OpenTwoSwitch(){
move();
toggle();
move();
toggle();
left();
left();
move();
move();
}
void TakeTwoReward(){
move();
take();
move();
take();
left();
left();
move();
move();
}
for (int i = 0 ; i<3; i++){
left();
OpenTwoSwitch();
TakeTwoReward();
right();
move();
}
Open的中文含义是打开,Two是两个的意思,Switch表示开关,Take表示收集,Reward的本意是“奖励”,这里指代南瓜。
首先定义函数OpenTwoSwitch(),此函数的功能是打开两个开关。主角起始位置距离最近的开关1个砖块,且面向开关方向;函数运行结束后,回到起始位置,背向开关方向。
void OpenTwoSwitch(){
move();
toggle();
move();
toggle();
left();
left();
move();
move();
}
然后定义函数TakeTwoReward(),此函数的功能是收集两个南瓜。主角起始位置距离最近的南瓜1个砖块,且面向南瓜方向;函数运行结束后,回到起始位置,背向南瓜方向。
void TakeTwoReward(){
move();
take();
move();
take();
left();
left();
move();
move();
}
有了函数OpenTwoSwitch()和函数TakeTwoReward(),下面使用for循环收集南瓜和打开开关,因为有3条支线路径,循环的次数设定为3。
for (int i = 0 ; i<3; i++){
left();
OpenTwoSwitch();
TakeTwoReward();
right();
move();
}
关卡3-6通关路线图如图4.13所示。
图4.13 关卡3-6通关路线图
关卡编号:3-7
关卡难度:***
通关条件:南瓜16个,开关0个。
关卡目标:组合所学技能,使用循环、函数分解问题。
关卡3-7场景图如图4.14所示。
图4.14 关卡3-7场景图
本关卡中需收集4组共计16个南瓜。4组南瓜在场景的4个角落,每组有4个南瓜,呈现“山”字形。虽然每组南瓜的方向不太一致,但排布方式是一样的。
每组南瓜旁边都有1个传送门,位于“山”字底部中间。
通过分析场景中南瓜的部分特点,大家应该可以找到收集这些南瓜的方法。
void TurnBack(){
left();
left();
}
void TakeGroup(){
move();
take();
left();
move();
take();
TurnBack();
move();
left();
move();
take();
TurnBack();
move();
left();
move();
take();
move();
}
for( int i = 0; i< 4; i++ ){
TakeGroup();
}
根据南瓜分布的规律,定义函数TakeGroup()来收集1组南瓜,然后用for循环重复4次执行函数TakeGroup()来收集所有南瓜。
为了使用方便,先定义让主角转身的函数TurnBack()。
void TurnBack(){
left();
left();
}
函数TakeGroup()收集1组南瓜。收集每组南瓜的顺序相同,都是先收集中心位置南瓜,然后顺时针收集其他3个南瓜。
void TakeGroup(){
move();
take();
left();
move();
take();
TurnBack();
move();
left();
move();
take();
TurnBack();
move();
left();
move();
take();
move();
}
使用for循环执行4次TakeGroup(),就可以收集4组南瓜。在每组南瓜收集完毕后,主角会通过传送门到达另一组南瓜旁边。
for( int i = 0; i< 4; i++ ){
TakeGroup();
}
关卡3-7通关路线图如图4.15所示。
图4.15 关卡3-7通关路线图