自从开始接触Swing以来,就喜欢写写各种管理系统,写多了就萌生了一种类似于实时在线对战的游戏,经过一番构思后就开始着手设计这个网络对战版本的五子棋了。
游戏代码包含两部分,常规的C/S模式(C代表客户端,S代表服务端)
下载代码后先启动服务器,服务器正常启动后,你会在控制台看到相关的日志(这里注意,服务器是没有做界面管理的),接着启动客户端(可以启动多个客户端),连接服务器后点击菜单栏联网、对战、匹配等操作
游戏效果图:
欢迎大家支持新自的研游戏:中国象棋
下载在线客户端版本试玩:
链接:https://pan.baidu.com/s/1-Bt8tcuZGkVj-jFxN4YDbg 密码:w2oy
要求:jdk环境 1.6或以上
使用方式:环境正常安装后,解压下载的文件,点击 startClient.bat 就可以打开了
备注:若你只开一个客户端,进行匹配的话可能没人跟你玩,建议不是为了技术纯测试的话与你和你的朋友一起对战
阅读本文前,您需要了解:
- java swing(好像是废话)
- socket
- json
- 多线程(不多,计时用了一下)
1:服务端与客户端数据交互如何约定?
在c/s程序的设计之初,如何按照约定的方式进行数据交互一直是一个需要解决的问题,在我这个程序中,有一个常量类定义如下,这是我与客户端进行的一个约定,任何请求都会含有一个基础数据(key),而所做的工作就是这个基础数据(key)所对应的基础数据(value)
package cn.xt.net;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
public class Const {
public static final int PORT = 7001; // 监听端口
// 基础数据(key)
public static final String ID = "id";
public static final String MSG = "msg";
// 基础数据(value)
public static final String ID_STATUS_ERROR = "idError"; // 错误信息
public static final String ID_STATUS_INIT = "初始化客户端"; // 向服务器请求初始化
public static final String ID_STATUS_PP = "匹配玩家";
public static final String PP_SUCCESS = "匹配成功";
public static final String ID_STATUS_PUT = "传送落子位置";
public static final String ID_STATUS_GET = "获取落子位置";
public static final String ID_STATUS_OVER = "对局结束";
public static final String ID_STATUS_MSG = "聊天消息";
public static final String ID_STATUS_BACK = "请求悔棋";
public static final String ID_STATUS_FAIL = "认输";
public static final String ID_STATUS_HANDSNAKE = "初次握手";
public static final String ID_STATUS_BACK_RESULT = "请求悔棋结果";
public static final String ID_STATUS_OVERTIME = "游戏超时";
public static final String SIZE = "棋盘长度";
public static final String EXISTS = "该用户名已存在系统中";
public static final String USER_NAME = "userName";
public static final String INIT_SUCCESS = "初始化成功";
public static final String X = "x";
public static final String Y = "y";
public static final String STATUS = "status"; // 当前棋子的状态
public static final String COLOR = "落子颜色";
public static final String SYSTEM_MSG = "系统消息";
// key - value
public static final String MY = "my"; // 玩家
public static final String YOU = "you"; // 对家
public static final String FIRST = "先手方"; // 1:先手; 0:后手
// 属于页面的专属数据
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static String getId() {
return getSysDate() + "-" + UUID.randomUUID().toString();
}
public static String getSysDate(){
return sdf.format(new Date());
}
// public static void main(String[]