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 条评论
登录 后参与评论

相关文章

来自专栏君赏技术博客

Jekyll-Admin-Mac-列表

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

1621
来自专栏更流畅、简洁的软件开发方式

见到了“公司”定义一个Company类,那么见到了“字段”是不是也可定义一个Column类?

  既然见到了公司,我们可以定义一个Class Company ,那么我们见到了字段,是不是也可以定义一个Class ColumnInfo呢? 公司的描述信息类...

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

ES6特性-Generators

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

742
来自专栏Django中文社区

Django模板标签regroup的妙用

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

3306
来自专栏CRPER折腾记

Vue 折腾记 - (4) 写一个不大靠谱的 loading 组件

有需求,就要动手丰衣足食...公司考虑兼容IE9,那么css3 animation写的loading就无缘了 因为keyframes IE10+ , 那么要实现...

1162
来自专栏chafezhou

程序员探案之被吃掉的串口数据

1874
来自专栏知道一点点

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

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

1572
来自专栏北京马哥教育

python实现简单爬虫功能

iOS开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是Python.原因就是 1.语法简单 2.库...

3327
来自专栏Small Code

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

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

28510
来自专栏lhyt前端之路

从单向到双向数据绑定0.前言1.单向数据(代表:react)2.观察者模式3.双绑的中间枢纽——Object.defineproperty(代表:vue)4. 脏值检测(代表:angular1)前面说

用户最满意的,无非就是界面的操作能实事反应到数据。而实现这种的可以有双向数据绑定、单向数据流的形式。双向数据绑定是,ui行为改变model层的数据,model层...

2004

扫码关注云+社区

领取腾讯云代金券