java课程设计五子棋附源代码.docx

上传人:b****4 文档编号:26755195 上传时间:2023-06-22 格式:DOCX 页数:76 大小:132.25KB
下载 相关 举报
java课程设计五子棋附源代码.docx_第1页
第1页 / 共76页
java课程设计五子棋附源代码.docx_第2页
第2页 / 共76页
java课程设计五子棋附源代码.docx_第3页
第3页 / 共76页
java课程设计五子棋附源代码.docx_第4页
第4页 / 共76页
java课程设计五子棋附源代码.docx_第5页
第5页 / 共76页
点击查看更多>>
下载资源
资源描述

java课程设计五子棋附源代码.docx

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

java课程设计五子棋附源代码.docx

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

课程设计报告

(2014--2015年度第二学期)

科目

面向对象课程设计

专业

网络工程

学生姓名

董志文

班级

13级2班

学号

1308020207

指导教师

江涛

完成日期

 

4.1测试分析........................................9

4.2.1程序运行情况................................9

4.2.2程序运行异常处理...........................12

附源代码

 

1、概述

《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。

实践教学环节是必不可少的一个重要环节。

本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。

熟悉JAVA语言及ECLIPSE开发工具。

按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。

要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。

同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。

五子棋是起源于中国古代的传统黑白棋种之一。

五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

经过一个学期的学习,使我对Java有了一定的了解。

但要深入理解Java语言,单靠上课是不够的。

必须通过课程设计,设计一个比较大的程序,才能更深一步地理解Java语言。

在这次课程中,我选择了网络五子棋作为课题。

编写网络五子棋游戏要利用到Socket网络编程技术和多线程。

通过这次课程设计,熟悉Java的GUI图形界面设计,网络Socket编程和多线程编程。

本系统主要是完成五子棋游戏的基本操作,在玩游戏的过程中玩家可以放松心情得到娱乐。

本程序实现了一个小的五子棋游戏,可以实现两个人在用一台机器上进行游戏。

程序会自动判断谁输谁赢,在游戏的开始,第一个人可以选择执白棋还是黑棋,之后点击开始进行游戏。

硬件要求能运行Eclipse的windowsxp以上系统。

JAVA程序设计语言及相应的集成开发环境,SDK和ECLIPSE开发工具。

2.4概念设计

网络五子棋是采用网络协议为TCP/IP的网上对弈游戏,运用“客户端-服务器“(c/s)网络架构模式。

实现用户通过Internt连接在任何地方与不同玩家进行对战。

服务器可以创建任意多局游戏。

通过使用多线程和网络套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯。

开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,服务器始终处于监听状态。

客户端是动作的发起者,何时发出申请由客户端决定。

客户端向服务器发出申请,服务器给予响应。

打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS和端口PORT。

连接建立后,创建一个SOCKET实例,并开始一个线程,监听该客户端请求。

服务器继续监听其它用户的连接。

服务器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的信息发送给客户端。

客户端发送请求和响应接收到的各种信息。

在服务器和客户端之间传递的消息格式是采用“[消息类别]+内容“组成的,服务器和客户端在传递消息的过程,根据消息的类别来进行相关的操作。

4.1.1server包chessServer类

classMessageServerPanelextendsPanel//主消息窗口

classServerThreadextendsThread//服务器线程,主要用于服务器与客户端的通信

publicclasschessServerextendsFrameimplementsActionListener//服务器端框架类

4.1.2client包chessClient类

publicclasschessClientextendsFrameimplementsActionListener,KeyListener//五子棋客户端框架,实现了动作监听器和键盘监听器

publicbooleanconnectServer(StringserverIP,intserverPort)throwsException//和服务器建立连接并通信的函数。

returntrue连接成功,false如果失败.

4.1.3chessface包chatPad类

publicclasschatPadextendsPanel//聊天信息Panel。

Panel上的文本域可以显示用户聊天信息。

4.1.4chessface包chessPad类

publicclasschessPadextendsPanelimplementsMouseListener//显示棋盘的Panel。

此Panel实现了鼠标监听器

classchessPoint_blackextendsCanvas//表示黑子的类

classchessPoint_whiteextendsCanvas//表示白子的类

4.1.5chessface包chessthread类

publicclasschessThreadextendsThread//一个客户端用户线程.处理用户落子的点击事件处理,及消息发送.

4.1.6chessface包controlpad类

publicclasscontrolPadextendsPanel//控制Panel。

此Panel上的按钮如其名,完成相应的功能。

4.1.7chessface包inputpad类

publicclassinputPadextendsPanel//输入信息Panel。

Panel左边的下拉列表中列出了所有用户的名字。

右边的文本框可以输入聊天信息,点击回车信息被发送。

4.1.8chessface包userPad类

publicclassuserPadextendsPanel//用户列表Panel。

此Panel维护一个服务器的当前用户列表,所有的用户名都将显示在列表中。

4.2.1程序运行情况

//打开服务端

//打开客户端

//落子

//判定

4.2.2程序运行异常处理

启动游戏时,应先启动服务端,然后打开客户端,连接服务端,建立游戏,加入游戏,然后落子。

在启动客户端时,若是闪退,请先关闭服务端,然后重启。

经过为期二周的课程设计,感觉自己所学远远不能解决做课设时的需求。

在熟悉课本和上网搜索后,才算马马虎虎的完成了任务。

在画棋盘时,调用draw方法对于画图这块的坐标布置,在今后学画其他图画时能够得心应手。

获取棋子方法的巧妙,注册鼠标,获取点击位置,除以棋盘间隔,去掉不为整数的一块,再乘以棋盘间隔便获得最临近点的下棋坐标,即所要下棋的位置。

用二维数组模拟棋盘,无棋子的置为0,黑子置为1,白子置为2,以便在判断胜负时利于同色棋子的查找。

整个棋盘就模拟出来了,很巧妙,不过有更好的方法用向量存储棋子信息,便于悔棋等操作。

实现多用户聊天,老师后面讲的不是很多,做起来有点费力。

参考网上资料,明白Socket原理。

开始时照着课本上的例子,不能得出想要的效果,而且只运行了一个程序看不到有通信的效果。

后面在运行了Server类后,自己尝试着两个Client类,实现了通话,就像腾讯QQ里面一样的效果。

里面定义了Vector线程,实现了多线程用法。

两个板块大体实现,但是后面的要求五,由于数据库的使用不是太熟悉,不能注册用户,添加好友,查找好友,还有悔棋操作未能实现。

此程序最大的缺点还在于,不能实现网络两人下五子棋。

由于不能将棋盘信息与聊天信息区分,不能告诉对反自己下了哪一步,所以根据自己的水平也就能做到这了,今后加以完善。

参考文献

1.孙卫琴Java面向对象教程电子工业出版社2006-03

2.孙卫琴Java网络编程精解电子工业出版社2006-03

3.张仕斌Java程序设计与应用清华大学出版社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类:

packageserver;

importjava.io.*;

import.*;

importjava.awt.*;

importjava.util.*;

importjava.awt.event.*;

/**

*显示服务器及用户信息的Panel类

*/

classMessageServerPanelextendsPanel{

//主消息窗口

TextAreamessageBoard=newTextArea("",22,50,TextArea.SCROLLBARS_VERTICAL_ONLY);

LabelstatusLabel=newLabel("当前连接数:

",Label.LEFT);

PanelboardPanel=newPanel();//主显示区Panel

PanelstatusPanel=newPanel();//连接状态Panel

MessageServerPanel(){

setSize(350,300);

setBackground(newColor(204,204,204));

setLayout(newBorderLayout());

boardPanel.setLayout(newFlowLayout());

boardPanel.setSize(210,210);

statusPanel.setLayout(newBorderLayout());

statusPanel.setSize(210,50);

boardPanel.add(messageBoard);

statusPanel.add(statusLabel,BorderLayout.WEST);

add(boardPanel,BorderLayout.CENTER);

add(statusPanel,BorderLayout.NORTH);

}

}

/**

*服务器线程,主要用于服务器与客户端的通信

*/

classServerThreadextendsThread{

SocketclientSocket;

HashtableclientDataHash;//Socket与发送数据的流的映射

HashtableclientNameHash;//Socket与用户名的映射

HashtablechessPeerHash;//对弈的两个客户端用户名的映射

MessageServerPanelserver;

booleanisClientClosed=false;

/**

*服务器端线程的构造函数,用于初始化一些对象。

*/

ServerThread(SocketclientSocket,HashtableclientDataHash,HashtableclientNameHash,HashtablechessPeerHash,

MessageServerPanelserver){

this.clientSocket=clientSocket;

this.clientDataHash=clientDataHash;

this.clientNameHash=clientNameHash;

this.chessPeerHash=chessPeerHash;

this.server=server;

}

/**

*对客户端发来的消息处理的函数,处理后转发回客户端。

处理消息的过程比较复杂,要针对很多种情况分别处理。

*/

publicvoidmessageTransfer(Stringmessage){

StringclientName,peerName;

/////////////命令处理///////////////////////////////

//如果消息以“/”开头,表明是命令消息。

if(message.startsWith("/")){

//如果消息以“/list”开头,则将其回馈到客户端以更新用户列表

if(message.equals("/list")){

Feedback(getUserList());

}

//如果消息以"/creatgame[inchess]"开头,则修改clientNameHash映射

//和chessPeerHash映射。

elseif(message.startsWith("/creatgame[inchess]")){

//

StringchessServerName=message.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());

}

//如果消息以“/joingame”开头,则将消息的服务端名字和本地用户名提取出来,

//然后修改clientNameHash表和chessPeerHash表。

if(message.startsWith("/joingame")){

StringTokenizeruserToken=newStringTokenizer(message,"");

StringgetUserToken,serverName,selfName;

String[]chessNameOpt={"0","0"};

intgetOptNum=0;

//提取服务端用户名和本地用户名

while(userToken.hasMoreTokens()){

getUserToken=(String)userToken.nextToken("");

if(getOptNum>=1&&getOptNum<=2){

chessNameOpt[getOptNum-1]=getUserToken;

}

getOptNum++;

}

serverName=chessNameOpt[0];

selfName=chessNameOpt[1];

//如果有服务端在等待开始棋局

if(chessPeerHash.containsKey(serverName)&&chessPeerHash.get(serverName).equals("wait")){

//修改Socket和名字映射

synchronized(clientNameHash){

clientNameHash.put(clientSocket,("[inchess]"+selfName));

}

//修改chessPeerHash映射

synchronized(chessPeerHash){

chessPeerHash.put(serverName,selfName);

}

publicTalk(getUserList());

chessPeerTalk(selfName,("/peer"+"[inchess]"+serverName));

chessPeerTalk(serverName,("/peer"+"[inchess]"+selfName));

}else{

chessPeerTalk(selfName,"/reject");

try{

clientClose();

}catch(Exceptionez){

}

}

}

//如果消息以“/[inchess]”开头,则获取要发送消息的用户名和发送的消息

//然后发送出去。

elseif(message.startsWith("/[inchess]")){

intfirstLocation=0,lastLocation;

lastLocation=message.indexOf("",0);

peerName=message.substring((firstLocation+1),lastLocation);

message=message.substring((lastLocation+1));

if(chessPeerTalk(peerName,message)){

Feedback("/error");

}

}

//如果消息以“/giveup”开头,则判断是对弈双方哪方放弃了。

elseif(message.startsWith("/giveup")){

StringchessClientName=message.substring(8);

if(chessPeerHash.containsKey(chessClientName)

&&!

((String)chessPeerHash.get(chessClientName)).equals("wait")){

//如果服务方放弃,则发送消息“/youwin”表明对方获胜

chessPeerTalk((String)chessPeerHash.get(chessClientName),"/youwin");

//剔除这对对弈的人。

synchronized(chessPeerHash){

chessPeerHash.remove(chessClientName);

}

}

if(chessPeerHash.containsValue(chessClientName)){

//如果客户方放弃,也发送消息“/youwin”表明对方获胜

chessPeerTalk((String)getHashKey(chessPeerHash,chessClientName),"/youwin");

synchronized(chessPeerHash){

chessPeerHash.remove((String)getHashKey(chessPeerHash,chessClientName));

}

}

}

//如果找不到发送消息的用户,则输出消息说“没有这个用户”

else{

intfirstLocation=0,lastLocation;

lastLocation=message.indexOf("",0);

if(lastLocation==-1){

Feedback("无效命令");

return;

}else{

peerName=message.substring((firstLocation+1),lastLocation);

message=message.substring((lastLocation+1));

message=(String)clientNameHash.get(clientSocket)+">"+message;

if(peerTalk(peerName,message)){

Feedback("没有这个用户:

"+peerName+"\n");

}

}

}

}

////////////////////////////////////////////////

//如果不以“/”开头,表明是普通消息,直接发送

else{

message=clientNameHash.get(clientSocket)+">"+message;

server.messageBoard.append(message+"\n");

publicTalk(message);

server.messageBoard.setCaretPosition(server.messageBoard.getText().length());

}

}

/**

*发送公共消息的函数,将消息向每个客户端都发送一份

*/

publicvoidpublicTalk(StringpublicTalkMessage){

synchronized(clientDataHash){

//枚举遍历所有客户端输出流。

for(Enumerationenu=clientDataHash.elements();enu.hasMoreElements();){

DataOutputStreamoutData=(DataOutputStream)enu.nextElement();

try{

//输出信息。

这里会阻塞

outData.writeUTF(publicTalkMessage);

}catch(IOExceptiones){

//打印异常堆栈。

终止程序。

es.printStackTrace();

}

}

}

}

/**

*选择对象发送消息,参数peerTalk为发送的用户名,后面的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1