(一)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流以及多线程开发等有了深入认识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380580.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java并发编程(三)线程同步 上[synchronized/volatile]

概念 当使用多个线程来访问同一个数据时,将会导致数据不准确,相互之间产生冲突,非常容易出现线程安全问题,比如多个线程都在操作同一数据,都打算修改商品库存,这样就会导致数据不一致的问题。 所以我们通过线程同步机制来保证线程安全,加入同步锁以避免在该线程没有完成操作之前…

微信 [] provider:wx76a9a06e5b4e****, version:1.0.3, AppID 不合法,invalid appid Error: provider:wx76a9a06e

报错: [] provider:wx76a9a06e5b4e****, version:1.0.3, AppID 不合法,invalid appid Error: provider:wx76a9a06e5b4e693e, version:1.0.3, AppID 不合法,invalid appid at E:\微信web开发者工具\code\package.nw\core.wxvpkg\d670f7f30a19b01584db216c5c3f5a75.…

揭秘Google数据中心网络B4(李博杰)

本篇可以说是论文《B4: Experience with a Globally-Deployed Software Defined WAN》中文解析篇。 导读:这是“走进 SIGCOMM 2013”系列的第二篇。Google 首次将其数据中心广域网 (WAN) 的设计和三年部署经验完整地公之于众,这篇论文可能被评为 Best Pa…

由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32

**问题:**在使用sudo apt-get update更新的时候,报了以下错误 **解决:**打开终端,下载对应密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 3B4FE6ACC0B21F32是缺少的密钥,缺少…

Vulnhub渗透测试 DR4G0N B4LL: 1

项目地址:Dr4g0n b4ll: 1 ~ VulnHub 前期信息收集 使用Nmap 进行主机发现 使用Nmap 进行端口扫描 目标开启ssh(22)、http(80) 在页面源代码中发现提示 多次base解码后为 DRAGON BALL 使用Dirscan目录扫描 发现robots.txt base64解码为 you find the hidden dir …

为unigui程序搭建chrome手机浏览器(B4A)

缘起: 使用手机自带的浏览器来访问unigui开发的移动网页程序,必须在手机浏览器的url地址栏中输入ip地址和port号,使用起来影响体验,如果想有像native app一样的体验,请跟随以下的步骤去体验一下。 1、下载WebViewExtr…

B4i(iOS)应用程序所需的所有功能

B4i(iOS)应用程序所需的所有功能 B4i(iOS)包括开发本地iOS应用程序所需的所有功能。编译的应用程序是本机iOS应用程序,没有额外的运行时或任何依赖项。B4i遵循与B4A相同的概念,允许您重用大部分代码并为An…

stm32 B3B4引脚当IO使用

记录 PB3,PB4主功能是JTDO,NJTRS,想使用IO功能时需要重定义功能,如下; void GPIO_B4B3(void)//特殊引脚 {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE)…

论文笔记(1) B4: Experience with a Globally-Deployed Software Defined WAN

传送门:原论文连接 一、论文简介 本论文是Google在2013的SIGCOMM上发表的一篇关于其成功部署的基于SDN的B4系统的论文。其中介绍了B4的设计,以及在实际运行过程中的一些经验。本论文的参考价值在于,它是第一篇对于成功部署全球性的SDN系统的…

Google B4 论文阅读一

目录 一、B4网络介绍 1. 全局控制层(global) 2. 局部网络控制层(site controllers) 3. 物理设备层(switch hardware) 二、B4网络的效果 三、B4网络的改进和展望 说在前面,博客上有很多人已…

5v升9v升压电路

5v升9v升压电路 现在市场上有许多电子设备需要提供不同电压的供电能力。其中,升压电路是一种常见的电路类型,可以将低电压升高到所需要的电压水平。在本文中,我们将介绍一种5V升9V的升压电路方案,该方案具有以下特点:…

3日行程安排

22号 13:30出发到峡山码头坐船--横山岛景区 峡山码头 船费:来回70r 固定开船时间:9:30,12:00,14:00 或者🈵️12人自动开船,最晚4点有船返回 岛上风景 逛山海“小普陀”寺庙普南禅院,被誉为宁…

多线程与高并发--------线程

一、线程的基础概念 一、基础概念 1.1 进程与线程 什么是进程? 进程是指运行中的程序。 比如我们使用钉钉,浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 什么线程&am…

MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)

地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的。那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是讲的理论与设计&…

对话CMU计算机新院长:看好AI交叉创新出成果,建议新生先泛后专

2019-11-21 13:25:16 唐木 发自 天龙寺 量子位 报道 | 公众号 QbitAI 谁是全球最好的大学?谁有全球最好的计算机学院? 如果你问李开复、陆奇、沈向洋、洪小文等功成名就的计算机大牛,多半都会得到同一个答案: Carnegie Mellon …

[转]天龙八部服务器端-共享内存的设计

一、服务器构架 一个天龙八部游戏区,主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色数据库可以安装到Machine4,那么一个区有5台物理机器。LoginServer和WorldServer、CharacterDB、BillingServer有连接。WorldServer和各个GameServer有连接…

天龙八部服务器端---共享内存的设计

2019独角兽企业重金招聘Python工程师标准>>> 原文地址:http://zhktiger.blog.sohu.com/163971755.html,非常感谢作者的分享。 一、服务器构架 一个天龙八部游戏区,主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色…

天龙八部服务器端共享内存的设计

原文:http://zhktiger.blog.sohu.com/163971760.html 一、服务器构架 一个天龙八部游戏区,主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色数据库可以安装到Machine4,那么一个区有5台物理机器。LoginServer和WorldServer、Chara…

初识鸿蒙跨平台开发框架ArkUI-X

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景&#…

虚拟DOM(Virtual DOM)和真实DOM(Real DOM)区别

虚拟DOM(Virtual DOM) 虚拟DOM是以Javascript的形式存在来描述DOM,创建虚拟DOM的目的就是将虚拟DOM更好的渲染到页面UI中,它与真实的DOM是一一对应的不可以直接更新HTML元素更新,更新JSX操作DOM方便,消耗少…