快捷链接
下载地址
相关随笔
正文
I;P (I'm a Programmer)是一款Android平台下类似"推箱子"的益智游戏, 其玩法是通过逻辑判断和控制完成游戏各关卡设定, 当玩家将游戏中的'箱子'安装关卡要求的方式摆放时即为通关. 由于游戏本身是倾向于程序员, 工程师或者算法爱好者的, 而且我也认为通过此游戏可以培养和锻炼个人的"编程思维", 因此游戏的名字在一开始就被定为 I;P (I'm a Programmer)了, 这个全称到缩写的过程也就构成了游戏的起始画面.

I;P关卡一共分为六大类, 分别是'Tutorials'(教程),'Easy'(容易), 'Hard'(难), 'Crazy'(疯狂), 'Impossible'(不可能)和'Unsolved'(未解决)[(原谅我界面全部都是英文, 因为现在真没时间加载中文字库...)], 理论上除第一个是教程外, 后面的关卡是越来越难. 目前由于是Preview阶段, I;P的关卡有限, 且分类还是比较混乱的, 后续会根据反馈进行相应的调整.

这里建议先从'Tutorias'开始, 因为这是一个包含三个关卡的教程包. 游戏将引导你通过三个关卡, 并在过程中提示该如何使用游戏中的各个元素.

当选择一个关卡后, I;P进入关卡界面, 在此界面中, 主要元素为左上的"箱子初始"摆放, 右上的"箱子目标"摆放; 而左下的四条长方形构成的区域为玩家"控制指令区", 可以在此区域内输入你的"指令"集, 以"控制"上方"箱子"区域中的"托盘"来移动相应的"箱子"; 界面中最右侧是"菜单"区域, 游戏中的菜单都集中在此, 并会根据不同场景显示不同的菜单. 需要注意的是整个界面的最右下方的"运行"按钮 -- 当"指令"输入完成时, 点击此钮开始执行你的指令, 而在执行过程中的任何时候或者执行完毕, 点击此钮, 界面将恢复到其初始状态.

一, 箱子
I;P中一共有四种箱子, 分别由'蓝色','绿色','红色'和'黄色'四种颜色标识. 游戏规则也要求在摆放箱子时'颜色'要一致.




二, 指令
I;P提供了四个输入列(从f0到f3), 每一个列都包含了八个控制框和八个判断框, 就是说一个列最多可以包含十六个指令. 但各个输入列可以相互调用, 比如在f0中可以输入'f1', 意味着f0将调用f1中的指令.




由于输入列有两种状态: 输入和展示, 因此游戏中每个指令都有两种不同的形式.
点击任何一个输入列(f0~f1), 都可以切换其到输入状态, 此时可以点击指定的控制框或者判断框, 以选择自己所需的各个指令.

"控制指令"用于控制黑色的"托盘"的行为:
向右移动一格;
向左移动一格;
"充电"; 当"托盘"被要求"充电"时, 如果其上放置了"箱子", "托盘"将"释放其上的"箱子", "箱子"将自动移动到"最上"可以到达的位置; 反之, 如果"托盘"上没有任何的"箱子", 托盘将尝试从其所在的列中"抓取"一个箱子, 如果没有, 则什么也不做;
调用f0输入列
调用f1输入列
调用f2输入列
调用f3输入列
"判断指令"用于判断当前"托盘"上的"箱子"状态的; 当"判断"结果为"真"时, 游戏将执行其后的"控制指令", 反之不执行其后的"指令", 而是调用下一个判断框中的"判断指令"或是下一个控制框中的"指令"; 也就是说, "判断指令"只能影响到其后的一个"控制指令", 即一对一关系.
判断"托盘"上的箱子为"蓝色"箱子;
判断"托盘"上的箱子为"绿色"箱子;
判断"托盘"上的箱子为"红色"箱子;
判断"托盘"上的箱子为"黄色"箱子;
判断"托盘"上的箱子为任意颜色的箱子;
判断"托盘"上的箱子没有箱子;
游戏每次都从f0输入列的第一个指令框开始安装顺序执行, 因此必须指令必须从f0开始输入, 当执行过程中碰到一个'空'的控制指令时, 即调用的控制框中没有任何指令时, 执行过程停止, 并显示'Code Finished'指示.
由上面内容我们可以看出, 实际输入过程就是编写"代码"的过程, "判断指令"即为'if'判断代码, 而'控制指令'即为要执行的命令代码, 而"输入列"就对应了代码中的函数.
比如下面截图可以转换成相应的代码:

f0() {
if (托盘上的箱子==白色) {
充电();
}
if (托盘上的箱子 == 黄色) {
左移();
}
....
if (托盘上有箱子) {
调用f1();
}
}
三, 执行结果
I;P中有四种执行结果;
成功: 将箱子按照关卡要求的位置摆放;

执行完毕: 指令全部执行完毕, 但未完成关卡要求;

指令异常: 指令执行时使"托盘"移动出边界;

栈溢出: 输入列调用次数过多;

四, 分数
当关卡通过时, 游戏会显示当前指令的得分已经关卡的标准分数, 这个分数是越小越好, 因为分数是跟指令数量和类型相关的, 越少的指令通关也就越好. 注意的是, 根据指令计算分数时, 未执行到的指令一样会被统计, 因此需要注意删除无用指令, 以降低通关分数.
如下图, 30/24中, 前面的分数为当前指令得分, 后面的24为关卡标准分数.

五, 菜单项
I;P有三级菜单, 根据不同的场景显示相关的菜单项;
: 清除当前指令
: 显示更多菜单项
: 显示关卡信息
: 显示游戏配置项
: 退出当前关卡, 切换至关卡选择界面
: 返回当前关卡
: 退出当前关卡, 切换至下一关卡
: 分享当前通关界面


: 设置/取消Debug状态, 此状态开启, 可以使用'单步执行'功能;
: 处于Debug状态时, 执行一条指令, 执行后自动暂停;
: 处于Debug状态时, 不再单步执行指令, 而是直接执行完毕;
六, 配置项
游戏有三个配置项:
'Clock Speed': 时钟速度, 就是指令执行速度; 有三个档位可以选择;
'Music': 开启或关闭游戏背景音乐;
'Sound': 开启或关闭游戏内置音效;

七, 交流
通过微信扫描下面二维码, 即可加入'I;P'临时群;

有任何问题和建议, 请跟帖或发mail来~谢谢了~