java课程设计_五子棋(附源代码)

上传人:e****s 文档编号:56923512 上传时间:2022-02-22 格式:DOC 页数:60 大小:324KB
收藏 版权申诉 举报 下载
java课程设计_五子棋(附源代码)_第1页
第1页 / 共60页
java课程设计_五子棋(附源代码)_第2页
第2页 / 共60页
java课程设计_五子棋(附源代码)_第3页
第3页 / 共60页
资源描述:

《java课程设计_五子棋(附源代码)》由会员分享,可在线阅读,更多相关《java课程设计_五子棋(附源代码)(60页珍藏版)》请在装配图网上搜索。

1、课程设计报告( 2014- 2015年度第二学期)科目面向对象课程设计专业网络工程学生姓名董志文班级13级2班学号1308020207指导教师江涛完成日期目 录1 概 述.3 课程设计目的.3 1.2预备知识.3 1.3课程设计内容和要求.32 需求分析.4 2.1 系统目标.4 2.2 主体功能.4 2.3 开发环境.4 2.4 概念设计.43 系统总体设计.5 3.1 系统的功能模块划分.5 3.2 系统流程图.64系统详细设计.7 4.1 代码实现情况.7 4. server 包 chessServer类.7 4.1.2 client包 chessClient类.7 4.1.3 ches

2、sface 包 chatPad类.8 4.1.4 chessface 包 chessPad类.8 4.1.5 chessface包chessthread类.8 4. chessface 包 controlpad类.8 4. chessface 包 inputpad类.8 4. chessface 包userPad 类.94.1测试分析.9 4.2.1程序运行情况.9 4.2.2程序运行异常处理.125 小结.12参考文献.13附 源代码1、概述课程设计目的JAVA程序设计是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计

3、算机相关专业学生学习完JAVA程序设计课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。1.2预备知识熟悉JAVA语言及ECLIPSE开发工具。1.3课程设计内容和要求按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行

4、简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。 经过一个学期的学习,使我对Java有了一定的了解。但要深入理解Java语言,单靠上课是不够的。必须通过课程设计,设计一个比较大的程序,才能更深一步地理解Java语言。在这次课程中,我选择了网络五子棋作为课题。编写网络五子棋游戏要利

5、用到Socket网络编程技术和多线程。通过这次课程设计,熟悉Java的GUI图形界面设计,网络Socket 编程和多线程编程。2 需求分析2.1 系统目标本系统主要是完成五子棋游戏的基本操作,在玩游戏的过程中玩家可以放松心情得到娱乐。 2.2 主体功能本程序实现了一个小的五子棋游戏,可以实现两个人在用一台机器上进行游戏。程序会自动判断谁输谁赢,在游戏的开始,第一个人可以选择执白棋还是黑棋,之后点击开始进行游戏。2.3 开发环境硬件要求能运行Eclipse的windows xp以上系统。JAVA程序设计语言及相应的集成开发环境,SDK和ECLIPSE开发工具。网络五子棋是采用网络协议为TCP/I

6、P的网上对弈游戏,运用“客户端服务器“(c/s)网络架构模式。实现用户通过Internt连接在任何地方与不同玩家进行对战。服务器可以创建任意多局游戏。通过使用多线程和网络套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯。开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,服务器始终处于监听状态。客户端是动作的发起者,何时发出申请由客户端决定。客户端向服务器发出申请,服务器给予响应。打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS和端口PORT。连接建立后,创建一个SOCKET实例,并开始一个线程,监听该客户端请求。服务器继续监听其它用户的连接。服务

7、器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的信息发送给客户端。客户端发送请求和响应接收到的各种信息。 在服务器和客户端之间传递的消息格式是采用“消息类别+内容“组成的,服务器和客户端在传递消息的过程,根据消息的类别来进行相关的操作。3 系统总体设计3.1 系统的功能模块示意图3.2 系统流程图4系统详细设计4.1 代码实现情况4.1.1 server 包 chessServer类class MessageServerPanel extends Panel /主消息窗口class ServerThread extends Thread /服务器线程,主要用于服务器与客户端的通信p

8、ublic class chessServer extends Frame implements ActionListener /服务器端框架类4.1.2 client包 chessClient类public class chessClient extends Frame implements ActionListener, KeyListener /五子棋客户端框架,实现了动作监听器和键盘监听器public boolean connectServer(String serverIP, int serverPort) throws Exception /和服务器建立连接并通信的函数。retur

9、n true 连接成功, false 如果失败.4.1.3 chessface 包 chatPad类public class chatPad extends Panel /聊天信息Panel。Panel上的文本域可以显示用户聊天信息。4.1.4 chessface 包 chessPad类public class chessPad extends Panel implements MouseListener /显示棋盘的Panel。此Panel实现了鼠标监听器class chessPoint_black extends Canvas /表示黑子的类class chessPoint_white e

10、xtends Canvas /表示白子的类4.1.5 chessface包chessthread类public class chessThread extends Thread /一个客户端用户线程. 处理用户落子的点击事件处理,及消息发送.4.1.6 chessface 包 controlpad类public class controlPad extends Panel /控制Panel。此Panel上的按钮如其名,完成相应的功能。4.1.7 chessface 包 inputpad类public class inputPad extends Panel /输入信息Panel。Panel左边

11、的下拉列表中列出了所有用户的名字。右边的文本框可以输入聊天信息,点击回车信息被发送。4.1.8 chessface 包userPad 类public class userPad extends Panel /用户列表Panel。此Panel维护一个服务器的当前用户列表, 所有的用户名都将显示在列表中。4.2 测试分析/打开服务端/打开客户端/落子/判定启动游戏时,应先启动服务端,然后打开客户端,连接服务端,建立游戏,加入游戏,然后落子。在启动客户端时,若是闪退,请先关闭服务端,然后重启。5 小结经过为期二周的课程设计,感觉自己所学远远不能解决做课设时的需求。在熟悉课本和上网搜索后,才算马马虎虎

12、的完成了任务。 在画棋盘时,调用draw方法对于画图这块的坐标布置,在今后学画其他图画时能够得心应手。获取棋子方法的巧妙,注册鼠标,获取点击位置,除以棋盘间隔,去掉不为整数的一块,再乘以棋盘间隔便获得最临近点的下棋坐标,即所要下棋的位置。用二维数组模拟棋盘,无棋子的置为0,黑子置为1,白子置为2,以便在判断胜负时利于同色棋子的查找。整个棋盘就模拟出来了,很巧妙,不过有更好的方法用向量存储棋子信息,便于悔棋等操作。 实现多用户聊天,老师后面讲的不是很多,做起来有点费力。参考网上资料,明白Socket原理。开始时照着课本上的例子,不能得出想要的效果,而且只运行了一个程序看不到有通信的效果。后面在运

13、行了Server类后,自己尝试着两个Client类,实现了通话,就像腾讯QQ里面一样的效果。里面定义了Vector 线程,实现了多线程用法。 两个板块大体实现,但是后面的要求五,由于数据库的使用不是太熟悉,不能注册用户,添加好友,查找好友,还有悔棋操作未能实现。此程序最大的缺点还在于,不能实现网络两人下五子棋。由于不能将棋盘信息与聊天信息区分,不能告诉对反自己下了哪一步,所以根据自己的水平也就能做到这了,今后加以完善。参考文献1. 孙卫琴 Java面向对象教程 电子工业出版社 2006-03 2.孙卫琴 Java网络编程精解 电子工业出版社 2006-03 3.张仕斌 Java程序设计与应用

14、清华大学出版社 2005-06 4.张孝祥 Java就业培训程序 清华大学出版社 2003-06 5.耿祥义 Java课程设计 清华大学出版社 2004-03 6.王路群 Java高级程序设计 中国水利水电出版社 2006-03 7.丁振凡 Java语言使用教程 北京邮电大学出版社 2005-06 8.薛为民 Java应用教程 清华大学出版社 2005-06 9.钟允中 JAVA入门 辽宁科学技术出版社 1997-03 10.郑莉 Java语言程序设计 清华大学出版社 2006-03附 源码1、server包中chessServer类:package server;import java.io

15、.*;import .*;import java.awt.*;import java.util.*;import java.awt.event.*;/* * 显示服务器及用户信息的Panel类 */class MessageServerPanel extends Panel / 主消息窗口 TextArea messageBoard = new TextArea(, 22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY); Label statusLabel = new Label(当前连接数:, Label.LEFT); Panel boardPanel = n

16、ew Panel();/ 主显示区Panel Panel statusPanel = new Panel();/ 连接状态Panel MessageServerPanel() setSize(350, 300); setBackground(new Color(204, 204, 204); setLayout(new BorderLayout(); boardPanel.setLayout(new FlowLayout(); boardPanel.setSize(210, 210); statusPanel.setLayout(new BorderLayout(); statusPanel.

17、setSize(210, 50); boardPanel.add(messageBoard); statusPanel.add(statusLabel, BorderLayout.WEST); add(boardPanel, BorderLayout.CENTER); add(statusPanel, BorderLayout.NORTH); /* * 服务器线程,主要用于服务器与客户端的通信 */class ServerThread extends Thread Socket clientSocket; Hashtable clientDataHash;/ Socket与发送数据的流的映射

18、Hashtable clientNameHash;/ Socket与用户名的映射 Hashtable chessPeerHash;/ 对弈的两个客户端用户名的映射 MessageServerPanel server; boolean isClientClosed = false; /* * 服务器端线程的构造函数,用于初始化一些对象。 */ ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable chessPeerHash, MessageServerPane

19、l server) this.clientSocket = clientSocket; this.clientDataHash = clientDataHash; this.clientNameHash = clientNameHash; this.chessPeerHash = chessPeerHash; this.server = server; /* * 对客户端发来的消息处理的函数,处理后转发回客户端。处理消息的过程比较复杂, 要针对很多种情况分别处理。 */ public void messageTransfer(String message) String clientName,

20、 peerName; /命令处理/ / 如果消息以“/”开头,表明是命令消息。 if (message.startsWith(/) / 如果消息以“/list”开头,则将其回馈到客户端以更新用户列表 if (message.equals(/list) Feedback(getUserList(); / 如果消息以/creatgame inchess开头,则修改clientNameHash映射 / 和chessPeerHash映射。 else if (message.startsWith(/creatgame inchess) / String chessServerName = message

21、.substring(20); synchronized (clientNameHash) clientNameHash.put(clientSocket, message.substring(11); synchronized (chessPeerHash) /刚创建,等待其他人加入 chessPeerHash.put(chessServerName, wait); Feedback(/yourname + clientNameHash.get(clientSocket); chessPeerTalk(chessServerName, /OK); publicTalk(getUserList

22、(); / 如果消息以“/joingame”开头,则将消息的服务端名字和本地用户名提取出来, / 然后修改clientNameHash表和chessPeerHash表。 if (message.startsWith(/joingame ) StringTokenizer userToken = new StringTokenizer(message, ); String getUserToken, serverName, selfName; String chessNameOpt = 0, 0; int getOptNum = 0; / 提取服务端用户名和本地用户名 while (userTo

23、ken.hasMoreTokens() getUserToken = (String) userToken.nextToken( ); if (getOptNum = 1 & getOptNum + message; if (peerTalk(peerName, message) Feedback(没有这个用户: + peerName + n); / / / 如果不以“/”开头,表明是普通消息,直接发送 else message = clientNameHash.get(clientSocket) + + message; server.messageBoard.append(message

24、+ n); publicTalk(message); server.messageBoard.setCaretPosition(server.messageBoard.getText().length(); /* * 发送公共消息的函数,将消息向每个客户端都发送一份 */ public void publicTalk(String publicTalkMessage) synchronized (clientDataHash) /枚举遍历所有客户端输出流。 for (Enumeration enu = clientDataHash.elements(); enu.hasMoreElements

25、();) DataOutputStream outData = (DataOutputStream) enu.nextElement(); try /输出信息。这里会阻塞 outData.writeUTF(publicTalkMessage); catch (IOException es) /打印异常堆栈。终止程序。 es.printStackTrace(); /* * 选择对象发送消息,参数peerTalk为发送的用户名,后面的参数为发送的消息 */ public boolean peerTalk(String peerTalk, String talkMessage) / for (Enu

26、meration enu = clientDataHash.keys(); enu.hasMoreElements();) Socket userClient = (Socket) enu.nextElement(); / 找到发送消息的对象,获取它的输出流以发送消息 if (peerTalk.equals(String) clientNameHash.get(userClient) & !peerTalk.equals(String) clientNameHash.get(clientSocket) synchronized (clientDataHash) DataOutputStream

27、 peerOutData = (DataOutputStream) clientDataHash.get(userClient); try peerOutData.writeUTF(talkMessage); catch (IOException es) es.printStackTrace(); Feedback(talkMessage); return (false); / 如果是发给自己的,直接回馈 else if (peerTalk.equals(String) clientNameHash.get(clientSocket) Feedback(talkMessage); return

28、 (false); return (true); /* * 此函数也用于选择发送消息,但不能发送给自己。 */ public boolean chessPeerTalk(String chessPeerTalk, String chessTalkMessage) for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) Socket userClient = (Socket) enu.nextElement(); if (chessPeerTalk.equals(String) clientNameHash.ge

29、t(userClient) & !chessPeerTalk.equals(String) clientNameHash.get(clientSocket) synchronized (clientDataHash) DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient); try peerOutData.writeUTF(chessTalkMessage); catch (IOException es) es.printStackTrace(); return (false); retu

30、rn (true); /* * 用于处理消息回馈的函数 */ public void Feedback(String feedbackString) synchronized (clientDataHash) /得到输出流。 DataOutputStream outData = (DataOutputStream) clientDataHash.get(clientSocket); try /输出信息。 outData.writeUTF(feedbackString); catch (Exception eb) /打印堆栈轨迹,程序终止。 eb.printStackTrace(); /* *

31、获取用户列表的函数,此函数读取clientNameHash获取用户列表, 然后将其保存在一个字符串userList中。 */ public String getUserList() String userList = /userlist; /遍历hashtable中的values,以空格分割连接起来 for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();) userList = userList + + (String) enu.nextElement(); return userList; /* * 给

32、出HashTable和值对象,获取相对应得键值的函数。 */ public Object getHashKey(Hashtable targetHash, Object hashValue) Object hashKey; for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) hashKey = (Object) enu.nextElement(); /如果键对应的值与hashValue相等,则返回这个key if (hashValue.equals(Object) targetHash.get(hashKey) r

33、eturn (hashKey); return (null); public void firstCome() /新用户第一次加入、广播用户列表。 publicTalk(getUserList(); /反馈给这个用户,以修改相应显示信息。 Feedback(/yourname + (String) clientNameHash.get(clientSocket); Feedback(Java五子棋聊天客户端); Feedback(/changename -更改名字); Feedback(/list -更新用户列表); Feedback(/ -私聊); Feedback(注意:用命令的时候,先把

34、谈话的对象定为所有人); /* * 用于和客户端断开的函数。 */ public void clientClose() server.messageBoard.append(用户断开: + clientSocket + n); / 如果是游戏客户端主机 synchronized (chessPeerHash) if (chessPeerHash.containsKey(clientNameHash.get(clientSocket) chessPeerHash.remove(String) clientNameHash.get(clientSocket); if (chessPeerHash.

35、containsValue(clientNameHash.get(clientSocket) chessPeerHash.put(String) getHashKey(chessPeerHash, (String) clientNameHash.get(clientSocket), tobeclosed); / 将保留的HashTable里的数据清除 synchronized (clientDataHash) clientDataHash.remove(clientSocket); synchronized (clientNameHash) clientNameHash.remove(clie

36、ntSocket); /广播更新用户列表。 publicTalk(getUserList(); / 计算当前连接数,并显示在状态框中 server.statusLabel.setText(当前连接数: + clientDataHash.size(); try clientSocket.close(); catch (IOException exx) isClientClosed = true; public void run() DataInputStream inData; synchronized (clientDataHash) server.statusLabel.setText(当前

37、连接数: + clientDataHash.size(); try inData = new DataInputStream(clientSocket.getInputStream(); firstCome(); while (true) String message = inData.readUTF(); messageTransfer(message); catch (IOException esx) finally if (!isClientClosed) clientClose(); /* * author wufenghanren 服务器端框架类 */public class che

38、ssServer extends Frame implements ActionListener Button messageClearButton = new Button(清除显示); Button serverStatusButton = new Button(服务器状态); Button serverOffButton = new Button(关闭服务器); Panel buttonPanel = new Panel(); MessageServerPanel server = new MessageServerPanel(); ServerSocket serverSocket; Hashtable clientDataHash = new Hashtable(50); Hashtable clientNameHash = new Hashtable(50); Hashtable chessPeerHash = new Hashtable(50); /* * 框架类的构造函数 */ chessServer() super(Java五子棋服务器); setBackground(new Color(

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!