某学院面向对象程序设计实训报告.docx
某学院面向对象程序设计实训报告广曲新技人等鹿山考相面向对象程本钱计实制想告题目:网络中国象棋系别:电气与计算机工程系专业班级:计软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 棋子的开发类设计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 开发的背景中国象棋有着悠久的历史,象棋爱好者更是不计其数,但是由于人们的工作地点从、时间的限制,原始的那种面对面的下棋方式已经不再习惯人们的生活,人们已经开始走向网络象棋博弈网嘉象棋有着很多的优点,通过网络象棋,对弈的双方是网络上任意的两个象棋爱好者,甚至是不认识。网络让对弈的范围更加的广泛,让象棋爱好者能够与更多的象棋爱好者切磋棋艺。1.2 算法指定服务器端口号 支持多人同时在线 显示在线用户信息 显示当前在线所有用户 从在线用户列表中选择玩家进行挑战 同意或者拒绝挑战1.3 要求 用JaVa语言实现系统,源程序要有适当的注释,使程序容易阅读 函数功能要划分好(结构化程序设计) 能够增加新功能模块2、总体分析与设计2.1 总体设计方案系统功能模块图:2.2 功能描述2.3 2.1服务器端 能够指定服务器端口号。 能够支持多人同时在线。 能够显示在线用户信息。 不同意玩家同名2.2.2客户端 能够通过主机IP号及端口号登陆到服务器。 能够显示当前在线所有用户。 能够从在线用户列表中选择玩家进行挑战。 能够同意或者拒绝挑战。 假如对方在与其他玩家对弈中,则应该给与相应的提示信息。 象棋规则一定要严密。 棋子样式使用最普通的橡胶式象棋。棋子为黑色,字为红色与白色2.3算法设计一本程序功能模块根据程序设计的需要。综合程序的有用性、智能化的考虑。将程序划分为8个模块来写。(1)服务器端的框架设计类(2)服务器线程类(3)服务器代理线程类(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)流publicclassSerVerextendsJFrameimplementsActionListenerKabeljlPort=newJLabeI("端口号");创建提示输入端口号标签JTextFieldjtfPort=newJTeXtField("9457");用于输入端口号的文本框3ButtonjbStart=newJBUtton("启动");创建"启动"按钮JButtonjbStop=newJBUttOn("关闭");创建"关闭"按钮JPaneljps=newJPanel.();创建一个JPanel对象JLiStjlUserOnline=newJLiSt();/创建用于显示当前用户的JLiStDScrollPanejspx=newJSCrolIPane(jIUserOnline);/将显示当前用户的JLiSt放在JSCroIlPane中JSplitPanejspz=newJSPIitPane(JSPIitPane.H0RZZ0W4L_5PLiT,jspx,jps);创建JSPlitPane对象ServerSocketss;声明SerVerSoCket引用ServerThreadst;声明SerVerThread引用VeCtOronlineList=newVeCtor():创建存放当前在线用户的VeCtor对象publicServer()(this.initialComponent();初始化控件this.addListener();为相应的控件注册事件监听器this.initialFrame();初始化窗体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);添加"开始"隹钮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=newImageicon("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)当服务器线程为空时直接退出SyStem.exit(0);退出return;VeCtOr V=OnlineList;)tryintsize=v.size();for(inti=0;i<size;i+)当不为空时,向在线用户发送离线信息ServerAgentThreadtempSat=(ServerAgentThread)v.get(i);tempSat.dout.writeTF("<#SERVER_DOWN#>");tempSat.flag=false;终止服务器桓理线程st.flag=false"/终止服务器线程st=null;ss.close();关闭ServerSocketV.clear();将在线用户列表清空refreshList();刷新列表)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获得用户输入的端口号,并转化为整型Port=Integer.prselnt(this.jtfPort.getText().trim();)catch(Exceptionee)端口号不是整数,给出提示信息DOptionPane.s»。WMeSSageDta(Og(this,“端口号只能是整数","错误",JOptionPane.ERROR_MESSAGE');return;)if(port>65535port<0)断口号不合法,给出提示信息JOPtiOnPane.s/)。WMeSSageDia2og(this,“端口号只能是0-65535的整数错误",JOptionPane.ERRoR_MESSAGE);return;)trythis.jbStart.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);)catch(Exceptionee)给出服务器启动失败的提示信息JOPtiOnPane.s力。WMeSSageDiaLog(this,”服务器启动失败错误",JOptionPane.ERROR_MESSAGE);this.jbStart.set