Android基于TCP的五子棋双人对战实现

很久以前在慕课网看过鸿洋的五子棋实现的视频,由于是教学,功能比较简单。
然后我基于此拓展了一些功能,比如音效、自定义网格数,选择图片设置背景、截图、悔棋等。
最想做的当然是联网对战啦,当时实力不济,只好暂放,现在回来看看,感觉可以做。
核心是在每次绘制时将坐标点传给服务端,然后服务端再将数据发送给两个手机,在视图上显示。
随便有一个手机即作服务端,也作客户端。其中坐标点的字符化,以及字符串解析成坐标点需要小小设计一下。


零、说明
本文着重于介绍如何基于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);
 }
9414344-c6b8cb4b51af8044.png
数据本地化.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();
}

二、服务端的搭建:

经过第一步骤,应该已经清楚如何处理数据,这也为后面打下了理论基础。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值