目 录
一、课程设计任务及要求................................................................... 1
二、需求分析........................................................................................1
2.1 棋盘板块.................................................................................................. 1
2.2 聊天板块.................................................................................................. 1
2.3 ChatSever................................................................................................ 1
2.4 编译环境.................................................................................................. 1
2.5 参考资料.................................................................................................. 1
三、设计思路........................................................................................1
3.1 板块的显示.............................................................................................. 1
3.2 注册监听.................................................................................................. 2
3.3 ChatServer.............................................................................................. 2
3.4 下棋.......................................................................................................... 2
四、详细设计........................................................................................3
4.1 WuZiQi 类................................................................................................. 3
4.2 ChatSever 类........................................................................................... 4
4.3 多用户聊天............................................................................................... 5
4.4 流程图...................................................................................................... 6
五、运行调试与分析讨论................................................................... 7
六、设计体会与小结........................................................................... 9
七、参考文献......................................................................................10
华东交通大学课程设计报告
一、课程设计任务及要求
1、五子棋游戏室界面:用户可以选择对弈桌及角色(执黑、执白、旁观);
2、游戏界面:有开始、退出、悔棋、判断胜负;发言及显示区;用户列表
区;棋盘绘制区;
3、使用 Socket 来完成服务端和客户端的通信;
4、使用多线程技术支持多用户操作;
5、增强功能:支持用户注册、添加和删除好友、战绩显示、发送消息、接
受消息、多人聊天等功能;使用数据库保存用户信息。
二、需求分析
2.1 棋盘板块
画一个 15×15 的棋盘版面,及两个按钮组。初始化:开始、重置、
退出;角色选择:黑方、白方、旁观。
2.2 聊天板块
聊天信息显示区,聊天信息输入区。
2.3 ChatSever
模拟服务器:用于桥接不同用户,实现接收用户发出的信息,然后
将信息传递到每个用户的聊天窗口。
2.4 编译环境
Eclipse 实验室上机 在宿舍编写
2.5 参考资料
Java 语言使用教程,百度文库资料(五子棋判断胜负算法)。
三、设计思路
3.1 板块的显示
画棋盘
初始化
调用public void paint(Graphics g){QiPan(g);}方法
画一个15×15的棋盘面版。
定义两个 Panel P1、P2,在初始化板块将 JButton 开始、
重置,退出加入到 P1,将黑方、白方、旁观加入到 P2。
第 1 页
聊天板块 在初始化时定义一个JTextArea 和一个JTextField 实现聊
华东交通大学课程设计报告
天功能
3.2 注册监听
对角色选择按钮注册ActionListener监听,设置用户的角色。定义黑子
int类型 0,白子1。
对按钮开始、重置注册ActionListener监听,如果点击开始,用户进 入
下棋状态,有一方赢了,棋盘上则不能再点击棋子。点击重置,则开始新
的一轮。
对鼠标注册mouseClicked监听,鼠标点击棋盘时获取下棋的位置。
对JTextField注册ActionListener,用户输入聊天信息后,通过Server
传递给其他用户,在对话框JTextArea内显示。
3.3 ChatServer
class ServerThread implements Runnable{ }类监听线程,监听是否有客
户端法过信息来。
属性:
Vector threads 向量存储线程
Socket socket 服务端口
DataInputStream in 输入流
DataOutputStream out 输出流
int nid 用户ID
方法:
构造器public ServerThread(Socket socket,Vector threads)
实现信息的输入、输出
实现public void run()监听客户端是否发信息过来,当客户离开时向
其他客户发信息,把客户端的信息发给其他客户。
服务器向客户端发信息public void write(String msg)
获取线程IDpublic int getID()
设置线程IDpublic void setID(int nid)
在Chatserver类内调用ServerThread 实现对所有来访客户监听,为来
访者设置ID,若有离开用户,则在聊天板块广播。
3.4 下棋
用二维数组模拟棋盘 chessbody[17][17],黑方下棋,则黑方所下棋位
置的值等于旗子的颜色加一,白方类似。最后 1 代表下了黑棋,2 表示下了
白棋,0 表示没下棋。
从横向、纵向、斜方向判断胜负。下完一步判断一次,有一个方向上
同色棋子数超过 5,则胜负已判断。
第 2 页
华东交通大学课程设计报告
四、详细设计
4.1 WuZiQi 类
属性: int color_Qizi=0; 黑子0 白子1
int ChessBody[][]=new int[17][17];
无棋子 0,黑棋 1,白棋 2;
int GameStart=0;
JButton start,exit,rest;
JButton check[]=new JButton[3];
String chess[]={"黑方","白方","旁观"};
方法:
获取下棋位点
public void mouseClicked(MouseEvent e){
//Graphics g=getGraphics();
int x,y;
x=e.getX();y=e.getY();//鼠标点击位置
if(x<45||y<45||x>495||y>495)
{return;}//在棋盘之外则不下
if(x%30>15)//获取下棋点的位置
{x+=30;}
if(y%30>15)
{y+=30;}
x=x/30*30; //x、y为棋子中心位置
y=y/30*30;
PlayQizi(x,y);//下棋 }
下棋点击后天上棋子,每一步完了后判断胜负,从四个方向上判断
胜负,并在棋盘中间显示哪方赢了!
public void PlayQizi(int x,int y){
if (GameStart==0) //判断游戏未开始
{ return; }
if (ChessBody[x/30][y/30]!=0)
{return;}
Graphics g=getGraphics();
if (color_Qizi==1)//判断黑子还是白子
{g.setColor(Color.black);
color_Qizi=0;
}
else
{g.setColor(Color.white);
第 3 页
华东交通大学课程设计报告
color_Qizi=1;
}
g.fillOval(x-12,y-12,24,24);
ChessBody[x/30][y/30]=color_Qizi+1;
/////判断输赢//////////
g.setColor(Color.magenta);
g.setFont(new Font("fhahf ",Font.BOLD,30));
if(GameWin横(x/30,y/30)){
g.drawString(GetQiziColor(color_Qizi)+"赢了!",200,200);
GameStart=0;
}
if(GameWin竖(x/30,y/30)){
}
g.drawString(GetQiziColor(color_Qizi)+"赢了!",200,200);
GameStart=0;
if(GameWin撇(x/30,y/30)){
g.drawString(GetQiziColor(color_Qizi)+"赢了!",200,200);
GameStart=0;}
if(GameWin捺(x/30,y/30)){
g.drawString(GetQiziColor(color_Qizi)+"赢了!",200,200);
GameStart=0;}}
4.2 ChatSever 类
public void run(){
System.out.println ("Thread is running");
try{
//监听客户端是否发消息过来
while(true){
String receive = in.readUTF();
if(receive == null)
return;
//当某客户离开,给其它客户端发消息
if(receive.equals("leave")){
for(int i=0;i < threads.size();i++){
ServerThread st = (ServerThread)threads.elementAt(i);
st.write("***"+getID()+"leaving...***");
}
}else{
第 4 页
华东交通大学课程设计报告
//把某客户端发过来的发送到所有客户端
for(int i=0;i < threads.size();i++){
ServerThread st = (ServerThread)threads.elementAt(i);
st.write("<"+getID()+">: "+receive);}
4.3 多用户聊天
初始化网络,并连接到服务端
try {
//获得URL
URL url = this.getCodeBase();
InetAddress addr = InetAddress.getByName(url.getHost());
Socket socket;
System.out.println
("Server:
"+addr+"
"+url.getHost()+"
"+url.getProtocol());//5555 为服务器端口
socket = new Socket(addr,5555);
//由本套接口获得输入,输出流
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}catch (Exception ex) {ex.printStackTrace(); }
线程开始new Thread(this).start();
Run方法向服务器发送信息并接收信息
public void run() {
} }
}catch (Exception ex) {
}
public void stop() {
try {
out.writeUTF("leave");
}catch(Exception ex){}}
第 5 页
try {//监视服务器所发送的信息
while(true) {
String receive = in.readUTF();
if(receive!=null){
txtDisplay.append(receive + "\n");
//将光标移动到最后一个以实现滚动条的自动置底
txtDisplay.setCaretPosition(txtDisplay.getText().length());
txtDisplay.append("Network problem or Server down");
txtInput.setVisible(false);}
华东交通大学课程设计报告
用户 2
Server
用户 3
4.4 流程图
用户 1
用户 3
用户 5
图 4—1 网络通信
用户与服务器间的通信是双向的,用户将信息传递给 Server,Server 再
将信息传递给每个用户。
WuZiQi 类
Init()方法
Run()方法
Paint()方法
注册监听
图 4—2 WuZiQi 类的方法
棋盘继承 JApplet 类,注册监听,实现 Init()、Run()、Paint()方法、注
册监听。画棋盘,用二维数组模拟棋盘下子情况。对棋盘棋子的获取,判
断胜负。与 Server 连接,监听,获取来自服务器的信息。
第 6 页
华东交通大学课程设计报告
五、运行调试与分析讨论
图 5—1 棋盘
图 5—1 棋盘图,当选择好黑白角色后点击开始,便可以下棋;点击重
置时重新开始下棋;点击退出时结束游戏,并退出。 该棋盘未实现网络棋
盘,只能自己跟自己下棋。还欠缺悔棋步骤,可以用 Vector 存储已下的棋
子的信息,调用 repaiant() 然后再画除最后一步的棋盘,实现悔棋操作。由
于对 Socket 用法还不熟悉,不能将棋盘通信与聊天通信区分开来,也就不
能实现联网下棋。
第 7 页