某学院面向对象程序设计实训报告.docx

上传人:夺命阿水 文档编号:1040575 上传时间:2024-03-01 格式:DOCX 页数:35 大小:713.51KB
返回 下载 相关 举报
某学院面向对象程序设计实训报告.docx_第1页
第1页 / 共35页
某学院面向对象程序设计实训报告.docx_第2页
第2页 / 共35页
某学院面向对象程序设计实训报告.docx_第3页
第3页 / 共35页
某学院面向对象程序设计实训报告.docx_第4页
第4页 / 共35页
某学院面向对象程序设计实训报告.docx_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《某学院面向对象程序设计实训报告.docx》由会员分享,可在线阅读,更多相关《某学院面向对象程序设计实训报告.docx(35页珍藏版)》请在课桌文档上搜索。

1、某学院面向对象程序设计实训报告广曲新技人等鹿山考相面向对象程本钱计实制想告题目:网络中国象棋系别:电气与计算机工程系专业班级:计软141班姓名:邓康言学号:20141409成绩评定:指导教师签字:2016年1月1。日目录目录1、 需求分析21.1 开发的背景21.2 算法21.3 要求32、 总体分析与设计32.1 总体设计方案32.2 功能描述422.1服务器端42.3 2.2客户端42.4 算法设计一一42.5 系统流程图一53、 数据结构设计53.1 功能模块的设计53.1.1 服务器端框架类设计53.1.2 2服务器线程设计93.1.3 3服务器代理线程设计93.1.4 棋子的开发类设

2、计133.1.5 客户端的框架类设计153.1.6 客户端的框架类设计173.1.7 棋子的规则类设计203.1.8 棋盘的规则类设计234、系统实现54.1 服务器端界面264.2 客户端界面274.3 未启动服务器,客户端连接失败274.4 4服务器启动284.5 服务器启动客户端成功连接294.6 显示在线用户294.7 不同意重名304.8 8发起挑战304.9拒绝挑战314.10同意挑战314.11对战走棋324.12不能向正在下棋的用户发起挑战324.13赢棋334.14认输334.15服务器关闭34总结34参考文献351、需求分析1.1 开发的背景中国象棋有着悠久的历史,象棋爱好

3、者更是不计其数,但是由于人们的工作地点从、时间的限制,原始的那种面对面的下棋方式已经不再习惯人们的生活,人们已经开始走向网络象棋博弈网嘉象棋有着很多的优点,通过网络象棋,对弈的双方是网络上任意的两个象棋爱好者,甚至是不认识。网络让对弈的范围更加的广泛,让象棋爱好者能够与更多的象棋爱好者切磋棋艺。1.2 算法指定服务器端口号 支持多人同时在线 显示在线用户信息 显示当前在线所有用户 从在线用户列表中选择玩家进行挑战 同意或者拒绝挑战1.3 要求 用JaVa语言实现系统,源程序要有适当的注释,使程序容易阅读 函数功能要划分好(结构化程序设计) 能够增加新功能模块2、总体分析与设计2.1 总体设计方

4、案系统功能模块图:2.2 功能描述2.3 2.1服务器端 能够指定服务器端口号。 能够支持多人同时在线。 能够显示在线用户信息。 不同意玩家同名2.2.2客户端 能够通过主机IP号及端口号登陆到服务器。 能够显示当前在线所有用户。 能够从在线用户列表中选择玩家进行挑战。 能够同意或者拒绝挑战。 假如对方在与其他玩家对弈中,则应该给与相应的提示信息。 象棋规则一定要严密。 棋子样式使用最普通的橡胶式象棋。棋子为黑色,字为红色与白色2.3算法设计一本程序功能模块根据程序设计的需要。综合程序的有用性、智能化的考虑。将程序划分为8个模块来写。(1)服务器端的框架设计类(2)服务器线程类(3)服务器代理

5、线程类(4)棋子类的开发类(5)客户端的框架设计类(6)客户端线程类(7)棋子的规则类(8)棋盘的设计类2.5系统流程图3、数据结构设计3.1 功能模块的设计3.1.1 服务器端框架类设计importjava.util.*;importjava.awt*;界面包importjava.awt.event.*;事件处理包importjavax.swing.*;图形化界面包importjavax.swing.event.*:图形化界面包事件讲行处理*;网络包importiava.io.*11)流publicclassSerVerextendsJFrameimplementsActionListene

6、rKabeljlPort=newJLabeI(端口号);创建提示输入端口号标签JTextFieldjtfPort=newJTeXtField(9457);用于输入端口号的文本框3ButtonjbStart=newJBUtton(启动);创建启动按钮JButtonjbStop=newJBUttOn(关闭);创建关闭按钮JPaneljps=newJPanel.();创建一个JPanel对象JLiStjlUserOnline=newJLiSt();/创建用于显示当前用户的JLiStDScrollPanejspx=newJSCrolIPane(jIUserOnline);/将显示当前用户的JLiSt放

7、在JSCroIlPane中JSplitPanejspz=newJSPIitPane(JSPIitPane.H0RZZ0W4L_5PLiT,jspx,jps);创建JSPlitPane对象ServerSocketss;声明SerVerSoCket引用ServerThreadst;声明SerVerThread引用VeCtOronlineList=newVeCtor():创建存放当前在线用户的VeCtor对象publicServer()(this.initialComponent();初始化控件this.addListener();为相应的控件注册事件监听器this.initialFrame();初

8、始化窗体this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);publicvoidinitialcomponent()jps.setLayout(null);设为空布局jlPort.SetBounds(20,20,50,20);jps.add(jlPort);添加由于提示输入端口号的标签this.jtfPort.SetBounds(85,20,60,20);jps.add(this,jtfPort);添加由于输X端口号的文本框this.jbStart.SetBounds(18,50,60,20);jps.add(this.jbStart);添加

9、开始隹钮this.jbStop.SetBounds(85,50,60,20);jps.add(this.jbStOP);添加关闭疫钮this.jbStop.setEnabled(false);将关闭按钮设为不可用publicvoidaddListener()(thisJbStart.addActionListener(this);为开始按钮注册事件监听器this.jbStop.addACtionLiStener(this);为关闭按钮注册事件监听器)publicvoidinitialFrame()this.SetTitIe(象棋-服务器端”);设置窗体标题Imageimage=newImage

10、icon(ico.gif).getlmage();this.setlconlmage(image);this.add(jspz);葩JSPlitPane添加到窗体中jspz.SetDividerLocation(250);jspz.setDividerSize(4);设割线的位置与宽度this.setBounds(20,20,420,320);this.SetVisible(true);设置可见性this.addWindowListener(为窗体关闭事件注册监听器newWindowAdapterOpublicvoidwindowclosing(WindowEvente)if(st=nuU)当

11、服务器线程为空时直接退出SyStem.exit(0);退出return;VeCtOr V=OnlineList;)tryintsize=v.size();for(inti=0;isize;i+)当不为空时,向在线用户发送离线信息ServerAgentThreadtempSat=(ServerAgentThread)v.get(i);tempSat.dout.writeTF();tempSat.flag=false;终止服务器桓理线程st.flag=false/终止服务器线程st=null;ss.close();关闭ServerSocketV.clear();将在线用户列表清空refreshLi

12、st();刷新列表)catch(Exceptionee)ee.PrintStackTraceO;)SyStem.exit(0);退出);publicvoidactionPerformed(ActionEvente)if(e.getSource()=this.jbStart)当单击启动按钮时this.jbStart_event();elseif(e.getSource()=this.jbStop)单击“关闭”按钮后this.jbStop_event();)publicvoidjbStart_event()单击启动“按钮的业务处理代码intport=0;try获得用户输入的端口号,并转化为整型Po

13、rt=Integer.prselnt(this.jtfPort.getText().trim();)catch(Exceptionee)端口号不是整数,给出提示信息DOptionPane.s。WMeSSageDta(Og(this,“端口号只能是整数,错误,JOptionPane.ERROR_MESSAGE);return;)if(port65535port0)断口号不合法,给出提示信息JOPtiOnPane.s/)。WMeSSageDia2og(this,“端口号只能是0-65535的整数错误,JOptionPane.ERRoR_MESSAGE);return;)trythis.jbStar

14、t.SetEnabled(False);将开始按钮设为不可用this.jtfPort.setEnabled(false);将用于输入端口号的文本框设为不可用this.jbStop.setEnabled(true);将停止按钮设为可用ss=newSerVerSoCket(POrt);创建SerVerSoCket对象st=newSerVerThread(this);创建服务器线程st.start();启动服务器线程给出服务器启动成功的提示信息JOptionPane.showMeSsageDiaLog(this,服务踞启动成功,提示,JOptionPane.INFORMATI0N_MESSAGE);

15、)catch(Exceptionee)给出服务器启动失败的提示信息JOPtiOnPane.s力。WMeSSageDiaLog(this,”服务器启动失败错误,JOptionPane.ERROR_MESSAGE);this.jbStart.setEnabled(true);将开始按钮设为可用thisJtfPort.setEnabled(true);将用于输入端口号的文本框设为可用this.jbStop.SetEnabled(false);将停止按钮设为不可用)publicvoidjbStop_event()单击“关闭”按钮的业务处理代码try(VeCtOrV=OnlineList;intsize

16、=v.size();for(inti=0;isize;i+)向在线用户发送离线信息ServerAgentThreadtempSat=(ServerAgentThread)v.get(i);tempSat.dout.writeTF();tempSat.flag=false;关闭服务器桓理线程st.flag=false;关闭服务器线程st=null;ss.close();关闭SerVerSOCketv.clear();将在线用户列表清空refreshList();刷新列表this.jbStart.setEnabled(true);将开始按钮设为可用this.jtfPort.setEnabled(t

17、rue);将用于输入端口号的文本框设为可用this.jbStop.SetEnabled(False);将停止按钮设为不可用)catch(Exceptionee)ee.printStackTrace();publicvoidrefreshList()/更新在线用户列表的业务处理代码VeCtOrv=newVector();intsize=this.OnlineList.size();for(inti=0;isize;i+)遍历在线列表ServerAgentThreadtempSat=(ServerAgentThread)this.OnlineList.get(i);Stringtemps=temp

18、Sat.sc.getInetAddress().toString();temps=temps+tempSat.getName();获而所需信息v.add(temps);/添力到veCtOP中)this.IlUserOnline.SetListData(V);更新列表数据)publicstaticvoidmain(Stringargs)(newServer();)说明:此服务器端类既为服务器的运行类,用户通过该类进入服务器的主界面。进行相应的操作。3.1.2服务器线程设计/*服务器线程*/importjava.UtiL*;importjava,awt.*;iqx)rtjava,awl,evenl

19、.*;importjavax.swing.*;i11ortJjaVax.swing,event.*;.*:importjava.io.*;publicclassServerThreadextendsThreadServerfather;声明Server的引用ServerSocketss;声明SerVerSoCket的引用booleanflag=true;线程存在为truepublicServerThread(Serverfather)构造器this,father=father;ss=father.ss;与服务器端关联publicvoidrun()while(flag)定义一个死循环。为fals

20、e时跳出(try(Socketsc=ss.accept();等待客户端连接ServerAgentThreadsat-newServerAgentThreacKfather,sc);sat.start();创建并启动服务器代理线程)catch(Exceptione)/tryCatCh捕获特殊e.PrintStackTraceO;打印特殊,可有可无)类功能说明:服务器线程类在服务器启动后创建并启动的第一个线程,该线程要紧用于接收客户端的连接,并为每一个连接分配一个服务器代理线程。3.1.3服务器代理线程设计【部分代码(过长不适复制完)】:/*服务器代理线程*/先想到需要用什么函数importjav

21、a.util.*;importjava.awt.*;界面包importjava.awt.event.*;事件处理包importjavax.swing.*;图形化界面包importjavax.swing.event.*;图形化界面包事件进行处理.*;网络包importjava.io.*jI0publicclassServerAgentThreadextendsThread同服务器类一样Serverfather;声明Server的引用Socketsc;声明SOCkeI的引用。用他来与客户端一一对应。分配给它资源DataInputStreamdin;声明数据输入流与输出流的引用DataOutputS

22、treamdout;booleanflag=true;操纵线程的标志位publicServerAgentThread(Serverfather,Socketsc)this,father-father;this,sc=sc;try(din=newDataInputStream(sc.getInputStreamO);创建数据输入流dout-newDataOutputStream(sc.getutputStreamO);创建数据输出流)catch(Exceptione)e.PrintStackTrace();publicvoidrun()(While(flag)线程在存活期。就是死循环。trySt

23、ringmsg=din.readUTF().trim();接收客户端传来的信息if(msg.StartsWith()收到新用户的信息(this.nick_name(msg);elseif(msg.StartSWith()收到用户离开的信息this.client_leave(msg);elseif(msg.StartsWith)/收到用户发出的挑战信息this.tiao_zhan(msg);elseif(msg.StartSWith()收到同意挑战的信息this.tong_yi(msg);elseif(msg.StartSWith()收到拒绝挑战的信息this.butong_yi(msg);)e

24、lseif(msg.StartSWith()收到被挑战者忙的信息this,busy(msg);)elseif(msg.StartsWith()收到走棋的信息this,move(msg);)elseif(msg.StartSWith()收到某用户认输的信息this,renshu(msg);)catch(Exceptione)(e.PrintStackTraceO;)publicvoidnick_name(Stringmsg)tryStringname=msg.substring(13);获得用户的昵称this.setName(name);用该昵称给该线程取名Vectorv=father.OnIi

25、neList;获得在线用户列表booleaniSChongMing=false;intsize=v.SiZe();获得用户列表的大小for(inti=0;isize;i+)遍历列表,查看是否已经有该用户名ServerAgentThreadtempSat=(ServerAgentThread)v.get(i);if(tempSat.getName().equals(name)(isChongMing=true;有重名,将标志位设为truebreak;)if(isChongMing=true)假如重名(dout.writeUTF(*);将重名信息发送给客户端din.CIOSe();关闭数据输入流d

26、out.close();关闭数据输出流sc.close();关闭Socketflag=false;终止该服务器代理线程else假如不重名V.add(this);将该线程添加到在线列表father.refreshList();刷新服务器在线信息列表StringnickListMsg=”;size=v.size();获得在线列表大小for(inti=0;isize;i+)ServerAgentThreadtempSat=(ServerAgentThread)v.get(i);nickListMsg=nickListMsg+z,*+tempSat.getName();将在线列表内容住组织成字符串ni

27、ckListMsg=/z*+nickListMsg;Vectortempv=father.onlineList;size=tempv.size();for(inti=0;isize;i+)遍历在线列表ServerAgentThreadSatTemp=(ServerAgentThread)tempv.get(i);satTemp.dout.writeUTF(nickListMsg);将最新的列表信息发送到各个客户端if(satTemp!=this)给其他客户端发送新用户上线的信息satTemp.dout.WriteUTF(+this.getName()+”上线了;catch(IOExceptio

28、ne)(e.PrintStackTrace();)服务器代理线程类功能及实现:服务器代理线程要紧是用于接收客户端传来的信息,并将该信息转发给相对应的另一个客户端。服务器为所有客户端都分配了一个该类线程,单独为特定客户端进行服务。同时每一个服务器代理线程都有能位移标示其的名称3.1.4 棋子的开发类设计importjava.util.*;importjava.awt.*;importjavax.swing.*;publicclassQiZi定义棋子的属性privateColorCOlOr;棋子的颜色privateStringname;棋子的名字,即是什么棋privateintx;所在的X方向位置

29、将用二维数组实现PriVateinty;所在的y方向位置将用二维数组实现privatebooleanfocus=false;是否被选中,以至于只能选一子走publicQiZiO无参函数()publicQiZi(Colorcolor,Stringname,intx,inty)颜色,名字,坐标(构造器this.color=color;this,name=name;this,x=x;this,y=y;this,focus=false;为未选中状态)publicColorgetColor()获得棋子颜色的方法(returnthis,color;)publicvoidsetColor(ColorCOlo

30、r)设置棋子颜色的方法this,color=color;)publicStringgetName()获得棋子名字的方法returnthis,name;)publicvoidsetName(Stringname)设置棋子名字的方法(this,name=name;)publicintgetX()获得棋子X方向位置的方法returnthis,x;)publicvoidsetX(intx)设置棋子X方向位置的方法(this,x=x;publicintgetY()获得棋子y方向位置的方法(returnthis,y;)publicvoidsetY(inty)设置棋子y方向位置的方法this.y=y;)pu

31、blicbooleangetFocus()推断棋子是否被选中的方法returnfocus;)publicvoidsetFocus(booleanfocus)设置棋子选中状态的方法this,focus=focus;棋子类功能实现:该类要紧包含有棋子的属性及一些关于属性的小方法3.1.5 客户端的框架类设计部分代码:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swi11H.event;importjava.util.*:importjava.io.*;.*;publicclassXianHQiext

32、endsJFrameimplementsActionListener设置控件JpublicstaticfinalColorbgC0L0r=neCOlOr(245,25。,160);/棋盘的背景色。RGB调色publicstaticfinalColorfocusbg=neCOIOr(242,242,242);棋子选中后的背景色。RGB调色publicstaticfinalColorfocuschar=nevtCOlor(96,95,91);棋子选中后的字符颜色。RGB调色publicstaticfinalColorcotorl=newCOlOr(249,183,173);红方的颜色。RGB调色p

33、ublicstaticfinalColorco(or2=Color.M)ite;白方的颜色直接定义JLabeljlHost=newJLabel(主机IP”);创建提示输入主机名的标签JLabeljlPort=newJLabel(端口号);创建提示输入端口号标签JLabeljlNickName=newJLabel(昵称);创建提示输入昵称的标签JTextFieldjtfHost=newJTeXtField(“127.0.0.1”);创建输入主机名的文本框,默认值是“127.0.0.1”JTextFieldjtfPort=newJTeXtField(”9457“);创建输入端口号的文本框,默认值是

34、9999JTextFieldjtfNickName=newJTeXtFieId(“康言先森”);创建输入昵称的文本框,默认值是PIay1DButtonjbConnect=newJBUttOn(“连接”);创建“连接“按钮DButtonjbDisconnect=newJBUttOn(断开);创建断开按钮DButtonjbFail=newJBUttOn(认输);创建认输按钮JButtonjbChallenge=newJBUtton(挑战);创建挑战按钮JeOmbOBOXjcbNickList=newJComboBoxO;/创建存放当前用户的下拉列表框DButtonjbYChallenge=newJ

35、BUtton(同意挑战);创建同意挑战按钮DButtonjbNChallenge=newJBUttOn(拒绝挑战);创建拒绝挑战按钮intWidth=6。;设置棋盘两线之间的距离QiZiqiZi=newQiZi910;创建棋子数组QiPanjpz=newQiPan(qiZi,width,this);创建棋盘/3Paneljpz=newJPaneI();创建一个JPane1,暂时代替棋盘JPaneljpy=newJPanel();创建一个JPanelDSplitPanejsp=newJSPlitPane(JSPIitPane.H0R7Z0NI4L_5PLiT,jpz,jpy);/仓U建一个JSP

36、IitPanebooleanCaiPan=false;可否走棋的标志位intcolor=0j代表红棋,1代表白棋Socketsc;声明SOCket引用ClientAgentThreadcat;声明客户端代理线程的引用publicXiangQi()构造XiangQi方法this.initialcomponent();初始化控件this.addListener();为相应控件注册事件监听器this.initialState();初始化状态this.initialQiZi();初始化棋子this.initialFrame();初始化窗体)publicvoidinitialComponent()jpy

37、.setLayout(null);设为空布局this.jIHost.SetBounds(10j10j50,20);jpy.add(this.jIHOSt:);添加主疝IP标签this.jtfHost.setBounds(70j10,80,20);jpy.add(this.jtfHost);添加用于输入主机名的文本框this.jIPort.SetBOUndS(10,40,50,20);jpy.add(this.jlPort);添加“端口号”标签thisjtfPort.SetBounds(70j40,80,20);jpy.add(this.jtfPort);添加用于输美端口号的文本框this.jI

38、NickName.SetBounds(10,70,50,20);jpy.add(this,jINickName);添加玩豪昵称标签this.JtfNickName.SetBoUndS(70,70,80,20);jpy.add(this.jtfNickName);添加而于输美昵称的文本框this.jbConnect.setBounds(10,100,80,20);jpy.add(this.jbConnect);添加连接按面this.jbDisconnect.setBounds(100,100,80,2。);jpy.add(this.jbDisconnect);添断开“按面this.JcbNick

39、List.SetBounds(20,130,130,20);jpy.add(this.jcbNickList);添加用于显示当前用户的下拉列表框this.JbChallenge.SetBOUndS(10,160,80,20);jpy.add(this.jbChallenge);添加“荻战,按电this.jbFail.setBounds(100,160,80,20);jpy.add(this.jbFail);添加“认输”按钮this.JbYChallenge.SetBounds(5j190,86,20);jpy.add(this.jbYChallenge);添加同意挑屈按钮this.jbNCha

40、llenge.setBounds(100,190,86,20);jpy.add(this.jbNChallenge);添拒绝挑战按钮jpz.SetLayout(null);将棋燕设为空布局jpz.SetBounds(0,0,700,700);设置大小publicvoidaddListener()this JbConnect. addActionListener(this); 为“连接”按钮注册事件监听器 this. jbDisconnect. addActionListener (this); 为断开按钮注册事件监听器 this. *331121186.加1人(:宣0口1_516便(计15);

41、为挑战按钮注册事件监听器(this.jbFail.addActionListener(this);为认输按钮注册事件监听器this.jbYChallenge.addActionListener(this);为“同意挑战”按钮注册事件监听器this.jbNChallenge.addActionListener(this);为拒绝挑战按钮注册事件监听器publicvoidinitialState()this.jbDisconnect.SetEnabled(false);将断开按钮设为不可用this.jbChallenge.SetEnabled(false);将挑战按钮设为不可用this.jbYCh

42、allenge.setEnabled(false);将同意挑战按钮设为不可用this.jbNChallenge.setEnabled(false);将拒绝挑战按钮设为不可用this.jbFail.SetEnabled(false);将认输按钮设为不可用客户端主类框架的功能及实现:客户端主类为客户端的运行类,用户通过运行该类连接服务器,也是通过在该类的窗体中与其他玩家进行对弈。其与服务器端主类的开发类似。3.1.6 客户端的框架类设计部分代码:/*客户端线程类*/importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importj

43、avax.swing,event.*;importjava.util.*;importjava.io.*;.*;publicclassClientAgentThreadextendsThread(XiangQifather;声明XiangQi的引用booleanflag=IrUe;操纵线程的标志位DataTnputStreamdin;声明数据输入输出流的引用DataOutputStreamdout;StringtiaoZhanZhe=null;用于记录正在挑战的对手publicClientgentThread(XiangQifather)(this,father=father;try(din=newDataInputStream(father.sc.getInputStream();创建数据输入输出流dout=newDataOutputStream(father,sc.getOutputStream();Stringname=father.JtfNickName.getText()

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

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号