最近搞了个安卓小项目,名字叫DANGO,跟大家分享下我的实践过程,希望能帮到有需要的朋友。
一开始的想法:
就是想做个简单的围棋游戏APP,平时自己也喜欢下两盘,想搞个能随时随地跟人对战的。名字嘛就随便起了个DANGO,感觉挺可爱的。
技术选型:
- 开发语言: Java,毕竟是安卓原生,还是用Java顺手。
- IDE: Android Studio,这个没啥好说的,安卓开发标配。
- 服务器: 本来想自己搭一个,后来觉得太麻烦,直接用的LeanCloud,省事。
小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
开发过程:
1. 界面设计:
这块儿没啥好说的,就是各种XML布局文件,拖控件,改属性。界面风格力求简洁,毕竟是下棋,要让用户专注于棋局。棋盘是用自定义View画的,用了Canvas的drawLine方法,画了一堆横线竖线,看着还挺像那么回事。
2. 核心逻辑:
这部分是重头戏。主要就是判断输赢,还有落子规则。用二维数组来模拟棋盘,每个位置存储一个值,表示黑子、白子或者空。落子的时候,先判断位置是否为空,然后判断是否符合禁手规则(围棋规则挺复杂的,我简化了一些)。判断输赢就比较麻烦了,要遍历整个棋盘,判断是否有连续的五个同色棋子。这里面各种循环嵌套,写得我头都大了。
3. 网络对战:
用LeanCloud实现网络对战,主要就是用了它的实时通信功能。每个用户创建一个房间,然后就可以邀请好友加入。落子的时候,把落子的坐标发送给对方,对方在自己的棋盘上落子。为了防止作弊,服务器会验证落子的合法性。
4. AI 对战:
这个是后来加的,想着不能总跟人下,有时候也想跟电脑练练手。AI水平比较菜,就是简单的遍历棋盘,找到一个对自己最有利的位置落子。用了Minimax算法,但是深度不高,所以下出来的棋还是比较傻。
遇到的坑:
- 线程同步: 网络请求和UI更新要在不同的线程中进行,不然会ANR。刚开始没注意,老是崩溃,后来才发现是线程的问题。
- 内存泄漏: 安卓的内存泄漏防不胜防。用了LeakCanary来检测,发现了不少问题,比如Context持有时间过长,Bitmap没有及时回收等等。
- 适配问题: 不同手机屏幕大小不一样,分辨率也不一样,适配起来很麻烦。用了ConstraintLayout和百分比布局,勉强解决了大部分问题。
DANGO安卓版基本实现了围棋的基本功能,能跟人对战,也能跟AI下棋。虽然还有很多不足,比如AI水平太低,界面不够美观等等,但是作为一个个人项目,我已经很满意了。以后有时间再慢慢完善。