终结篇
差不多半年没有打理这个实战系列了。原因有:(1)我没有库存了。这个系列是我为Android实践课程开发的。课程的设计是,首先带同学们入门(就是前面的十四篇起到的作用),然后要求他们扩展功能。(2)最近,我的关注点落在Web开发(前端 + 全栈)上了。我觉得呀,Android/iOS开发人才市场有点饱和了,而移动Web开发是新的热点。于是,我“转行“了。
今天登陆CSDN网,注意到有网友给我发私信,要推箱子游戏程序的源代码。我决定补充这个终结篇。
首先,发布推箱子游戏程序的源码链接:https://github.com/yeahatgithub/TuiXiangzi。
接下来,我作出几点说明。
上述源码与前面的十四篇博文引用的源码会有出入。上述源码的功能比较全面,可以说包括了推箱子游戏的主要功能。共有12关,而且关卡数据保存在文件中。前面的十四篇博文引用的源码只实现了部分功能。对于两者共同实现的功能,在部分细节上,上述源码与前面的十四篇博文引用的源码也有出入。
前面十四篇博文没有提及如何处理“多个箱子/多面旗子”的情形。这里给出几点提示:
(1) 进入关卡,加载游戏关卡的初始局面时,扫描初始局面这个二维矩阵,得出旗子所在的单元格,并记录在一个数组中(用列表会更好)。玩家玩游戏期间,每一次绘制游戏局面时,首先绘制全部的旗子,而后绘制游戏局面。这样做有什么好处呢?答案是,在加载初始局面完毕后,程序不用关心箱子/搬运工处在旗子之上的情形,使得转换单元格的状态值的代码逻辑更简洁。
(2) 不要在程序中用专门的数组(或列表等)记住各个箱子的位置。事实上,表示游戏局面的二维矩阵本身就记录了各个箱子的位置。结合提示(1),程序中只要判别单元格的状态值是否为’B’,即可得出该单元格是否有箱子。
(3) 如何判断玩家是否过关了?答案是看每面旗子所在的单元格上面是否有箱子,如果都有,则意味着过关了。提示(1)无疑能简化这里的判断逻辑。如何实现“上一关”、“下一关”等功能。答案是,把你编写的游戏关卡视图类视作一个组件,参与到更高层次的布局中。下面的代码示范了这一做法。其中,yescorp.com.tuixiangzi.GameView是游戏关卡视图类。更多的信息,请百度Android 自定义控件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<yescorp.com.tuixiangzi.GameView
android:id="@+id/game_board"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="4"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_weight="1">
<Button
android:id="@+id/btn_prv_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一关"/>
<Button
android:id="@+id/btn_next_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一关"/>
<Button
android:id="@+id/btn_reset"
android:text="重置"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_exit"
android:text="退出"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
至此,这个系列终结了。送你一句话:祝有心的你成功!