logo资料库

JAVA课程设计-五子棋.doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
一、课程设计任务及要求
二、需求分析
2.1 棋盘板块
2.2 聊天板块
2.3 ChatSever
2.4 编译环境
2.5 参考资料
三、设计思路
3.1 板块的显示
3.2 注册监听
3.3 ChatServer
3.4 下棋
四、详细设计
4.1 WuZiQi类
4.2 ChatSever类
4.3多用户聊天
4.4 流程图
五、运行调试与分析讨论
六、设计体会与小结
七、参考文献
目 录 一、课程设计任务及要求................................................................... 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 页
分享到:
收藏