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);
 }

数据本地化.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();
}

二、服务端的搭建:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏贺贺的前端工程师之路

ES6特性-Generators

你可以将Generators认为是可以中断进程、恢复进程的代码段,like this:

712
来自专栏为数不多的Android技巧

Android Studio你不知道的快捷键(二)

在Android Studio你不知道的快捷键(一)里面,主要讲述了一些窗口操作的快捷键还有补全参数提示等,这一篇会分享一些代码代码编辑的快捷键。(默认Keym...

1112
来自专栏yukong的小专栏

【SpringBoot2.0系列11】SpringBoot之@Elasticsearch完成CURD

【SpringBoot系列02】SpringBoot之使用Thymeleaf视图模板

4533
来自专栏.NET后端开发

Highcharts使用指南

摘要 Highcharts图表控件是目前使用最为广泛的图表控件。本文将从零开始逐步为你介绍Highcharts图表控件。通过本文,你将学会如何配置Highcha...

3065
来自专栏zhangdd.com

ceph性能测试

该工具的语法为:rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t...

1992
来自专栏君赏技术博客

Jekyll-Admin-Mac-列表

接下来我们需要就是做出这个列表数据,我们可以使用 NSTableView来做出这个效果。

1531
来自专栏Small Code

MATLAB GUI中Edit Text的Callback函数何时执行

在做一个 GUI 的时候遇到一个问题,就是可编辑文本框(edit text)的回调函数(callback)会在什么时候执行,在网上找了半天无果,最后翻了翻罗华飞...

24110
来自专栏知道一点点

走进AngularJs(二) ng模板中常用指令的使用方式

  通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的。ng的模板真...

1292
来自专栏Django中文社区

Django模板标签regroup的妙用

在使用 Django 开发时,有时候我们需要在模板中按对象的某个属性分组显示一系列数据。例如博客文章按照时间归档分组显示文章列表(示例效果请看我的博客的归档页面...

3146
来自专栏逸鹏说道

Jupyter-Notebook版的博客园美化

文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html

1402

扫码关注云+社区