homework-05 大家一起玩游戏~

046  195

1.接口设计

客户端 用户登录后,启动一个线程来进行游戏,等待服务器信息及发送新数据

服务器  开始时,主程序一直等待用户登录,有新用户登录就开一个线程去为其服务

           等到用户都登录完成,服务器开启一个游戏控制线程每隔1秒给全部用户发送一个“START” 信息,通知用户开始新的一轮开始,然后在0.5秒以后计算数据和分数,然后给全部用户发送这一轮结果。

服务器为每个用户都提供了一个服务线程,用于接收用户提交的数据

homework-05 大家一起玩游戏~_第1张图片

 

 

2.运行截图

3个用户  运行10轮

homework-05 大家一起玩游戏~_第2张图片

 

3.实现代码

 只在这里提供重要代码

  1 import java.net.ServerSocket;
  2 import java.net.Socket;
  3 import java.io.File;
  4 import java.io.InputStream;
  5 import java.io.InputStreamReader;
  6 import java.io.BufferedReader;
  7 import java.io.PrintWriter;
  8 import java.text.SimpleDateFormat;
  9 import java.util.ArrayList;
 10 import java.util.Date;
 11 import java.util.List;
 12 import java.util.Timer;
 13 import java.util.TimerTask;
 14 
 15 import javax.swing.JFrame;
 16 
 17 public  class ServerDemo extends JFrame{
 18     public static ArrayList<UserMessage> list=new ArrayList();
 19     public static int newGame = 0;
 20     public static boolean gameStart = true;
 21     public static double Gpoint = 0;
 22     public static double Sum = 0;
 23     public static int turns = 0;
 24     public static List <Double>G_List = new ArrayList<Double>();  
 25     public static ViewFrame vf;
 26     public static String getAllUsersList(){
 27         StringBuffer buffer=new StringBuffer("USER");
 28         for (int i = 0; i<list.size(); i++){
 29             UserMessage user=(UserMessage)list.get(i);
 30             buffer.append(":").append(user.getName());
 31         }
 32         return buffer.toString();
 33     }
 34     public static void sendAllUsersList(){
 35         PrintWriter pw=null;
 36         String listUsers=getAllUsersList();
 37     //    System.out.println (listUsers);
 38        for (int i = 0; i<list.size(); i++){
 39             UserMessage user=(UserMessage)list.get(i);
 40             if(user.getName().equals("admin"))
 41                 continue;
 42             try {
 43                 pw=new PrintWriter(user.getSocket().getOutputStream());
 44                 pw.println(listUsers);
 45                 pw.flush();
 46     
 47             }
 48             catch (Exception ex) {
 49             }
 50             
 51        }
 52     } 
 53     public static boolean addNewClient(UserMessage userNew){
 54         String name=userNew.getName();
 55         boolean flag=false;
 56         for (int i = 0; i<list.size(); i++){
 57             UserMessage user=(UserMessage)list.get(i);
 58                if((user.getName()).equals(name)){
 59                        flag=true;
 60                        break;
 61                }
 62         }
 63         if(!flag){
 64             list.add(userNew);
 65             //System.out.println (userNew.getName()+" 进入聊天室");
 66             return true;
 67         }
 68         else
 69             return false;
 70             
 71     }
 72     
 73     public static void sayToAllUsers(String msg){
 74         //System.out.println ("群聊");
 75         for (int i = 0; i<list.size(); i++){
 76             UserMessage user=(UserMessage)list.get(i);
 77             //System.out.println(user.getName());
 78             if(user.getName().equals("admin"))
 79                 continue;
 80             Socket sok=user.getSocket();
 81             sentMessageToClient(sok,msg);
 82         }
 83         
 84     }
 85     
 86     public static void sentMessageToClient(Socket sok,String msg){
 87         try {
 88             PrintWriter pw=new PrintWriter(sok.getOutputStream());
 89             pw.println(msg);
 90             pw.flush();
 91         }
 92         catch (Exception ex) {
 93         }
 94     }
 95     public static void addsubmit( double d){
 96         Sum += d;
 97         System.out.println("Sum "+ Sum + " "+ turns);
 98     }
 99     
100     public static void startGame(){
101         turns = 0;
102         Timer timer = new Timer();
103         TimerTask task = new TimerTask() {
104             public void run() {
105               if(newGame == 0){
106                 if(turns >= 10){
107                     this.cancel();
108                     System.out.println("end?!");
109                   }
110                   for (int i = 0; i<list.size(); i++){
111                     UserMessage user=(UserMessage)list.get(i);
112                     Socket sok=user.getSocket();
113                     sentMessageToClient(sok,"START");
114                     }
115                   newGame = 1;
116               }
117               
118               else {
119                       turns++;                 
120                       System.out.println("turns = "+turns);
121                       newGame = 0;
122                       
123                       //计算G点
124                       Gpoint = Sum/list.size()*0.618;
125                       System.out.println("Now Gpoint = "+Gpoint);
126                       
127                       //计算每个玩家分数  第一名加分  最后一面的减分
128                       double xxx = 10000,max = 0,min = 100000;
129                       int best=0,sb=0;
130                     for (int i = 0; i<list.size(); i++){
131                         UserMessage user=(UserMessage)list.get(i);
132                           xxx = Math.abs(user.submit -  Gpoint);
133                           System.out.println(user.getName()+" "+user.submit+"-"+Gpoint);
134                           if(xxx > max){
135                               sb =i;
136                               max = xxx;
137                           }
138                           if(xxx < min){
139                               best =i;
140                               min = xxx;
141                           }
142                     }
143                     UserMessage sbuser=(UserMessage)list.get(sb);
144                     UserMessage bestuser=(UserMessage)list.get(best);
145                     sbuser.score -= 1;
146                     bestuser.score += 10;
147                     
148                     StringBuffer buffer=new StringBuffer("");
149                     StringBuffer Ubuffer=new StringBuffer("用户        分数");
150                       for (int j = 0; j<list.size(); j++){
151                         UserMessage userx=(UserMessage)list.get(j);
152                         buffer.append(":"+userx.getName()+"    "+userx.score);
153                         Ubuffer.append("\n"+userx.getName()+"     "+userx.score);
154                       }
155                       
156                       for (int i = 0; i<list.size(); i++){
157                         UserMessage user=(UserMessage)list.get(i);
158                         Socket sok=user.getSocket();
159                         sentMessageToClient(sok,"GPOINT"+":"+turns+":"+Gpoint+buffer.toString());
160                     }
161                     String src=vf.JTextArea_mess.getText();
162                     if(src.equals("")){
163                         vf.JTextArea_mess.setText("第"+turns+"轮Gpoint是"+Gpoint);
164                     }else{
165                         vf.JTextArea_mess.setText(src+"\n"+"第"+turns+"轮Gpoint是"+Gpoint);
166                     }
167                     vf.JTextArea_user.setText(Ubuffer.toString());                    
168                     Gpoint = 0;
169                     Sum = 0;
170                     System.out.println("end turns = "+turns);
171               }
172             }
173           };
174           timer.schedule(task, 0, 500);
175     }
176     
177     public static void main (String[] args) {
178         ServerSocket server = null;
179         Socket socket = null;
180 
181 
182            vf = new ViewFrame();
183         vf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
184         vf.setSize(400,400);
185         vf.setVisible(true);
186         
187         try {
188             server=new ServerSocket(6000);
189             socket=new Socket();
190             System.out.println ("Server is beginning......");
191             while(gameStart){
192                 socket = server.accept();
193                 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
194                 String userMess = br.readLine();
195                 System.out.println(userMess);
196                 String[] mess = userMess.split(":");
197                 System.out.println(userMess);
198                 if(mess[0].equals("LOGIN")){
199                     File fl = new File("test.xls");
200                     Excel excel = new Excel(fl);
201                     System.out.println("some one enter");
202                     Date currentTime = new Date();
203                     SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
204                     String dateString = formatter.format(currentTime);
205                     
206                     //登录
207                     if(mess[3].equals(excel.getUserPassword(mess[1]))){
208                         UserMessage userNew=new UserMessage(mess[1],mess[2],socket);
209                         if(addNewClient(userNew)){
210                             PrintWriter pw=new PrintWriter(socket.getOutputStream());
211                             pw.println("NORMAL");
212                             pw.flush();
213                         
214                             ServerThread thread=new ServerThread(userNew);
215                             thread.start();
216                             System.out.println("电脑|" + dateString + "|登录成功|" + mess[1]);
217                         }
218                         else{
219                             PrintWriter pw=new PrintWriter(socket.getOutputStream());
220                             pw.println("ON");
221                             pw.flush();
222                             System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
223                         }
224                     }
225                     else{
226                         PrintWriter pw=new PrintWriter(socket.getOutputStream());
227                         pw.println("NO");
228                         pw.flush();
229                         System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
230                     }
231                 }
232             }    
233         }
234         catch (Exception ex) {
235         }
236     }
237 }
服务器主要部分

 

 

import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

class ClientThread extends Thread{
    private Socket socket;
    private ClientDemo client;
    public boolean flag = true;
    
    public ClientThread(Socket socket,ClientDemo client){
        this.socket=socket;
        this.client=client;        
    }
    public void run(){
        while(flag){
            try {
                BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg=br.readLine();
                String mess[]=msg.split(":");
                if(mess[0].equals("START")){
                    client.sendGpoint();
                }
                
                if(mess[0].equals("GPOINT")){
                    client.gpoint = Double.parseDouble(mess[1]);
                    StringBuffer buffer=new StringBuffer("第");
                    
                    buffer.append(mess[1]).append("轮").append("Gpoint是").append(mess[2]);
                    
                    String src=client.JTextArea_mess.getText();
                    if(src.equals("")){
                        client.JTextArea_mess.setText(buffer.toString());
                    }else{
                        client.JTextArea_mess.setText(src+"\n"+buffer.toString());
                    }
                    StringBuffer ubuffer=new StringBuffer("用户      分数 \n");
                    for(int i=3; i<mess.length; i++)    
                        ubuffer.append(mess[i]+"\n");        
                    client.JTextArea_user.setText(ubuffer.toString());
                }

                
                if(mess[0].equals("STATE")){
                    StringBuffer buffer2 = new StringBuffer(mess[2]);
                    if(mess[1].equals("UP")){
                        buffer2.append(" 上线了 @" + mess[3] + ":" + mess[4] + ":" + mess[5]);
                        if(mess[6].equals("M"))
                            buffer2.append("  [手机]");
                    }
                    else{
                        buffer2.append(" 下线了 @" + mess[3] + ":" + mess[4] + ":" + mess[5]);
                        if(mess[6].equals("M"))
                            buffer2.append("  [手机]");
                    }
                    
                    String src=client.JTextArea_mess.getText();
                    if(src.equals("")){
                        client.JTextArea_mess.setText(buffer2.toString());
                    }
                    else{
                        client.JTextArea_mess.append("\n"+buffer2.toString());
                        Point p= new Point(0,client.JTextArea_mess.getLineCount()*20);
                        client.JScrollPane_mess.getViewport().setViewPosition(p);
                    }
                }
            }
            catch (Exception ex) {
            }
        
        }
    }
}
用户线程(主要)

 

 

4.感想

这一个终于有了小伙伴,有小伙伴一起编程效率高了许多~

 

 

Personal Software Process Stages

原来估计的时间 (分钟)

实际花费的时间 (分钟)

 

Planning

计划

20 30  

·         Estimate

· 估计这个任务需要多少时间,把工作细化并大致排序

20 30  

Development

开发

60 90  

·         Analysis

· 需求分析 (包括学习新技术)

10 15  

·         Design Spec

· 生成设计文档

0 0  

·         Design Review

· 设计复审 (和同事审核设计文档)

0 0  

·         Coding Standard

· 代码规范 (制定合适的规范)

0 0  

·         Design

· 具体设计

5 7.5  

·         Coding

· 具体编码

20 30  

·         Code Review

· 代码复审

5 7.5  

·         Test

· 测试(自我测试,修改代码,提交修改)

20 30  

Reporting

总结报告

20 30  

· Test Report

· 测试报告

10 15  

· Size Measurement

· 计算工作量

5 7.5  

· Postmortem & Improvement Plan

· 事后总结, 并提出改进

5 7.5  

Total

总计

总估计的用时

总用时

 

你可能感兴趣的:(home)