(一)Java实现五子棋(联机版)游戏
(一)设计思路:
游戏效果如下图所示:
游戏描述:
游戏采用Java设计,采用了面向对象思想,游戏使用Swing实现面板;采用哈希表Hashtable建立客户端和服务器端之间输入输出流的通信,使用户之间可以进行通信,多线程并发处理任务;随时对游戏中的情况进行判断;
玩法描述:玩家首先打开服务器端,进入等待状态,之后进行打开客户端使其与服务器端建立连接;等待其它玩家的加入,选择玩家进行对战即可;
游戏框架如下:
总共有四个大的类:
服务端,客户端,用户类,以及游戏主题类
具体的类如下:
- 1.服务器端:
如下图:
服务器端中有三个类:
分别是主题类ServerRunner,和两个类ServerThread,ServerMsgPanel;分别实现消息的发送,服务端的运行,以及服务端的多线程运行
2.客户端
客户端类中也有两个类:
分别是主题类ClientChess和ClientThread,分别实现客户端对于棋盘的连接和对于服务器端连接实现相互交流3.玩家端
玩家中有玩家列表,玩家之间的信息交流,对玩家的消息输入,以及玩家对游戏控制4.棋局端
棋局类中分别由黑棋类,白棋类,以及棋盘的主题类,和棋盘线程类;
Java中Jpanel与panel有何区别:
panel是包java.awt当中的类,Jpanel是包javax.swing当中的类,属于前者的升级。二者在本质上并没有太大的区别。
相对awt图形用户界面而言,Swing图形用户界面不仅增强了功能,而且减弱了平台相关性,即Swing图形用户界面比AWT图形用户界面可以克服更多的由于操作系统不同所带来的在图形用户界面或交互方式上的差别,因此建议使用swing当中的JPanel
游戏中的难点
- 1.基于TCP/IP协议,使用socket创建客户端和服务器端
Socket clientSocket;
有关Socket编程可参考;Socket简介及客户端服务端代码实现
- 2.其中客户端和服服务器端采用Hashtable建立通信,反应速度更快,不适用HashMap是因为HashMap不能保证线程安全,但Hash大部分函数都有Synchronized关键字,可以保证线程安全,下面为服务器端所用到的Hashtable变量;
Hashtable clientDataHash = new Hashtable(50); // 将客户端套接口和输出流绑定 Hashtable clientNameHash = new Hashtable(50); //将客户端套接口和客户名绑定Hashtable chessPeerHash = new Hashtable(50); //将游戏创建者和游戏加入者绑定
关于Hashtable和HashMap的区别可参考:Hashtable和HashMap的区别
- 3.多线程并发问题:
此游戏中有客户端线程类,服务端线程类,以及棋局线程类;涉及了多线程并发问题 - 4.java.IO流输入输出问题:
主要使用了字节流inputStream,Outputstream ,
涉及到的其它知识:
Canvas类:
Canvas 组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件。
应用程序必须为 Canvas 类创建子类,以获得有用的功能(如创建自定义组件)。必须重写paint 方法,以便在 canvas 上显示;JTextField和JTextArea
JTextField称为文本框,它只能接收单行文本的输入
JTextField() 创建一个空的文本框,初始字符串为null
JTextFiled(int columns) 创建一个具有指定列数的文本框,初始字符串为null
JTextField(String text) 创建一个显示指定初始字符串的文本框
JTextField(String text,int column) 创建一个具有指定列数、并显示指定初始字符串的文本框
JTextArea称为文本域,它能接收多行文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数
JTextArea() 构造方法,创建一个空的文本域
JTextArea(String text) 构造方法,创建显示指定初始字符串的文本域
JTextArea(int rows,int columns) 构造方法,创建具有指定行和列的空的文本域
JTextArea(String text,int rows,int columns) 构造方法,创建显示指定初始文本并指定了行列的文本域
- WindowListener :
用于接收窗口事件的侦听器接口。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 WindowAdapter(仅重写所需的方法)。然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。
(二)客户端和服务器端的实现:
服务器端实现:
服务器端的信息的输出:
public class ServerMsgPanel extends Panel {public TextArea msgTextArea = new TextArea("", 30, 71, TextArea.SCROLLBARS_VERTICAL_ONLY);public JLabel statusLabel = new JLabel(" ", Label.LEFT ); //显示用户数public Panel msgPanel = new Panel();public Panel statusPanel = new Panel();public ServerMsgPanel() { //构造函数初始化}
}
服务器端的线程运行,处理信息
public class ServerThread extends Thread{// 保存客户端套接口信息Socket clientSocket;// 保存客户端端口与输出流对应的HashHashtable clientDataHash;// 保存客户端套接口和客户名对应的HashHashtable clientNameHash;//保存游戏创建者和游戏加入者对应的Hash Hashtable chessPeerHash;// 判断客户端是否关闭boolean isClientClosed = false;ServerMsgPanel serverMsgPanel;public ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash,Hashtable chessPeerHash, ServerMsgPanel server) {this.clientSocket = clientSocket;this.clientDataHash = clientDataHash;this.clientNameHash = clientNameHash;this.chessPeerHash = chessPeerHash;this.serverMsgPanel = server;}//处理信息public void dealWithMsg(String msgReceived) {}// 发送公开信息 public void sendPublicMsg(String publicMsg) {synchronized (clientDataHash) {}}// 发送信息给指定的游戏中的用户 public boolean sendGamePeerMsg(String gamePeerTarget, String gamePeerMsg) {}return true;}//发送反馈信息给连接到主机的人public void Feedback(String feedBackMsg) {synchronized (clientDataHash) {DataOutputStream outputData = (DataOutputStream) clientDataHash.get(clientSocket);try {outputData.writeUTF(feedBackMsg);} catch (Exception eb) {eb.printStackTrace();}}}// 取得用户列表public String getUserList() {String userList = "/userlist";for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();) {userList = userList + " " + enu.nextElement();}return userList;}//根据value值从Hashtable中取得相应的keypublic Object getHashKey(Hashtable targetHash, Object hashValue) {Object hashKey;for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) {hashKey = (Object) enu.nextElement();if (hashValue.equals((Object) targetHash.get(hashKey))) {return hashKey;}}return null;}// 刚连接到主机时执行的方法 public void sendInitMsg() {}//关闭服务器public void closeClient() {}@Overridepublic void run() {DataInputStream inputData;synchronized (clientDataHash) {serverMsgPanel.statusLabel.setText("当前连接数:" + clientDataHash.size());}// 等待连接到主机的信息 }
}
服务的主体类:
public class ServerRunner extends Frame implements ActionListener {//设置按钮JButton clearMsgButton = new JButton("清空");JButton serverStatusButton = new JButton("状态");JButton closeServerButton = new JButton("关闭");Panel buttonPanel = new Panel();ServerMsgPanel serverMsgPanel = new ServerMsgPanel();ServerSocket serverSocket;int clientAccessNumber = 1;//将客户端套接口和输出流绑定 Hashtable clientDataHash = new Hashtable(50);//将客户端套接口和客户名绑定Hashtable clientNameHash = new Hashtable(50);//将游戏创建者和游戏加入者绑定Hashtable chessPeerHash = new Hashtable(50);public ServerRunner() { //初始化}//用指定端口和面板创建服务器public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOException {}//对动作进行监听public void actionPerformed(ActionEvent e) {}public static void main(String[] args) {new ServerRunner();}}
通过该项目,对于Hashtable,socket编程,java.IO流以及多线程开发等有了深入认识
(一)Java实现五子棋(联机版)游戏相关推荐
- 我的世界java版联机不稳定_完善自己:“联机版游戏玩家”如何通过社交完善自己,这个社交跟你想的也许不一样1.0...
点击左上角关注 暖暖桃林,获得更多图文 完善自己:"联机版游戏玩家"如何通过社交完善自己,这个社交跟你想的也许不一样1.0 假设我们在这个社会上,在这个世界上存在,是作为一款游戏 ...
- Java服务器,联机小游戏
Java服务器,联机小游戏 素材引自网络 登录 游戏演示 七天有效 链接:https://pan.baidu.com/s/1flmTpsnO6Wr6aM5PTV-pZg 提取码:simd
- Java游戏开发——中国象棋联机版
游戏介绍: 中国象棋是起源于中国的一种棋戏,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于规则简单,趣味性强,成为流行极为广泛的棋类游戏. 中国象棋使用方形格状棋盘及红黑二色圆形棋子进行对弈,棋 ...
- mcjava盗版联机_我的世界java版联机版
软件介绍 我的世界java版联机版为玩家带来更加有趣的沙盒探险,在这里玩家可以与好友相约一起探索,在多模式中选择自己西湖爱你的地图进行探索,多人合作,轻松搜集物资与道具,在任务中解锁更加新颖的皮肤,还 ...
- tgp进游戏不显示服务器,TGP饥荒联机版浏览游戏在线服务器显示为0解决方法分享...
为什么我的饥荒联机版(TGP上的)浏览世界刷不出房... 还没人玩吧 steam饥荒联机进去看不到房间服务器0/0怎么破 进不去说明,服务器的mod是个版本老一点的,你自己的这mod应该是最近才更新的 ...
- trailmakers未能连接服务器,Trailmakers联机版
<Trailmakers联机版>是一款可以联机进行的精美3D沙盒世界以创造为核心玩法的动作手游,这款游戏上手起来挺简单轻松的,诸多趣味内容,将让各位玩家们收获到极致的快感,非常的赞,不想错 ...
- 星露谷物语联机服务器位置已满,星露谷物语联机版
星露谷物语联机版是一款非常不错的像素模拟经营类型的手游,在星露谷物语联机版中你可以与来自世界各地的玩家们共同携手去创造一个更加稳定美好的家园,游戏中有着许多精彩好玩的地方等你前去探索娱乐,喜欢玩沙盒游 ...
- tgp饥荒服务器修改人数,求饥荒TGP联机版的搭建服务器教程有多详细要多详细
求饥荒TGP联机版的搭建服务器教程有多详细要多详细 关注:224 答案:2 信息版本:手机版 解决时间 2019-01-11 05:53 雪舞兮 2019-01-10 20:43 求饥荒TGP联机 ...
- 饥荒联机显示不了服务器,饥荒联机版启动服务器出现了一点小问题 | 手游网游页游攻略大全...
发布时间:2017-10-05 有部分玩家会遇到这个问题,发现进不去朋友的主机,但是又能进别人的主机. 进朋友的主机提示:服务器暂时不接受新的连接.请等一会儿再试一次. 出现这样的情况,很可能是你的高 ...
- 停车系统服务器黑屏,手动挡停车场 联机版启动后一直黑屏无法进入什么原因...
手动挡停车场 联机版启动后一直黑屏无法进入什么原因,相信大家在玩手动挡停车场 联机版的过程中,经常会遇到这样的问题,下面ourplay小编就简单为大家介绍几种常见的解决方案. 手动挡停车场 联机版游戏 ...
最新文章
- mysql的聚合函数综合案例_MySQL常用聚合函数详解
- Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs
- 网站推广——站长助力创业期企业网站优化推广的好选择
- 软件工程小组问世第六章之概要设计青铜篇
- 怎样学好python-如何学好python——致python初学者的天梯
- input文件上传代码片段
- php弹窗24小时一次,JS利用cookies设置每隔24小时弹出框
- 唐山大地震 昨夜万人首映 尚雯婕演唱《23秒,32年》使观众情绪得以第二次温暖爆发...
- 强悍的 ubuntu —— 常用工具
- NSArray	数组
- Linux Futex的设计与实现(转)
- Spring的组件自动扫描机制
- 分布式技术追踪 2018年第五期
- 实用的技巧之免费下载百度文库VIP文章
- OpenCV实现图片锐化
- 电脑键盘部分按键失灵_笔记本电脑部分按键失灵,可能的原因有哪些?
- Mac右键使用VS Code打开项目
- word文字间距设置教程
- Verilog——三角波发生器(状态机)
- IE浏览器如何获取本地ip地址
热门文章
- Think+Python+2e+中译版
- Ubuntu 12.04下PHP环境的搭建(LAMP)
- 闭环管控体系与数据指标管理
- 黑苹果关机变重启_苹果莫名其妙黑屏怎么办?
- 合肥学计算机的职业学校,合肥计算机专业专科学校排名
- 时尚巨头确认遭遇勒索攻击、1100万部手机已感染木马|1月19日全球网络安全热点
- 福禄克寻线仪使用方法图解
- 软件测试已经不吃香了?Sorry,职业技能教育的大幕才刚刚拉开,别再人云亦云!
- Python实用基础(思路+资料整理+代码)
- 阿里云下Redis集群报Waiting for the cluster to join...和CLUSTERDOWN Hash slot not served的坑(网上搜了好多没看到什么能基本解决的)