没有合适的资源?快使用搜索试试~ 我知道了~
java实验报告——网络中国象棋对战大学本科毕业论文.doc
0 下载量 198 浏览量
2023-07-12
12:26:52
上传
评论
收藏 237KB DOC 举报
温馨提示
试读
47页
java实验报告——网络中国象棋对战大学本科毕业论文.doc
资源推荐
资源详情
资源评论
《Java 语言程序设计(英)》课程大作业报告
开发背景
中国象棋有着悠久的历史,象棋爱好者更是不计其数,但是由于人们工作地点,时间的限
制,原是那种面对面的下棋方式已经不再适合人们的生活,人们已经开始走向网络象棋。
网络象棋有着很多的优点,通过网络象棋,对弈双方可以是任意两个象棋爱好者,甚至从
不认识。网络象棋让对弈的范围更加的广泛,让象棋爱好者可以与更多的象棋爱好者切磋
棋艺。
系统分析
1、服务器端
可以指定服务端口号
可以支撑多人同时在线
可以显示在线用户的信息
不允许玩家同名
2、客户端
能够通过主机 IP 及端口号登陆到服务器
可以显示当前所有用户
可以从在线用户列表中选择玩家进行挑战
可以接受或拒绝挑战
如果对方正在与其他玩家对弈中,则应给出相应的提示信息
象棋规则一定要严密
棋子样式采用最普通的橡胶式象棋,即棋子黑色,文字红色和白色
设计方案与算法分析:
服务器端框架设计
游戏开发过程,当然首先从服务器端开始,因为有了服务器的基础框架,客户端在在开发
过程中才能进行一些有必要的测试,这是该类游戏一般的开发流程。
服务器端主类即服务器端的运行类,用户通过运行该类进行服务器的主界面,其实这里暂
时只能开发出服务器的简单框架及界面,因为服务器线程和服务器代理线程暂时都还没有
开发,等相应的类开发完成之后,再回到该类进行代码完善。
服务器线程的开发
服务器线程是服务器启动后创建并启动的第一个线程,该线程主要用于接受客户端的连接,
并为每一个链接分配一个服务器代理线程为其进行服务。
服务器代理线程的开发与设计
服务器代理线程主要用于接收客户端传来的信息并将该信息转发给对应的另一客户端。服
务器为所有的客户端都分配了一个该类实例,单独为特定客户端进行服务。同时每一个服
务器代理线程都有唯一能标志其的名称。
服务器端的完善
服务器端的类的框架都已开发完成,但在一开始时,由于没有服务器线程和服务器代理线
程,有些业务处理代码没有开发,从而将完成对服务器端各个类的完善工作。
棋子类的开发
前面我们已经基本完成了服务器端的开发,已经可以接受客户端的连接,从这里开始将正
式进入客户端的开发,下象棋当然要有棋子,下面我们将对棋子类进行介绍,该类主要包
含着棋子的属性及一些关于属性的小的方法。
客户端主类框架的开发
客户端主类即客户端的运行类,用户通过运行该类连接服务器,也是通过在该类的窗体中
与其他玩家进行对弈。当然其与服务器端主类的开发类似,由于部分类没有开发,这里暂
时只能完成界面的搭建及简单的业务代码框架,具体的业务代码在后面的开发中会进行完
善。
客户端代理线程的开发
客户端代理线程主要用于接收服务器传来的消息,并根据不同的消息进行相应的业务处理,
当然这里暂时先给出该类的代码框架,对消息的业务处理代码在后面会进行介绍。
规则类的开发与设计
通过上面的开发,客户端已经可以连接到服务器,而且通信的框架也已经开发完成,下面
我们将正式开始进入游戏逻辑业务的开发。首先将从下棋最基本的一步开始,即开发下棋
的规则。
棋盘类的开发与设计
棋盘类除了完成绘制棋盘的作用,同时还负责下棋逻辑的处理。
完整代码如下:
package wyf.cgq;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
public class Server extends JFrame implements ActionListener
{
JLabel jlPort=new JLabel("端 口 号");//创建提示输入端口号标签
JTextField jtfPort=new JTextField("9999");//用于输入端口号的文本框
JButton jbStart=new JButton("启动");//创建"启动"按钮
JButton jbStop=new JButton("关闭");//创建"关闭"按钮
JPanel jps=new JPanel();//创建一个 JPanel 对象
JList jlUserOnline=new JList();//创建用于显示当前用户的 JList
JScrollPane jspx=new JScrollPane(jlUserOnline);// 将 显 示 当 前 用 户 的 JList 放 在
JScrollPane 中
JSplitPane jspz=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspx,jps);// 创 建
JSplitPane 对象
ServerSocket ss;//声明 ServerSocket 引用
ServerThread st;//声明 ServerThread 引用
Vector onlineList=new Vector();//创建存放当前在线用户的 Vector 对象
public Server()
{
this.initialComponent();//初始化控件
this.addListener();//为相应的控件注册事件监听器
this.initialFrame();//初始化窗体
}
public void initialComponent()
{
jps.setLayout(null);//设为空布局
jlPort.setBounds(20,20,50,20);
jps.add(jlPort);//添加用于提示输入端口号的标签
this.jtfPort.setBounds(85,20,60,20);
jps.add(this.jtfPort);//添加用于输入端口号的文本框
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);//将"关闭"按钮设为不可用
}
public void addListener()
{
this.jbStart.addActionListener(this);//为"开始"按钮注册事件监听器
this.jbStop.addActionListener(this);//为"关闭"按钮注册事件监听器
}
public void initialFrame()
{
this.setTitle("象棋--服务器端");//设置窗体标题
Image image=new ImageIcon("ico.gif").getImage();
this.setIconImage(image);
this.add(jspz);//将 JSplitPane 添加到窗体中
jspz.setDividerLocation(250);
jspz.setDividerSize(4);//设置分割线的位置和宽度
this.setBounds(20,20,420,320);
this.setVisible(true);//设置可见性
this.addWindowListener(//为窗体关闭事件注册监听器
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(st==null)//当服务器线程为空时直接退出
{
System.exit(0);//退出
return;
}
try
{
Vector v=onlineList;
int size=v.size();
for(int i=0;i<size;i++)
{
//当不为空时,向在线用户发送离线信息
ServerAgentThread tempSat=(ServerAgentThread)v.get(i);
tempSat.dout.writeUTF("<#SERVER_DOWN#>");
tempSat.flag=false;//终止服务器代理线程
}
st.flag=false;//终止服务器线程
st=null;
ss.close();//关闭 ServerSocket
v.clear();//将在线用户列表清空
refreshList();//刷新列表
}
catch(Exception ee)
{
ee.printStackTrace();
}
System.exit(0);//退出
}
}
);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==this.jbStart)
{//当单击"启动"按钮时
this.jbStart_event();
}
else if(e.getSource()==this.jbStop)
{//单击"关闭"按钮后
this.jbStop_event();
}
}
public void jbStart_event()
{
//单击"启动"按钮的业务处理代码
int port=0;
try
{
//获得用户输入的端口号,并转化为整型
port=Integer.parseInt(this.jtfPort.getText().trim());
}
catch(Exception ee)
{//端口号不是整数,给出提示信息
JOptionPane.showMessageDialog(this,"端口号只能是整数","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
if(port>65535||port<0)
{//断口号不合法,给出提示信息
JOptionPane.showMessageDialog(this,"端口号只能是 0-65535 的整数","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
try
{
剩余46页未读,继续阅读
资源评论
zzzzl333
- 粉丝: 674
- 资源: 7万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于 Java的班级管理系统课程设计
- 深入探索Suno AI:教程、元标签与案例分析.pdf
- 超市会员积分管理系统主要用于实现了企业管理数据统计等
- 基于 Java的班级管理系统
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功