基于java的局域网五子棋和聊天设计与实现.doc_第1页
基于java的局域网五子棋和聊天设计与实现.doc_第2页
基于java的局域网五子棋和聊天设计与实现.doc_第3页
基于java的局域网五子棋和聊天设计与实现.doc_第4页
基于java的局域网五子棋和聊天设计与实现.doc_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I 摘摘 要要 目前,随着计算机网络的的发展,游戏已经成为现在人生活的一部分,人 们以不同的方式通过网络来娱乐,休闲。以计算机技术和网络技术为核心的现 代网络技术已经在现实生活和生产中得到了广泛的使用,休闲类网络游戏集趣 味性,娱乐性,互动性和益智性于一体,已经成为多数人群的休闲方式,也为 多数人所喜好。当然,为了满足没有网络同样能娱乐的要求,许多小游戏做成 了单机网络的双功能。 本程序使用 JAVA 语言实现,通过对图形界面,绘图,布局管理器等去构 造出五子棋游戏界面,在此基础上,利用套接字的知识,建立起服务器与客户 端之间的连接,利用多线程技术来处理服务器端与客户端之间的数据传输、通 信问题,使得客户端和服务器端之间能够同步的进行处理。 通过对软件的编写,更深入的理解万物皆对象这句话的理解,增强了对 象的封装能力,也体会到利用面向对象语言处理一些问题的优势。同时也加深 了对多线程、流、套接字等高级技术的理解。 关键词: 多线程,套接字,GUI,五子棋 II Abstract Now, with the development of computer network, the game has become a part of life now people, people in different ways through the network to the entertainment and leisure. Computer and network technology as the core of modern network technology has been widely used in real life and production, casual game set interesting, entertaining, interactive and puzzle in one, has become the majority population leisure, but also for the majority preference.Of course, in order to meet the no network requirements of the same entertainment, many games made a stand-alone and network function. This program uses the JAVA programming language to achieve, through the GUI, graphics, layout manager to construct the interface of Gobang, on this basis, the use of the knowledge of the socket, and establish a connection between the server and client, multi threading technology to handle data transfer between the server and the clients, communication problems, making the synchronization processing between the client and server side. Through the preparation of the software, a more in-depth understanding of all things is an object of this sentence to understand, enhance the package of the object, but also realize the advantages of object-oriented language to deal with some problems. Also deepened the understanding of the multi-threaded, streams, sockets and other senior technical. KEY WORDS: multiple threads,socket, GUI, Gobang 1 目目 录录 前前 言言1 第第 1 章章 绪绪 论论2 1.1 JAVA 语言历史.2 1.2 JAVA 语言的特点.2 1.3 JAVA 的开发环境.3 1.4 JAVA 的编译环境.3 1.41 JDK 介绍及安装 4 1.42 JAVA 开发工具4 1.5 SOCKET 机制5 第第 2 章章 系统需求分析系统需求分析6 2.1 五子棋的发展史6 2.2 五子棋特点、规则和界面需求6 2.3 五子棋功能需求7 2.31 五子棋游戏功能7 2.32 聊天功能7 2.4 流程图7 第第 3 章章 系统设计与实现系统设计与实现9 3.1 系统设计思路9 3.11 界面设计思路9 3.12 算法的设计思路9 3.13 程序的设计流程10 3.2 系统设计实现10 3.24 GobangBoard.java 类实现12 3.25 GoBangMain.java 类的实现 15 3.26 Message.java 类的实现23 第第 4 章章 系统运行和测试系统运行和测试24 4.1 系统运行24 4.2 系统测试26 结结 论论28 致致 谢谢29 参考文献参考文献30 毕业设计(论文) 1 前前 言言 电脑已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、 图形图像处理、教育培训以及游戏娱乐等。Windows 系统的推出使电脑从高雅的学术殿 堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多 多复杂的工作。然而,虽然现在世界上已经充满了花样繁多的各种软件,但它们依然不 能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。Java 语言作 为一种面向对象的编程语言,具有分布式,可移植,高性能,多线程等特点。通过系统 的学习,人们就可以使用它开发出功能齐全,满足特殊需求的应用程序。Java 语言易学 易用,对学习者掌握技能,开拓思维都有很大的帮助。 我作为一名学生,在系统的学习了 Java 语言之后,经常用它搞一些小程序。这次毕 业设计,正好将学过的 Java 语言中的各种技术综合起来,用 eclipse 开发工具编写一个小 游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复习巩固。 随着计算机技术的不断发展,网络技术的普及范围越来越广,网络能够提供的服务 多样、便捷,已经成为人们生产生活中不可缺少的重要组成部分。如今网络休闲游戏发 展迅速,五子棋凭借健康、方便、互动性强、益智等诸多优点,成为大部分现代人休闲 娱乐的首选。 毕业设计(论文) 2 第 1 章 绪 论 1.1 JAVA 语言历史 Java 语言其实最是诞生于 1991 年,起初被称为 OAK 语言,是 SUN 公司为一些消费 性电子产品而设计的一个通用环境。他们最初的目的只是为了开发 一种独立于平台的软 件技术,而且在网络出现之前,OAK 可以说是默默无闻,甚至差点夭折。但是,网络的 出现改变了 OAK 的命运。 在 Java 出现以前。Internet 上的信息内容都是一些乏味死板的 HTML 文档。这对于那 些迷恋于 WEB 浏览的人们来说简直不可容忍。他们迫切希 望能在 WEN 中看到一些交 互式的内容,开发人员也极希望能够在 WEB 上创建一类无需考虑软硬件平台就可以执行 的应用程序,当然这些程序还要有极大的安全保 障。对于用户的这种要求,传统的编程 语言显得无能为力,面 SUN 的工程师敏锐地察觉到了这一点,从 1994 年起,他们开始 将 OAK 技术应用于 WEB 上,并 且开发出了 HotJava 的第一个版本。当 SUN 公司 1995 年正式以 Java 这个名字推出的时候,几乎所有的 WEB 开发人员都想到:噢,这正是我 想要 的。于是 Java 成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。 1.2 JAVA 语言的特点 1.简单(Simple) 制定 Java 的原则之一,是要建立一种结构简单而且使用容易的系统,可以让用户不 必接受很深的训练就可以开始设计程序,所以 Java 的语法尽可能与在当前 许多程序设计 师都采用的 C 及 C语言相似。并且,Java 删除了 C 及 C+许多极少使用、不易理解 或常被混淆的功能,多多重继承、指针等。 2.面向对象(Object-Oriented) 面向对象是近年来信息界广为使用的概念和技术。它有许多良好的特性。对象的封 装性可以使对象的接口定义明确;继承性可以增加软件的可重用性,有助于分类及模版 设计等。实现面向对象的概念及其各种良好的特性是 Java 的设计理念之一。 3.分布式(Distributed) 计算机网络的发展使得信息应用朝着分布式的环境发展,所以现代的信息开发语言 及环境要有配合分布式的特性及功能。Java 具有一个网络功能的程序库,其中包含与如 HTTP 和 FTP 等 TCP/IP 网络通信协议整合的能力。 毕业设计(论文) 3 4.强壮性(Robust) 由 Java 所编写的程序要能在各种情况下运行,而且必须具有高的稳定性。Java 在制定时 即加入了能防止存储器被覆写和数据损坏的相关处理机制。 5.安全性(Secure) Java 是被设计用于网络及分布式环境中的,所以安全性是一个很重要的考虑。Java 拥有数个从简单到复杂的安全保护措施,能有效地防止病毒的侵入和破坏行为的发生。 6.结构中立性(Architecture Neutral) 在网络上存在许多不同类型的计算机,从中央处理器到操作系统的机构均有很高的 差异性。因此要使应用程序在每一种机器上均能运行是相当困难的。针对这个目 的, Java 的编译器可以产生一种结构中立的目标码文件格式字节码(Byte Code)。这种 字节码可以在许多种不同的计算机上运行。 7.多线程(Multithreaded) 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中, 不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这 样容易实现网络上的实时交互操作。 1.3 JAVA 的开发环境 Java 是由 Sun 微系统公司所发展出来的程序语言,它本身是一种对象导向(Object- Oriented)的程序语言。JAVA 目前在手机上应用很多多的就是 JAVA 游戏。 Java 也号称是能跨平台使用的语言,这主要是因为 Java 本身被编译之后,并不是直 接产生可执行的码,而是产生一种中间码叫作 ByteCode,这种码必需在透过 Java 的直 译器来解读它,才能够真正的被执行,所以只要平台上装有这种 Java 的直译器,就能解 读 ByteCode 也就能执行 Java 编译过的程序,故与 Java 程序是在哪种平台上被编译的, 就完全没有关系了。Java 写出来的程序可分为两类,分别是 Java Applet 与一般的 Application,而 Application 这一类就与一般的程序如 C+的作用是比较类似的,是一个 独立可执行的应用程序,像 HotJava 是一个浏览器,且就是使用 Java 程序所开发出来的。 最常见的 Java 程序包括应用程序和 applets。应用程序是单独的程序,诸如 HotJava 浏览 器软件就是用 Java 语言编写的。 Applets 类似于应用程序,但是它们不能单独运行, Applets 可以在支持 Java 的浏览器中运行。Applet 主要是内置于 HTML 网页中,在浏览时 发挥作用。 1.4 JAVA 的编译环境 JAVA 编译环境主要是 JDK+开发工具。JDK 时 JAVA 核心编译环境,开发工具在 毕业设计(论文) 4 JDK 的基础上运行的。如果没有 JDK,开发工具无法正常运行。开发工具能提高编程效 率 1.41 JDK 介绍及安装 JDK(Java Development Kit,Java 开发包,Java 开发工具)是一个写 Java 的 applet 和应 用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者编译,调 试和运行用 Java 语言写的 applet 和应用程序所需的工具组成。 JDK(Java Development Kit)是 Sun Microsystems 针对 Java 开发员的产品。自从 Java 推出以来,JDK 已经成为使 用最广泛的 Java SDK(Software development kit)。 JDK 中包括完整的 JRE(Java Runtime Environment,Java 运行环境),也被称为 private runtime。包括了用于产品环境的各种库类,以及给开发员使用的补充库,如国际 化的库、IDL 库。 然后运行 JDK 5.0 安装程序 jdk-1_5_0_06-windows-i586-p.exe,安装过程中所有选项 保持默认; 最后配置 JDK 的环境变量:在“我的电脑”上点右键“属性”“高级” “环境变 量(N)”。如下图 1-1 图 1-1 环境变量的配置 新建系统变量 JAVA_HOME:C:Program FilesJavajdk1.5.0_06 新建系统变量 CLASSPATH:.;%JAVA_HOME%lib;(注意:点号表示当前目录,不能省略)在系统变 量 Path 的值的前面加入以下内容:%JAVA_HOME%bin;(注意:这里的分号不能省略) 1.42 JAVA 开发工具 1.用功能强大的开源工具 Eclipse 来开发,相对较为方便,eclips 比较通用,而且支持 很多插件。 2.Java 主要是利用文本编辑器来完成程序设计的编辑工作,可以使用各种文本编辑器 毕业设计(论文) 5 来编写,例如:记事本、Editplus 和 UltraEdit 软件等都可以用来实现。 3.Jbulder 也是 java 的一款开发工具,功能更全面,而且操作好多都是即见即所得的, 就想 VB 一样方便快捷,不过它是一款收费软件,所以不是一些大公司一般不会使用它来 作为 java 的开发工具。 1.5 Socket 机制 Socket 是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接 实现数据的交换,这个双向链路的一端称为一个 Socket。 Socket 通常用来实现客户方和 服务方的连接。客户程序可以向 Socket 写请求,服务器将处理此请求,然后通过 Socket 将结果返回给用户。 Socket 通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需 求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下, 通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一 对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方 式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到 达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信 操作在不同的主机和进程之间转发进行。 在 java 中使用套接字相当简单,Java API 为处理套接字的通信提供了一个类 .Socket。使得编写网络应用程序相对容易。JAVA 支持流套接字(stream socket) 和数据报套接字(datagram socket)。流套接字使用 TCP(Transmission Control Protocol, 传输控制协议)进行数据传输,而数据报套接字使用 UDP(User Datagram Protocol,用户 数据报协议)。 在 Socket 层实现的 Java 网络程序是严格同步的。从一台机器发送数据的操作要求对 应一个从其他机器接受数据的操作。 毕业设计(论文) 6 第 2 章 系统需求分析 2.1 五子棋的发展史 五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为 “连珠” ,英 译为 “Renju” ,英文称之为 “Gobang”或 “FIR”(Five in a Row 的缩写 ) ,亦有 “连五子” 、 “五子连”、 “串珠” 、 “五目” 、 “五目碰” 、 “五格” 等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋 既有现代休闲的明显特征 “短、平、快” ,又有古典哲学的高深学问 “阴阳易理” ;它既 有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛; 它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有 “点” 的连 接。它是中西文化的交流点,是古今哲理的结晶。 2.2 五子棋特点、规则和界面需求 五子棋的娱乐性强、规则简单、易学、流行性广,普通人不需长时间专门训练即可自 如行棋,因此极受大众喜欢。 五子棋规则有很多,本程序主要用无禁手的规则。 五子棋无禁手规则为: 1.行棋:一人流轮一著下于棋盘空点处。 2.胜负:先把五枚或以上己棋相连成任何横纵斜方向为胜。超过五子也算胜 主要是靠交换黑白双方行棋权来使开局平衡,从而达到双方公平竞技的目的。 五子棋界面需求: 1.一个 15*15 方格棋盘,当需要落子的时候点击棋盘出现相应的黑白棋子。 2.一个聊天输入框用于聊天输入信息;一个聊天发送按钮用于发送聊天信息;一个聊 天信息显示框,用于显示聊天历史信息。 3.一些游戏相关按钮,比如建立游戏按钮,加入游戏按钮,退出游戏按钮。 4.一些游戏信息提示框,提示玩家该下棋了等信息。 5.人机界面需求简洁合理易懂,不需要专业知识就能玩。 毕业设计(论文) 7 2.3 五子棋功能需求 五子棋主要需要 2 大功能:局域网五子棋游戏功能和 2 个玩家间聊天功能。 2.31 五子棋游戏功能 五子棋游戏需求一般游戏功能:建立游戏,加入游戏,退出游戏。 建立游戏:当玩家按下建立游戏,系统自动建立一个服务器端,等待其他玩家加入。 加入服务器:玩家按下加入服务器按钮,显示一个提示框,输入服务器端的 IP 和端 口号连接服务器,建立 2 人之间的游戏 退出游戏:点击退出游戏按钮,游戏结束系统自动断开连接,关闭界面。 2.32 聊天功能 当服务器与客户端建立连接后,玩家之间能文字交流,玩家从聊天输入框输入信息, 输入完成后点击发送按钮,信息能在 2 个玩家的聊天信息显示框都显示消息的发送人, 时间和内容。 功能结构图如下图 2-1: 图 2-1 功能需求图 2.4 流程图 初始化包括游戏初始化界面、建立服务器和建立连接,然后到程序主控制,主控制 控制轮流黑白棋落子,每当有棋子落下都判断输赢否。没有输赢或赢则继续放回主控制, 当出现输赢则结束。 其流程图如图 2-2: 聊天 发 送 消 息 建 立 游 戏 加 入 游 戏 退 出 游 戏 接 收 消 息 五子棋 游戏 毕业设计(论文) 8 图 2-2 流程图 开始 1.初始化 2.主控 制 3.白方下子 白方 黑方 否则 胜利 4.判断胜 负 结束 3.黑方下子 毕业设计(论文) 9 第 3 章 系统设计与实现 3.1 系统设计思路 3.11 界面设计思路 一个好的游戏离不开好的界面。界面是游戏给人的第一印象,想要吸引人,界面须 是清晰美观,让人一看就懂。 一开始五子棋界面考虑,包括棋盘,棋子,聊天输入框,输出框,工具条,然后就 是一些提示信息。比如:提示玩家连接服务器,建立游戏,加入游戏,退出游戏,和提 示该玩家走棋了,玩家输了,玩家赢了。最后考虑整个界面布局。 界面实现,开始考虑的时候是棋盘考虑使用图片,棋子也是用图片。开始用图片感 觉美观,方便,把 JAVA 程序的美感不足给弥补。但是后面使用的时候图片不好定位, 对后面算法实现很麻烦。 布局,开始考虑的时候,想着是服务器,一个界面,客户端一个界面。当下棋的实 现先启动服务器,然后,2 个玩家在启动 2 个客户端。通过服务端了进行交互。但是后开 考虑到,服务器完全没必要要界面,在后台运行就行。把服务器启动通过界面按钮控制 启动就行。所以就只做一个界面就可以实现。 3.12 算法的设计思路 五子棋游戏的算法主要就是判断输赢了。 五子棋,也叫“五子连珠”顾名思义输赢就是要五子相连。这样在棋盘上就有很多种情 况。如下图 3-1: 图 3-1 赢棋的四种情况 毕业设计(论文) 10 在这个 15*15 标准的五子棋盘中五连有四种情况“横”,“竖”,“左斜(/)”,“右斜 ()”。只要出现上面四种情况五子或五子以上相连并且颜色一样就可判断赢了。 开始设计的时候设想:每下一个棋子,则遍历整个棋盘的棋子,看是否有符合胜利 条件的黑白棋,这样算法的简便了,但是效率确太低了。后面优化了:每下一个棋子只 要遍历这个棋子的“上” “下” “左” “右” “左上斜” “右上斜”“左下斜” “右下斜”这八个方向的 棋子五个棋子是否有赢的情况即可。这样可以优化算法,提高效率。 3.13 程序的设计流程 在 JAVA 编程思想中有句很有深度的话“万物皆对象”,JAVA 是一门面向对象的语言。 所以 JAVA 的程序也是要把现实的实物的抽象为对象。 本程序五子游戏用的基于 JAVA TCP/IP 的 Scoket 机制。这机制的客户端和服务器有 三种状态:服务器启动等待连接(WAITING),服务器连接(CONNECT),未连接 (UN_START)。后面的操作都是在这三种状态下进行运行的。所以把这三个状态设置 成三种标志位,用一个接口类把这三种状态存储。 五子棋游戏应该有 2 个玩家,棋盘,棋子,还有交流的对话框。我把其都抽象为对 象。 在 Scoket 机制中 2 个玩家对应的 2 中状态,一个玩家是服务器(ServleScokeet)另一 个玩家肯定是客户端。通过按钮控制让其玩家可以自己选择为为客户端还是服务器端 。 把棋盘封装成一个类,棋盘的属性和方法比如放入其中。棋盘属性:行数,列数, 格子大小,棋子分布等。棋盘的动作方法:画棋盘,加入棋子,清理清盘,判断输赢, 判断要下棋位置棋子是否存在,设置棋盘上鼠标样式等。 把棋子也封装成类。棋子属性:颜色,大小,坐标。 玩家发送的消息也封装成一个类。消息的属性:发消息的用户名,发消息时间,发 消息内容。 最后在一个主类里对这些对象进行操作。 3.2 系统设计实现 程序一共分了五个类: 1.Chess 类主要是封装了一些棋子属性方法。如图 3-2 2.Message 类是封装了一些聊天信息的属性和方法。 3.GoBangBoard 类是棋盘主要是一些棋盘的属性和操作。 毕业设计(论文) 11 4.GoBangMain 类是包含 Main()方法类,是整个程序主类对全局进行操作。 5.Status 类是保存了服务器和客户端的三种状态。 这五个类图如下图 3-2 至图 3-4: 图 3-2 Chess 类图 图 3-3 Message 类图 毕业设计(论文) 12 图 3-4 GoBangBoard 类图 图 3-4 GoBangMain 类图 3.24 GobangBoard.java 类实现 毕业设计(论文) 13 这个类继承了 Jpanel 容器类,为后面的 GobangMain 类添加提供方便。在这个类始化 的时候,通过构造器传入 GobangMain 类型的一个对象实现 GobangMain 主类与这个类的 连接,在这个类里面也能获取 GobangMain 的方法和属性。 addMouseMotionListener(new MouseMotionAdapter() public void mouseMoved(MouseEvent e) if (!app.isConnected() | !app.isReady() ); addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) if (x GRID_ROWS | y GRID_COLS) return; if (exists(x, y) return; Color c = app.getUserColor(); Chess chess = new Chess(x, y, Chess.DIAMETER, c); ); 在鼠标移动监听器中设置:当游戏已经连接并且到自己下棋的时候在棋盘界面鼠标 会变成“小手形”其他时候鼠标会是系统默认样式。在鼠标点击监听器中设置了当轮到自己 下棋,点击棋盘内不存在棋子的棋点将会出现一个棋子。 这个类包含了棋子判断输赢方法。 private boolean isWin(Chess chess) 毕业设计(论文) 14 int x = chess.getX(); int y = chess.getY(); int low_x = Math.max(x - 4, 0); int low_y = Math.max(y - 4, 0); loop1: for (int i = low_x; i GRID_ROWS) continue loop1; if (getChess(j, chess.getY(), chess.getColor() = null) result = false; if (result) return true; loop2: for (int i = low_y; i = x i-, j+) . return false; 棋盘每有棋子落下,都会调用判断输赢方法,传递一棋子对象 chess 下来。通过棋子 自定义方法的 chess.getX(),chess.getY()获取棋子的坐标索引 x,y。 在分别取得 x-4 与 0 最大值 low_x 和.y-4 与 0 的最大值 low_y。这样能避免出现负数 索引。 当在 loop1:x 坐标索引的循环的时候是判断行是否在横向判断新落下棋子的横向左右 各 4 个棋子是否有横向 5 连相同颜色的棋子,如果有则 return true,结束方法,否则就继续 程序。 getChess(j, chess.getY(), chess.getColor()传递一个棋子的 X,Y 坐标索引和一种棋子颜 色查看这个棋子是否存在,颜色和所落子颜色相同与否,如果这个棋子存在并且 颜色相同的放回一个对象 chess,否则放回 null(空)。 loop2,loop3,loop4 和判断 loop1 原理相似分别是判断列,右斜(),和左斜(/)的循 环。不同的是 loop2 的是 y 索引变化;loop3 是 x,y 索引都递增变化;loop4 是 x 索引递减, y 索引递增变化。 3.25 GoBangMain.java 类的实现 这是一个主要的类,main 方法程序入口在这个类。Public class GoBanMain extends JFrame 它继承了 JFrame 这个顶级窗口类。 public static void main(String args) GoBangMain frame = new GoBangMain(); 毕业设计(论文) 16 frame.windowCenter(frame); frame.setResizable(false); frame.setVisible(true); public void windowCenter(JFrame f) Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = f.getSize() f.setLocation(screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); 在这个 main 方法里,调用构造器新建了一个对象 frame,然后调用自定义方法 frame.windowCenter(frame)设置窗口居中,最后调用系统包装好方法设置窗口不可以编辑 和可见。布局和其他操作都在构造器 public GoBangMain()初始化好了。 在 public void windowCenter(JFrame f)中通过 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize()获取系统屏幕大小 screenSize 然后在获取窗口 frame 的大小,假如窗口的高大于屏幕高度则让窗口高度等于屏幕高 度,窗口长度也一样假如窗口宽度大于屏幕宽度则让窗口宽度等于屏幕宽度。窗口最后 设置在屏幕位置setLocation,窗口位于屏幕宽度减去窗口宽度后的二分之一的 X 坐标, 及屏幕高度减去窗口高度后二分之一的 Y 坐标。因此这个方法作用设置窗口居中。 Contain c = getContentPanel(); c.add(toolbar, BorderLayout.NORTH); c.add(mainPanel, BorderLayout.CENTER); c.add(statusBar, BorderLayout.SOUTH); c.add(chatPanel, BorderLayout.EAST); 窗口 frame 布局,在窗口里首先获取的 frame 的容器 c = getContentPanel()在容器中设置 布局为 BorderLayout 方向布局。在北方放置工具容器 Toolbar,在南方放置显一些提示状 态容器 StatusBar,在右边放置聊天容器 CharPanel,在中间放置棋盘容器。界面布局图如 图 3-2: 毕业设计(论文) 17 图 3-2 界面布局 在 Toolbar 中采用的是流水式布局,这容器放置了 serverButton(建立服务器), connbutton(连接服务器),breakButton(结束游戏),exitButton(退出游戏)和 author(关于 作者)按钮。 在 CharPanel 中采用了还是 Borderlayout 布局,在其中放置一个文本域 textShow 在 Center 和另外个面板容器 sendPanel 在 South 实现上下样式,在 sendPanel 中也同样类似于 CharPanel 布局,放置了一个文本域 textSend 在 Center,一个面板 userPanel 在 South。在 userPanel 中采取的是 Flowlayout 流水式布局,加入了“用户名:”标签,和一个单行文本 及发送按钮。 ButtonActionListener l = new ButtonActionListener(); SendAction sendAct = new SendAction(); serverButton.addActionListener(l); connButton.addActionListener(l); breakButton.addActionListener(l); exitButton.addActionListener(l); authorButton.addActionListener(l); send.addActionListener(sendAct); 上面是个个按钮添加的监听事件。在最上面的一排按钮添加的是同一个自定义监听 器 ButtonActionListener 对象 l。 class ButtonActionListener implements ActionListener public void actionPerformed(ActionEvent e) Object src = e.getSource(); if (src = serverButton) Thread t = new Thread(new Runnable() private void runAsServer() throws IOException user.setText(“服务器玩家“); ss = new ServerSocket(12345); setServer(true); 毕业设计(论文) 18 setCurrentStatus(Status.WAITING); socket = ss.accept(); getStream(); setTitle(“五子棋 - 您正在跟来自“+ socket.getRemoteSocketAddress().toString()+ “的玩家下棋!“); setCurrentStatus(Status.CONNECTED); setReady(true); processConnection(); 在 ButtonActionListener 中通过事件 src = e.getSource()获取事件源,然后比较事件源 比较按钮对象知道是那个按钮按下。在按钮按下做出相应处理。按钮图如下图: 图 3-3 按钮图 当“建立服务器”按钮按下的时候,则新建一个匿名内部线程类,然后新建的线程对象 t,最后调用 t.start()启动线程。t.start()后系统会自动调用 Run()方法。在 Run()方法中会 调用自定义方法 runAsServer()把当前窗口作为服务器。当作为服务器窗口时候,用户名输 入框 user 则会设这内容为“服务器玩家”,然后新建端口号为“123456”服务器对象 ss,把当 前窗口这服务器状态标记位设为 true,setServer(true),setCurrentStatus(Status.WAITING) 设置现在状态为服务器等待等待其他玩家加入游戏,socket = ss.accept()是 Scoket“阻塞”, 当有连接的时候传递 Scoket 对象畅通,没连接过来就一直等待。在有连接时 getStream() 获取流把输入流或者输出流传递给 oos 或者 ois。然后把窗口名字给成提示和 XX 玩家下 棋信息,再把服务器状态设置为已经连接 setCurrentStatus(Status.CONNECTED)。如果出 现程序异常,将会被捕捉,在窗口显示提示框“服务器无法启动,可能您已经建立服务器”。 如下图 3-4: 图 3-4 服务器无法启动 毕业设计(论文) 19 private void runAsClient() throws IOException user.setText(“客服端玩家“); String str = JOptionPane.showInputDialog( GoBangMain.this, “请输入服务器 IP, 端口号,以空格分隔! “,“ 12345“); while ( !str .matches(“d1,3.d1,3.d1,3.d1,3s+d1,6“) ) str = JOptionPane.showInputDialog(“格式错误,请重新输入 (ddd.ddd.ddd.ddd dddd)“); String list = str.split(“ “); setServer(false); setCurrentStatus(Status.WAITING); socket = new Socket(list0, Integer.parseInt(list1); getStream(); setCurrentStatus(Status.CONNECTED); setReady(false); processConnection(); 当“连接服务”按钮按下的时候与“建立服务器”按下类似。也是新建一个匿名内部线程 类,然后新建的线程对象 t,最后调用 t.start()启动线程。t.start()后系统会自动调用 Run() 方法。在 Run()方法中会调用自定义方法 runAsClient()把当前窗口作为客户端。设置用 户名为“客户端玩家”,弹出一个输入对话框用空格分开输入服务器的 IP 和端口,在通过 String 类的字符匹配正则表达式方法 matches 判别输入格式是否正确。如果输入错误窗口 弹出提示“格式输入错误,请重新输入(ddd.ddd.ddd.ddd dddd)”。如果输入正确,则把输 入字符串通过 split 方法从空格处分割两段放入一个字符数组 list 里面,第一个字符数组元 素是服务器 IP,第二个字符串数组元素是要连接服务器的端口号。然后新建客户端 socket = new Socket(IP 号,端口号), 建完客户端连接成功则把服务器标志位设置成连接 CONNECTED,获取输入/输出流, 处理连接。 public void processConnection() . Object o; while ( (o = ois.readObject() != null ) 毕业设计(论文) 20 if (o instanceof Chess) Chess chess = (Chess) o; recieveData(chess); else if (o instanceof Message) Message message = (Message) o; recieMessage(message); rocessConnection()这个方法主要处理连接接收数据,判别输入流接收的对象是聊天信 息 Message 类还上棋子 Chess 类,如果是 Message 类则调用接收聊天信息方法 recieMessage(message),把聊天信息显示在聊天信息框内;如果是棋子类则调用接收棋子方 法 recieveData(chess),在接收棋子后,把棋子添加到棋盘的棋子列表里面,把界面刷新 repaint(),判断输赢。 else if (src = exitButton) closeWindow(); “结束游戏”按钮按下的时候,调用结束游戏方法 StopGame()。在 StopGame()中初始 化了棋盘,关闭连接,把服务器状态设置成 Status.UN_START(未开开始状态)然后设置 最下面显示提示信息“游戏已经结束,请从新连接” else if (src = breakButton) stopGame(); 当“游戏退出”按钮按下的时候,调用了 closeWindow()方法关闭窗口。由于在构造器 里面 setDefaultCloseOperation(WindowConstants. DO_NOTHING_ON_CLOSE)设置窗口关 闭方式为不通知不关闭,所以直接关闭是关闭不了当点击关闭按钮时候也是调用这个方 法关闭窗口,在 closeWindow()中通过 JOptionPane.showConfirmDialog()显示一个选择对话 框,则返回一个 int 值 iClose,如果选择是 iClose=0 如果选择否则 iClose=1。如果 iClose 为 0 则等于 JOptionPane.YES_OPTION 调用系统的系统退出方法关闭窗口,如果 iClose 毕业设计(论文) 21 为 1 则不关闭窗口。 else if (src = copyrightButton) JOptionPane.showMessageDialog(null, “ 作者:“ + “20080304037 易海平“ + “n“+“ 指导老师:“+“ 刘博“, “ 关于作者 “,JOptionPane.INFORMATION_MESSAGE); 当按下“Author”按钮的时候则会弹出一个消息框显示作者和指导老师一些信息。 private void refreshByStatus() switch (currentStatus) case Status.UN_START: SwingUtilities.invokeLater(new Runnable() public void run() serverButton.setEnabled(true); connButton.setEnabled(true); breakButton.setEnabled(false); statusBar.setText(“游戏未开始,请启动服务或连接到对方机器.“); send.setEnabled(false); ); break; case Status.WAITING: serverButton.setEnabled(false); connButton.setEnabled(false); . case Status.CONNECTED: . 这个方法根据服务器状态控制组件,服务器三大状 UN_START,WAITING,CONNECTED。SwingUtilities.invokeLater(new Runnable()线程在 AWT 中挂起所有线程都执行完了才执行这个线程。setEnabled 作用设置按钮启用或者禁 用,默认按钮时启用的。当按钮禁用的时候按钮不可点击,颜色变为灰色。“Author”按钮 毕业设计(论文) 22 和“退出游戏”按钮无论在任何状态都是启用的。 当服务器状态“UN_START”(未启动)时,可以建立服务器、连接服务器、退出游 戏和查看作者相关,但是不能结束游戏和发送消息操作,所以设置按钮“建立服务按钮”、 “连接服务器”和“退出游戏”启用,设置按钮“结束游戏”和“发送消息”禁用。在最下边的信 息提示文本显示“游戏未开始,请启动服务器或者连接对方服器”。 当服务器状态“WAITING”(等待连接)时,只可进行退出游戏和查看作者操作,所 以除了“退出游戏”和“Author”按钮启用的其他按钮都是禁用的。 如果是服务器端等待连接则在信息提示文本显示“服务器已经启动”并且弹出提示 框显示服务器 IP 和端口号信息,如图 3-5。如果是客户端等待连接则在信息提示文本显示 “正在连接服务器请稍候” 图 3-5 服务器端等待连接 当服务器的状态“CONNECTED”(连接),游戏和聊天可以进行,设置“结束游戏”按钮 和“发送消息”按钮启用,其他的按钮禁用。在窗口的表头显示对方玩家的 IP。 3.26 Message.java 类的实现 p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论