Java课程设计.docx
- 文档编号:18129470
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:21
- 大小:309.07KB
Java课程设计.docx
《Java课程设计.docx》由会员分享,可在线阅读,更多相关《Java课程设计.docx(21页珍藏版)》请在冰点文库上搜索。
Java课程设计
郑州科技学院
Java课程设计(论文)
设计(论文)题目:
网络五子棋
所在系:
信息科学与工程系
专业名称:
计算机科学与技术
学生姓名:
王鹏远
学号:
200915074
指导教师:
曾毅
二〇一一年十二月十六日
目录
引言1
第一章总体设计2
1.1设计的目的2
1.2本模块的主要功能2
1.3模块包含的类和功能2
第二章模块关键技术实现4
2.1实现透明的登录界面4
2.2监控网络连接状态5
2.3绑定属性的JavaBean5
2.4在棋盘中绘制棋子7
2.5实现动态调整棋盘大小8
第三章游戏功能的实现9
3.1游戏规则算法9
3.2联机通信类10
3.3模块界面13
总结16
参考文献17
引言
五子棋是起源于中国古代的传统黑白棋种之一。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问;既具有简单易学的特性,为人们所喜爱,又有深奥的技巧和高水平的国际性比赛。
五子棋文化源远流长,具有东方的神秘和西方的直观;既有“场”的概念,又有“点”的连接。
五子棋起源于中国,发展于日本,风靡于欧洲,可以说五子棋是中西方文化的交流点,是古今哲学的结晶。
本课程设计将设计一个网络五子棋,实现局域网中人与人的对弈。
第一章总体设计
1.1设计的目的
Java课程设计是计算机科学与技术专业集中实践性环节之一,是学习完《Java程序设计实用教程》课程后进行的一次全面的综合练习。
本课程设计主要目的在于加深学生对面向对象基础理论和基本知识的理解,掌握面向对象程序设计的基本方法,进一步使学生综合运用所学知识和增强实际动手能力。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
1.掌握自顶而下的设计方法,将大问题进行模块化、对象化,领会面向对象程序设计的方法。
2.熟练掌握JAVA语言的基本语法,灵活运用各种预定义类、线程和事件处理。
3.学会绘制半透明的登录界面,绘制可以调整大小的五子棋棋盘。
4.学会Socket网络通信编程。
1.2本模块的主要功能
程序运行以后,首先显示登录界面,用户必须输入自己的昵称和对方主机的IP地址才能登录。
和对方建立网络连接后,会进入游戏主窗体。
单击“开始”按钮将开始游戏。
当自己头像下方有一盒棋子时,就轮到自己下棋,棋子的颜色和自己头像下方棋盘里的棋子颜色相同。
当游戏一方胜利时,程序界面将提示“对方胜利”,并且把对方的5个连线棋子用星号标注,并禁止棋盘的落子行为。
当自己一方有5个棋子连成一线时,将提示“你胜利了”并且将自己一方相连的5个棋子用星号标注。
1.3模块包含的类和功能
1、本系统共包7个Java源文件。
类之间的关系如图1-1所示:
2、Java源文件功能
序号
文件名
主要功能
1
ChessPanel
下棋面板
2
GobangModel
承载棋盘棋子的数据模型
3
GobangPanel
棋盘面板
4
LoginPanel
登录面板
5
MainFrame
主窗体
6
ReceiveThread
联机通信类
7
UserBean
用户类
第二章模块关键技术实现
2.1实现透明的登录界面
实现登录界面的关键技术使用了GlassPane面板,它位于窗体的最顶层,swing默认该面板为隐藏模式。
本模块继承JPanel类编写登录面板,其中包含登录信息的文本框和“登录”按钮等信息,然后调用JFrame的setGlassPane()方法将该面板设置为GlassPanel玻璃面板。
程序关键代码如下:
/**
*主窗体的构造方法
*/
publicMainFrame(){
initComponents();//初始化窗体界面
setGlassPane(loginPanel1);//设置登录面板为玻璃面板
loginPanel1.setVisible(true);//显示登录面板
}
接下来需要重写登录面板的paintComponent()方法绘制登录面板的界面,使用80%透明的矩形填充整个登录面板,实现了背景的遮罩,然后调用超类的paintComponent()方法绘制登录界面,实现登录界面的突出显示。
程序关键代码如下:
/**
*绘制组件界面的方法
*
*@seeJComponent#paintComponent(Graphics)
*/
@Override
protectedvoidpaintComponent(Graphicsg){
Graphics2Dg2=(Graphics2D)g;//获取2D绘图上下文
Compositecomposite=g2.getComposite();//备份合成模式g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.8f));//设置绘图使用透明合成规则
g2.fillRect(0,0,getWidth(),getHeight());//使用当前颜色填充矩形空间
g2.setComposite(composite);//恢复原有合成模式
super.paintComponent(g2);//执行超类的组件绘制方法
}
2.2监控网络连接状态
在进行游戏的过程中,通过调用Socket的SetOOBInline()方法启用紧急数据接收,然后Socket的另一端会调用sendUrgentData()方法向自己发送紧急数据,同样本地也会执行相关方法。
如果对方网络有故障或者掉线了,那么该方法会抛出异常,说明网络连线中断。
关键代码如下:
try{
frame.serverSocket=chatSocketServer.accept();//接收Socket连接
SocketserverSocket=frame.serverSocket;
host=serverSocket.getInetAddress().getHostName();//获对方主机信息
Stringip=serverSocket.getInetAddress().getHostAddress();//获取对方IP地址
intlink=JOptionPane.showConfirmDialog(frame,"收到"+host
+"的联机请求,是否接受?
");//询问是否接受联机
if(link==JOptionPane.YES_OPTION){//如果接受联机
LoginPanelloginPanel=(LoginPanel)frame.getRootPane()
.getGlassPane();//获取登录面板的实例
loginPanel.setLinkIp(ip);//设置登录面板的对家IP信息
}
serverSocket.setOOBInline(true);//启用紧急数据的接收
InputStreamis=serverSocket.getInputStream();//获取网络输入流
ObjectInputStreamobjis=newObjectInputStream(is);//创建对象输入流
while(frame.isVisible()){
serverSocket.sendUrgentData(255);//发送紧急数据
…//省略
}
}catch(SocketExceptionex){Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE,
null,ex);
JOptionPane.showMessageDialog(frame,"连接中断");
…//省略
}
2.3绑定属性的JavaBean
本系统定义了棋盘模型类GobangModel,它是一个Javabean,用于记录棋盘的当前棋子的布局,它使用一个二维数组保存所有的棋子。
这个记录棋盘的棋子数据的JavaBean将棋子数组定义为绑定属性,当该属性被修改时会自动产生属性变更事件,并通知所有监听该属性的监听器。
在棋盘类中定义了一个监视该属性的监听器,它在棋盘模型的数据发生改变时立刻更新棋盘界面。
1、产生PropertyChange事件
任何情况下,只要JavaBean中的绑定属性发送变化,该JavaBean就必须发送一个PropertyChange属性改变事件给所有已经注册的事件监听器,棋盘模型JavaBean在设置棋盘数组属性的setChessmanArray()方法中产生了该事件。
程序关键代码如下:
privatePropertyChangeSupportpropertySupport;//定义属性工具类
privatestaticGobangModelmodel;//定义自身的变量
privatebyte[][]chessmanArray=newbyte[15][15];//定义棋子数组
publicstaticfinalStringPROP_CHESSMANARRAY="chessmanArray";//定义属性名称
/**
*设置棋子数组的方法
*-一个代表棋盘棋子的二维数组
*/
publicvoidsetChessmanArray(byte[][]chessmanArray){
this.chessmanArray=chessmanArray;
propertySupport.firePropertyChange(PROP_CHESSMANARRAY,null,
chessmanArray);//报告所有已注册侦听器的绑定属性更新
}
2、实现事件监听器的注册与注销:
对棋盘数据模型JavaBean感兴趣的监听器必须通过该JavaBean提供的方法进行注册或注销,这个两个方法分别是addPropertyChangeListener()方法和removePropertyChangeListener()方法。
只有注册该JavaBean的事件监听才能监听JavaBean属性的改变事件。
棋盘数据模型对这两个方法的实现代码如下:
/**
*添加事件监听器的方法
*
*@paramlistener
*-事件监听器
*/
publicvoidaddPropertyChangeListener(PropertyChangeListenerlistener){
propertySupport.addPropertyChangeListener(listener);//添加事件监听
}
/**
*移除事件监听器的方法
*
*@paramlistener
*-事件监听器
*/
publicvoidremovePropertyChangeListener(PropertyChangeListenerlistener){
propertySupport.removePropertyChangeListener(listener);//移除事件监听器
}
2.4在棋盘中绘制棋子
在设计网络五子棋时,需要在棋盘中绘制棋子,并且在窗户更新时保证棋子仍然在棋盘上,本系统采用的方式是定义一个二维数组,数组的大小与棋盘表格的行和列相对应,描述棋盘中可以放置棋子的所有点。
关键代码如下:
size=newDimension(getWidth(),getHeight());//获取棋盘面板的大小
chessWidth=size.width/15;//初始化棋子宽
chessHeight=size.height/15;//初始化棋子高
byte[][]chessmanArray=gobangModel1.getChessmanArrayCopy();
for(inti=0;i for(intj=0;j bytechessman=chessmanArray[i][j]; intx=i*chessWidth; inty=j*chessHeight; if(chessman! =0) System.out.println("chessis: "+chessman); if(chessman==WHITE_CHESSMAN){//绘制白旗 g.drawImage(white_chessman_img,x,y,chessWidth, chessHeight,this); }elseif(chessman==BLACK_CHESSMAN){//绘制黑旗 g.drawImage(black_chessman_img,x,y,chessWidth, chessHeight,this); }elseif(chessman==(WHITE_CHESSMAN^3)){//绘制最近的白旗落子 g.drawImage(white_chessman_img,x,y,chessWidth, chessHeight,this); g.drawRect(x,y,chessWidth,chessHeight); }elseif(chessman==(BLACK_CHESSMAN^3)){//绘制最近的黑棋落子 g.drawImage(black_chessman_img,x,y,chessWidth, chessHeight,this); g.drawRect(x,y,chessWidth,chessHeight); }elseif(chessman==((byte)(WHITE_CHESSMAN^8))){//绘制导致胜利的连线白旗 g.drawImage(white_chessman_img,x,y,chessWidth, chessHeight,this); g.drawImage(rightTop_img,x,y,chessWidth,chessHeight, this); }elseif(chessman==(BLACK_CHESSMAN^8)){//绘导致胜利的连线黑旗 g.drawImage(black_chessman_img,x,y,chessWidth, chessHeight,this); g.drawImage(rightTop_img,x,y,chessWidth,chessHeight, this); } } } 2.5实现动态调整棋盘大小 在设计网络五子棋时,为了突出游戏的特点,允许用户在游戏进行的过程中调整窗口的大小。 实现该功能的难点在于窗口调整大小后,棋盘和棋子的大小需要调整,棋盘表格的大小需要调整,棋盘当前棋子的位置需要调整。 此处可根据棋盘面板的宽带和高度计算棋格和棋子大小。 然后使用计算出的棋格宽度和高度绘制棋盘;使用计算出得棋子高度与宽度绘制指定大小的棋子。 绘制棋盘的关键程序代码如下: intw=getWidth();//棋盘宽度 inth=getHeight();//棋盘高度 intchessW=w/15,chessH=h/15;//棋子宽度和高度 intleft=chessW/2+(w%15)/2;//棋盘左边界 intright=left+chessW*14;//棋盘右边界 inttop=chessH/2+(h%15)/2;//棋盘上边界 intbottom=top+chessH*14;//棋盘下边界 for(inti=0;i<15;i++){//画每条横线 g.drawLine(left,top+(i*chessH),right,top+(i*chessH)); } for(inti=0;i<15;i++){//画每条竖线 g.drawLine(left+(i*chessW),top,left+(i*chessW),bottom); } 第三章游戏功能的实现 3.1游戏规则算法 arithmetic()方法是根据五子棋的游戏规则编写的计算方法,它根据当前棋子的类型和位置,计算是黑棋赢还是白棋赢,计算方法是以落子点为中心,向左右两边、上下两边、正斜两边、反斜两边查找同一类型的棋子,如果棋子数大于等于5,则表示当前下棋者为赢家。 实现五子棋算法的程序关键代码如下: /*五子棋算法 * *@paramn *-代表棋子颜色的整数 *@paramArow *-行编号 *@paramAcolumn *-列编号 *@return胜利一方的棋子颜色的整数 */ publicintarithmetic(intn,intArow,intAcolumn){ intn3=n^3; byten8=(byte)(n^8); byte[][]note=gobangModel1.getChessmanArrayCopy(); intBCount=1; //纵向查找 booleanLbol=true; booleanRbol=true; BCount=1; for(inti=1;i<=5;i++){ if((Acolumn+i)>14){//如果棋子超出最大列数 Rbol=false; } if((Acolumn-i)<0){//如果棋子超出最小列数 Lbol=false; } if(Rbol==true){ if(note[Arow][Acolumn+i]==n ||note[Arow][Acolumn+i]==n3){//如果横向向右有相同的棋子 ++BCount; note[Arow][Acolumn+i]=n8; }else{ Rbol=false; } } if(Lbol==true){ if(note[Arow][Acolumn-i]==n ||note[Arow][Acolumn-i]==n3){//如果横向向左有相同的棋子 ++BCount; note[Arow][Acolumn-i]=n8; }else{ Lbol=false; } } if(BCount>=5){//如果同类型的棋子数大于等于5个 note[Arow][Acolumn]=n8; gobangModel1.updateChessmanArray(note); repaint(); returnn;//返回胜利一方的棋子 } //同理依次判断横向、正斜、反斜等方向的棋子。 }return0; } 3.2联机通信类 本模块使用一个联机通信类来接收对家发送的所有信息,包括游戏命令代码的接收与处理。 这个联机通信类ReceiveThread是一个线程类,它继承Thread类并重写run()方法,来处理联机业务。 run()方法是线程的核心方法,本类在该方法中接收远程计算机的联机请求,根据对方的联机信息填充登录面板的IP地址文本框,从网络中读取Java对象,根据对象的类型判断信息的种类是登录信息还是命令代码等,并做出相应的业务处理。 程序关键代码如下: /** *线程的主体方法 * *@seejava.lang.Thread#run() */ @Override publicvoidrun(){ while(true){ try{ frame.serverSocket=chatSocketServer.accept();//接收Socket连接 SocketserverSocket=frame.serverSocket; host=serverSocket.getInetAddress().getHostName();//获对方主机信息 Stringip=serverSocket.getInetAddress().getHostAddress();//获取对方IP地址 intlink=JOptionPane.showConfirmDialog(frame,"收到"+host +"的联机请求,是否接受? ");//询问是否接受联机 if(link==JOptionPane.YES_OPTION){//如果接受联机 LoginPanelloginPanel=(LoginPanel)frame.getRootPane().getGlassPane();//获取登录面板的实例 loginPanel.setLinkIp(ip);//设置登录面板的对家IP信息 } serverSocket.setOOBInline(true);//启用紧急数据的接收 InputStreamis=serverSocket.getInputStream();//获取网络输入流 ObjectInputStreamobjis=newObjectInputStream(is);//创建对象输入流 while(frame.isVisible()){ serverSocket.sendUrgentData(255);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 课程设计