设计说明书.docx
- 文档编号:9695121
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:24
- 大小:108.17KB
设计说明书.docx
《设计说明书.docx》由会员分享,可在线阅读,更多相关《设计说明书.docx(24页珍藏版)》请在冰点文库上搜索。
设计说明书
目 录
摘要1
一、课程设计任务及要求2
二、需求分析2
2.1棋盘板块2
2.2聊天板块2
2.3ChatSever2
2.4编译环境2
2.5参考资料2
三、设计思路2
3.1板块的显示2
3.2注册监听3
3.3ChatServer3
3.4下棋3
四、详细设计4
4.1WuZiQi类5
4.2ChatSever类5
4.3多用户聊天6
4.4流程图7
五、运行调试与分析讨论8
六、设计体会与小结10
七、参考文献11
附录11
摘要
五子棋源于中国。
我的这个棋盘是15×15棋盘,横行、竖行都有15个交点,在交点处黑白棋子对弈。
在横,竖,斜四个方向若有一方连续超过5个则该方胜利。
完成棋盘面板画棋盘,对鼠标注册监听扑捉下棋位,画上棋子。
根据下棋位点,将棋子布局模拟成二位数组,对数组进行遍历,判断胜负。
棋盘还附加了聊天功能,开启次程序后,便在ChatServer内申请账号,实现与其他户的群聊,采用了多线程技术和Socket实现通信。
一、课程设计任务及要求
1、五子棋游戏室界面:
用户可以选择对弈桌及角色(执黑、执白、旁观);
2、游戏界面:
有开始、退出、悔棋、判断胜负;发言及显示区;用户列表
区;棋盘绘制区;
3、使用Socket来完成服务端和客户端的通信;
4、使用多线程技术支持多用户操作;
5、增强功能:
支持用户注册、添加和删除好友、战绩显示、发送消息、接
受消息、多人聊天等功能;使用数据库保存用户信息。
二、需求分析
2.1棋盘板块
画一个15×15的棋盘版面,及两个按钮组。
初始化:
开始、重置、
退出;角色选择:
黑方、白方、旁观。
2.2聊天板块
聊天信息显示区,聊天信息输入区。
2.3ChatSever
模拟服务器:
用于桥接不同用户,实现接收用户发出的信息,然后
将信息传递到每个用户的聊天窗口。
2.4编译环境
Eclipse实验室上机在宿舍编写
2.5参考资料
Java语言使用教程,XX文库资料(五子棋判断胜负算法)。
三、设计思路
3.1板块的显示
画棋盘调用publicvoidpaint(Graphicsg){QiPan(g);}方法
画一个15×15的棋盘面版。
初始化定义两个PanelP1、P2,在初始化板块将JButton开始、
重置,退出加入到P1,将黑方、白方、旁观加入到P2。
聊天板块在初始化时定义一个JTextArea和一个JTextField实现聊
天功能
3.2注册监听
对角色选择按钮注册ActionListener监听,设置用户的角色。
定义黑子int类型0,白子1。
对按钮开始、重置注册ActionListener监听,如果点击开始,用户进入下棋状态,有一方赢了,棋盘上则不能再点击棋子。
点击重置,则开始新的一轮。
对鼠标注册mouseClicked监听,鼠标点击棋盘时获取下棋的位置。
对JTextField注册ActionListener,用户输入聊天信息后,通过Server传递给其他用户,在对话框JTextArea内显示。
3.3ChatServer
classServerThreadimplementsRunnable{}类监听线程,监听是否有客户端法过信息来。
属性:
Vectorthreads向量存储线程
Socketsocket服务端口
DataInputStreamin输入流
DataOutputStreamout输出流
intnid用户ID
方法:
构造器publicServerThread(Socketsocket,Vectorthreads)
实现信息的输入、输出
实现publicvoidrun()监听客户端是否发信息过来,当客户离开时向
其他客户发信息,把客户端的信息发给其他客户。
服务器向客户端发信息publicvoidwrite(Stringmsg)
获取线程IDpublicintgetID()
设置线程IDpublicvoidsetID(intnid)
在Chatserver类内调用ServerThread实现对所有来访客户监听,为来访者设置ID,若有离开用户,则在聊天板块广播。
3.4下棋
用二维数组模拟棋盘chessbody[17][17],黑方下棋,则黑方所下棋位置的值等于旗子的颜色加一,白方类似。
最后1代表下了黑棋,2表示下了白棋,0表示没下棋。
从横向、纵向、斜方向判断胜负。
下完一步判断一次,有一个方向上同色棋子数超过5,则胜负已判断。
四、详细设计
4.1WuZiQi类
属性:
intcolor_Qizi=0;黑子0白子1
intChessBody[][]=newint[17][17];
无棋子0,黑棋1,白棋2;
intGameStart=0;
JButtonstart,exit,rest;
JButtoncheck[]=newJButton[3];
Stringchess[]={"黑方","白方","旁观"};
方法:
获取下棋位点
publicvoidmouseClicked(MouseEvente){
//Graphicsg=getGraphics();
intx,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);//下棋}
下棋点击后天上棋子,每一步完了后判断胜负,从四个方向上判断
胜负,并在棋盘中间显示哪方赢了!
publicvoidPlayQizi(intx,inty){
if(GameStart==0)//判断游戏未开始
{return;}
if(ChessBody[x/30][y/30]!
=0)
{return;}
Graphicsg=getGraphics();
if(color_Qizi==1)//判断黑子还是白子
{g.setColor(Color.black);
color_Qizi=0;
}
else{g.setColor(Color.white);
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(newFont("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.2ChatSever类
publicvoidrun(){
System.out.println("Threadisrunning");
try{
//监听客户端是否发消息过来
while(true){
Stringreceive=in.readUTF();
if(receive==null)
return;
//当某客户离开,给其它客户端发消息
if(receive.equals("leave")){
for(inti=0;i ServerThreadst=(ServerThread)threads.elementAt(i); st.write("***"+getID()+"leaving...***"); } }else{ //把某客户端发过来的发送到所有客户端 for(inti=0;i ServerThreadst=(ServerThread)threads.elementAt(i); st.write("<"+getID()+">: "+receive);} 4.3多用户聊天 初始化网络,并连接到服务端 try{ //获得URL URLurl=this.getCodeBase(); InetAddressaddr=InetAddress.getByName(url.getHost()); Socketsocket; System.out.println("Server: "+addr+""+url.getHost()+""+url.getProtocol());//5555为服务器端口 socket=newSocket(addr,5555); //由本套接口获得输入,输出流 in=newDataInputStream(socket.getInputStream()); out=newDataOutputStream(socket.getOutputStream()); }catch(Exceptionex){ex.printStackTrace();} 线程开始newThread(this).start(); Run方法向服务器发送信息并接收信息 publicvoidrun(){ try{//监视服务器所发送的信息 while(true){ Stringreceive=in.readUTF(); if(receive! =null){ txtDisplay.append(receive+"\n"); //将光标移动到最后一个以实现滚动条的自动置底 txtDisplay.setCaretPosition(txtDisplay.getText().length()); }} }catch(Exceptionex){ txtDisplay.append("NetworkproblemorServerdown"); txtInput.setVisible(false);} } publicvoidstop(){ try{ out.writeUTF("leave"); }catch(Exceptionex){}} 4.4流程图 图4—1网络通信 用户与服务器间的通信是双向的,用户将信息传递给Server,Server再将信息传递给每个用户。 图4—2WuZiQi类的方法 棋盘继承JApplet类,注册监听,实现Init()、Run()、Paint()方法、注册监听。 画棋盘,用二维数组模拟棋盘下子情况。 对棋盘棋子的获取,判断胜负。 与Server连接,监听,获取来自服务器的信息。 五、运行调试与分析讨论 图5—1棋盘 图5—1棋盘图,当选择好黑白角色后点击开始,便可以下棋;点击重置时重新开始下棋;点击退出时结束游戏,并退出。 该棋盘未实现网络棋盘,只能自己跟自己下棋。 还欠缺悔棋步骤,可以用Vector存储已下的棋子的信息,调用repaiant()然后再画除最后一步的棋盘,实现悔棋操作。 由于对Socket用法还不熟悉,不能将棋盘通信与聊天通信区分开来,也就不能实现联网下棋。 图5—2ChatServer 如果用户登录则监听listening......、acceptaclient使用了Socket,和多线程技术。 定义了Vector存储用户线程,实现ChatServer将信息传递给每个用户,接收每个用户的信息。 图5—3聊天对话框 用户4、5进入了聊天,对话。 当对话框缩小或关闭时ChatServer都会发出用户离开的消息。 此对话框可以允许多个用户群聊,但是少了一个窗口显示所有在线用户信息。 即要求五,增强功能未实现。 不能实现用户注册,添加好友,查看好有信息,对于数据库的使用不太熟悉。 六、设计体会与小结 经过为期一周的课程设计,感觉自己所学远远不能解决做课设时的需求。 在熟悉课本和上网搜索后,才算马马虎虎的完成了任务。 在画棋盘时,调用draw方法对于画图这块的坐标布置,在今后学画其他图画时能够得心应手。 获取棋子方法的巧妙,注册鼠标,获取点击位置,除以棋盘间隔,去掉不为整数的一块,再乘以棋盘间隔便获得最临近点的下棋坐标,即所要下棋的位置。 用二维数组模拟棋盘,无棋子的置为0,黑子置为1,白子置为2,以便在判断胜负时利于同色棋子的查找。 整个棋盘就模拟出来了,很巧妙,不过有更好的方法用向量存储棋子信息,便于悔棋等操作。 实现多用户聊天,老师后面讲的不是很多,做起来有点费力。 参考网上资料,明白Socket原理。 开始时照着课本上的例子,不能得出想要的效果,而且只运行了一个程序看不到有通信的效果。 后面在运行了Server类后,自己尝试着两个Client类,实现了通话,就像腾讯QQ里面一样的效果。 里面定义了Vector线程,实现了多线程用法。 两个板块大体实现,但是后面的要求五,由于数据库的使用不是太熟悉,不能注册用户,添加好友,查找好友,还有悔棋操作未能实现。 此程序最大的缺点还在于,不能实现网络两人下五子棋。 由于不能将棋盘信息与聊天信息区分,不能告诉对反自己下了哪一步,所以根据自己的水平也就能做到这了,今后加以完善。 感觉这次课设有点失败,平时学的不能灵活的运用,今后得多加练习,多点锻炼的机会,积累跟多的知识。 还有算法这块,解决一个问题的关键,培养一个好的类的思想,将问题有条有理的理清。 形成一个清晰的思路后,在动手,下笔如有神。 七、参考文献 [1]丁振凡.Java语言实用教程(第2版)[M].北京邮电大学出版社.2008.1 [2]丁振凡.Java语言实用教程实验指导(第2版)[M].北京邮电大学出版社.2008.1 [3]杨树林等.Java语言最新实用案例教程(第2版)[M].清华大学出版社.2010.7 附录 package五子棋; importjava.applet.*; importjava.awt.*; importjava.awt.event.*; importjava.applet.Applet; importjava.awt.Color; importjava.io.*; import.*; importjavax.swing.*; publicclassWuZiQiextendsJAppletimplementsActionListener MouseListener,MouseMotionListener,ItemListener,Runnable{ intcolor_Qizi=0;//黑子0白子1 intChessBody[][]=newint[17][17];//无棋子0,黑棋1,白棋2; intGameStart=0; JButtonstart,exit,rest; JButtoncheck[]=newJButton[3]; Stringchess[]={"黑方","白方","旁观"}; JTextAreatxtDisplay; JTextFieldtxtInput; DataInputStreamin; DataOutputStreamout; publicvoidinit(){ setLayout(null);start=newJButton("开始");rest=newJButton("重置");exit=newJButton("退出"); Panelp1=newPanel(); p1.add(start);p1.add(rest); p1.add(exit); add(p1);p1.setBounds(130,510,300,50); Panelp2=newPanel(); for(inti=0;i p2.add(check[i]);} add(p2);p2.setBounds(600,50,200,50); for(inti=0;i {check[i].addActionListener(this);} start.addActionListener(this); exit.addActionListener(this); rest.addActionListener(this); addMouseListener(this); txtDisplay=newJTextArea(10,50); txtDisplay.setEditable(false); txtInput=newJTextField(10); Panelchat=newPanel(); chat.setLayout(newBorderLayout()); chat.add(BorderLayout.CENTER,newJScrollPane(txtDisplay)); chat.add(BorderLayout.SOUTH,txtInput); add(chat);chat.setBounds(900,300,350,300); txtInput.addActionListener(//对输入文本框地方注册事件监听 newActionListener(){ publicvoidactionPerformed(ActionEventevent){ Stringstr=txtInput.getText(); txtInput.setText(""); try{ out.writeUTF(str); }catch(Exceptione){}} }); in=null;out=null; 初始化网络,并连接到服务端 try{//获得URL URLurl=this.getCodeBase; InetAddressaddr=InetAddress.getByName(url.getHost()); Socketsocket; System.out.println("Server: "+addr+""+url.getHost()+""+url.getProtocol()); //5555为服务器端口 socket=newSocket(addr,5555);//由本套接口获得输入,输出流 in=newDataInputStream(socket.getInputStream()); out=newDataOutputStream(socket.getOutputStream()); }catch(Exceptionex){ex.printStackTrace(); } newThread(this).start();//线程开始 } publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==start){ GameStart();} if(e.getSource()==rest){ GameReSt();} if(e.getSource()==exit){ GameEnd(); if(e.getSource()==check[0])color_Qizi=0; }publicvoidmousePressed(MouseEvente){}publicvoidmouseClicked(MouseEvente){//获取下棋位点intx,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;y=y/30*30;PlayQizi(x,y);//下棋 }publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseDragged(MouseEvente){}publicvoidmouseMoved(MouseEvente){}publicvoidpaint(Graphicsg){ QiPan(g); }publicvoidPlayQizi(intx,inty){if(GameStart==0)//判断游戏未开始{return;} if(ChessBody[x/30][y/30]! =0){return;}Graphicsg=getGraphics(); if(color_Qizi==1)//判断黑子还是白子{g.setColor(Color.black);color_Qizi=0;} else{g.setColor(Color.white);color_Qizi=1; } g.fillOval(x-12,y-12,24,24); ChessBody[x/30][y/30]=color_Qizi+1; ///判断输赢//////g.setColor(Color.m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 说明书