很久以前在慕课网看过鸿洋的五子棋实现的视频,由于是教学,功能比较简单。
然后我基于此拓展了一些功能,比如音效、自定义网格数,选择图片设置背景、截图、悔棋等。
最想做的当然是联网对战啦,当时实力不济,只好暂放,现在回来看看,感觉可以做。
核心是在每次绘制时将坐标点传给服务端,然后服务端再将数据发送给两个手机,在视图上显示。
随便有一个手机即作服务端,也作客户端。其中坐标点的字符化,以及字符串解析成坐标点需要小小设计一下。
零、说明
本文着重于介绍如何基于TCP的Socket实现两个手机间的数据交互以及通过文件记录点位
五子棋的具体实现比较基础,就不在这贴了,只说明一下重要的方法接口,问尾附上github源码地址,可自行查看
本文分为三个步骤,循序渐进:
一、将坐标字符化存储在SD卡里,每次落子都对文件数据进行更新
二、为方便演示,将服务端搭载java的控制台,每次落子都对服务端数据进行更新
三、将服务端移植到手机客户端,实现双端。
五子棋的接口(public)方法
start();//重新开局
backStep();//悔棋
getWhites()//获取白子集合
getBlacks()//获取黑子集合
//根据点位来设置棋盘
public void setPoints(ArrayList<Point> whites, ArrayList<Point> blacks)
结束回调接口:OnGameOverListener :void gameOver(boolean isWhiteWin)
绘制回调接口:OnDrawListener:void drawing(boolean isWhite)
一、将坐标字符化存储在SD卡
1.坐标字符化:
以左上角为(0,0)点,将ArrayList<Point>以
x1,y1-x2,y2-...
的形式变为字符串
public class ParseUtils {
/**
* 将黑棋和白棋的数据写入文件:格式x1,y1-x2,y2
*
* @param pos 棋坐标列表
*/
public static String point2String(List<Point> pos) {
//白棋字落点符串
StringBuilder sbPos = new StringBuilder();
for (Point p : pos) {
sbPos.append(p.x).append(",").append(p.y).append("-");
}
return sbPos.toString();
}
}
2.OnDrawListener监听方法下:写入到文件
//配置信息
public class CfgCons {
public final static String SAVE_WHITE_PATH = "五子棋/数据保存/白棋.txt";
public static final String SAVE_BLACK_PATH = "五子棋/数据保存/黑棋.txt";
}
/**
* 将黑棋和白棋的数据写入文件
*
* @param whites 白棋坐标列表
* @param blacks 黑棋坐标列表
*/
public void savePoint2File(List<Point> whites, List<Point> blacks) {
String whiteStr = ParseUtils.point2String(whites);
String blackStr = ParseUtils.point2String(blacks);
//写入到SD卡中的封装函数(自行处理)
FileHelper.get().writeFile2SD(CfgCons.SAVE_WHITE_PATH, whiteStr);
FileHelper.get().writeFile2SD(CfgCons.SAVE_BLACK_PATH, blackStr);
}

数据本地化.png
3.解析数据回显
/**
* 从字符串解析出坐标点
*
* @param pointStr 坐标字符串
*/
public static ArrayList<Point> parseData(String pointStr) {
ArrayList<Point> points;
if (pointStr != null) {
points = new ArrayList<>();
String[] strings = pointStr.split("-");
for (String s : strings) {
if (s.split(",").length >= 2) {
int x = Integer.parseInt(s.split(",")[0].trim());
int y = Integer.parseInt(s.split(",")[1].trim());
points.add(new Point(x, y));
}
}
return points;
}
return null;
}
4.回显:设置与刷新
在进入是可以看一下是否有数据,有就回显,这样及时销毁Activity也不用担心
public void updateView(ArrayList<Point> white, ArrayList<Point> black) {
mIWuzi.setPoints(white, black);
mIWuzi.invalidate();
}
二、服务端的搭建:
经过第一步骤,应该已经清楚如何处理数据,这也为后面打下了理论基础。