046  195

1.接口设计

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

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

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

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

2.运行截图

3个用户  运行10轮

3.实现代码

只在这里提供重要代码

 import java.net.ServerSocket;
import java.net.Socket;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask; import javax.swing.JFrame; public class ServerDemo extends JFrame{
public static ArrayList<UserMessage> list=new ArrayList();
public static int newGame = 0;
public static boolean gameStart = true;
public static double Gpoint = 0;
public static double Sum = 0;
public static int turns = 0;
public static List <Double>G_List = new ArrayList<Double>();
public static ViewFrame vf;
public static String getAllUsersList(){
StringBuffer buffer=new StringBuffer("USER");
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
buffer.append(":").append(user.getName());
}
return buffer.toString();
}
public static void sendAllUsersList(){
PrintWriter pw=null;
String listUsers=getAllUsersList();
// System.out.println (listUsers);
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
if(user.getName().equals("admin"))
continue;
try {
pw=new PrintWriter(user.getSocket().getOutputStream());
pw.println(listUsers);
pw.flush(); }
catch (Exception ex) {
} }
}
public static boolean addNewClient(UserMessage userNew){
String name=userNew.getName();
boolean flag=false;
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
if((user.getName()).equals(name)){
flag=true;
break;
}
}
if(!flag){
list.add(userNew);
//System.out.println (userNew.getName()+" 进入聊天室");
return true;
}
else
return false; } public static void sayToAllUsers(String msg){
//System.out.println ("群聊");
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
//System.out.println(user.getName());
if(user.getName().equals("admin"))
continue;
Socket sok=user.getSocket();
sentMessageToClient(sok,msg);
} } public static void sentMessageToClient(Socket sok,String msg){
try {
PrintWriter pw=new PrintWriter(sok.getOutputStream());
pw.println(msg);
pw.flush();
}
catch (Exception ex) {
}
}
public static void addsubmit( double d){
Sum += d;
System.out.println("Sum "+ Sum + " "+ turns);
} public static void startGame(){
turns = 0;
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
if(newGame == 0){
if(turns >= 10){
this.cancel();
System.out.println("end?!");
}
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
Socket sok=user.getSocket();
sentMessageToClient(sok,"START");
}
newGame = 1;
} else {
turns++;
System.out.println("turns = "+turns);
newGame = 0; //计算G点
Gpoint = Sum/list.size()*0.618;
System.out.println("Now Gpoint = "+Gpoint); //计算每个玩家分数 第一名加分 最后一面的减分
double xxx = 10000,max = 0,min = 100000;
int best=0,sb=0;
for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
xxx = Math.abs(user.submit - Gpoint);
System.out.println(user.getName()+" "+user.submit+"-"+Gpoint);
if(xxx > max){
sb =i;
max = xxx;
}
if(xxx < min){
best =i;
min = xxx;
}
}
UserMessage sbuser=(UserMessage)list.get(sb);
UserMessage bestuser=(UserMessage)list.get(best);
sbuser.score -= 1;
bestuser.score += 10; StringBuffer buffer=new StringBuffer("");
StringBuffer Ubuffer=new StringBuffer("用户 分数");
for (int j = 0; j<list.size(); j++){
UserMessage userx=(UserMessage)list.get(j);
buffer.append(":"+userx.getName()+" "+userx.score);
Ubuffer.append("\n"+userx.getName()+" "+userx.score);
} for (int i = 0; i<list.size(); i++){
UserMessage user=(UserMessage)list.get(i);
Socket sok=user.getSocket();
sentMessageToClient(sok,"GPOINT"+":"+turns+":"+Gpoint+buffer.toString());
}
String src=vf.JTextArea_mess.getText();
if(src.equals("")){
vf.JTextArea_mess.setText("第"+turns+"轮Gpoint是"+Gpoint);
}else{
vf.JTextArea_mess.setText(src+"\n"+"第"+turns+"轮Gpoint是"+Gpoint);
}
vf.JTextArea_user.setText(Ubuffer.toString());
Gpoint = 0;
Sum = 0;
System.out.println("end turns = "+turns);
}
}
};
timer.schedule(task, 0, 500);
} public static void main (String[] args) {
ServerSocket server = null;
Socket socket = null; vf = new ViewFrame();
vf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vf.setSize(400,400);
vf.setVisible(true); try {
server=new ServerSocket(6000);
socket=new Socket();
System.out.println ("Server is beginning......");
while(gameStart){
socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String userMess = br.readLine();
System.out.println(userMess);
String[] mess = userMess.split(":");
System.out.println(userMess);
if(mess[0].equals("LOGIN")){
File fl = new File("test.xls");
Excel excel = new Excel(fl);
System.out.println("some one enter");
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String dateString = formatter.format(currentTime); //登录
if(mess[3].equals(excel.getUserPassword(mess[1]))){
UserMessage userNew=new UserMessage(mess[1],mess[2],socket);
if(addNewClient(userNew)){
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.println("NORMAL");
pw.flush(); ServerThread thread=new ServerThread(userNew);
thread.start();
System.out.println("电脑|" + dateString + "|登录成功|" + mess[1]);
}
else{
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.println("ON");
pw.flush();
System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
}
}
else{
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.println("NO");
pw.flush();
System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
}
}
}
}
catch (Exception ex) {
}
}
}

服务器主要部分

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

总计

总估计的用时

总用时

homework-05 大家一起玩游戏~的更多相关文章

  1. 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏

    本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...

  2. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  3. 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

    小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...

  4. cdoj 1136 邱老师玩游戏 树形背包

    邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...

  5. win7系统玩游戏不能全屏的解决办法

    1.修改注册表中的显示器的参数设置   Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置:   HKEY_LOCAL_MACHINE\SYSTEM\ ...

  6. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备

    背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...

  7. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  8. 【特殊的图+DP】【11月校赛】大家一起玩游戏

    大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  9. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  10. Luogu P4705 玩游戏

    题目描述 Alice 和 Bob 又在玩游戏. 对于一次游戏,首先 Alice 获得一个长度为 ​ 的序列 ​,Bob 获得一个长度为 ​ 的序列 bb.之后他们各从自己的序列里随机取出一个数,分别设 ...

随机推荐

  1. iOS开发中view controller设置问题

  2. 深入理解ASP.NET的内部运行机制(转)

    WebForms和WebServices作为.NET平台构建Web程序的两大利器,以其开发简单.易于部署的特点得到了广泛的应用,但殊不知微软公司在背后为我们做了大量的基础性工作,以至于我们开发人员只需 ...

  3. 再论App的安全性

    现代人早已脱离不了智能手机,几乎人手一机,常见人边走边滑,着实危险.大家用手机App购物,用网银App付费,用股票App下单炒股,太方便了所以成了家常便饭. 没错,就是因为太方便,所以大多只会留意好不 ...

  4. aspx网页相对布局

    网页的布局 <body bgcolor="#b6b7bc"> <form id="form1" runat="server" ...

  5. [原]Hrbust1053 Warcraft III (完全背包)

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProbl ...

  6. 实现QQ机器人报警

    如题,废话不说,直接上代码.首先是登录QQ的小脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  7. 一,U盘安装 CentOS 6.5 minimal

    U盘安装盘: CentOS-6.5的版本有四个,分别是: 1.CentOS-6.5-i386-netinstall.iso 通过网络安装的,需要联网 2.CentOS-6.5-i386-minimal ...

  8. 【转】代码编辑器(一)-TSynCompletionProposal用法

    注意,本系列均转载自http://blog.163.com/zom1995@126/ 网上有人给我一个SynEdit这个东西,因为我很喜欢自己编个代码编辑器,但要是用Delphi直接弄的,就我现在这样 ...

  9. 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件

    编译错误              说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码.             编译器错误消息: CS0016: 未 ...

  10. Python学习教程(learning Python)--2.3.4Python函数返回值

    本节讨论Python函数返回值问题. Python和C语言一样,也可以在函数结束时返回一个值.但在定义自己的Python函数时,是不需要指定返回值数据类型的,这和Python不关心变量的数据类型是一致 ...