homework-05 大家一起玩游戏~
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 大家一起玩游戏~的更多相关文章
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- cdoj 1136 邱老师玩游戏 树形背包
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 【特殊的图+DP】【11月校赛】大家一起玩游戏
大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- Luogu P4705 玩游戏
题目描述 Alice 和 Bob 又在玩游戏. 对于一次游戏,首先 Alice 获得一个长度为 的序列 ,Bob 获得一个长度为 的序列 bb.之后他们各从自己的序列里随机取出一个数,分别设 ...
随机推荐
- sqlplus sys/system@'(description=(address_list=(address=(protocol=tcp)(host=192.168.11.199)(port=1521)))(connect_data=(service_name=byRuiy)))' as sysdba
- docker容器服务器 - centos atomic host
https://blog.inovex.de/docker-a-comparison-of-minimalistic-operating-systems https://github.com/rvyk ...
- WP8_区分滑动和点击(在图片列表中)
在windows phone中,对于一个页面中 有图片列表的,滑动的时候,很容易被误认为是点击了图片,而打开图片详细信息等,原意是滑动列表,由此对图片添加2个事件,来控制其点击行为(滑动的时候,基本不 ...
- Git 中级用户的25个提示
我使用 Git 大约已经有18个月时间,自认为能很好地驾驭它了.但是当我们请到 GitHub 的 Scott Chacon 来到 LVS 公司(一个博彩/游戏软件供应商/开发商)做专场培训时,我在第一 ...
- 利用JSONP进行水坑攻击
0x00 简介 前几天安全研究者Jaime Blasco发现了在中国某些特定主题的网站被进行了水坑攻击,攻击方法有一定多样性,其中存在一些比较少见于此类型攻击中的技术,不过其实是比较早的技术了,国内猥 ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
- linux中sudoers别名规则
/etc/sudoers 配置文档中别名规则 别名规则定义格式如下: Alias_Type NAME = item1, item2, ... 或 Alias_Type NAME = item1, it ...
- 软件工程 speedsnail 第二次冲刺5
20150522 完成任务:蜗牛帧数变化已经实现,行走的蜗牛具有了动态的视觉效果: 遇到问题: 问题1 帧数大小根据人眼来设置 解决1 除29余0到14的为第一帧 明日任务: 蜗牛碰撞身体翻转
- div左右布局
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html> <head> ...
- nginx安装 nginx: [emerg] getpwnam(“www”) failed 错误
inux 64系统中安装nginx1.3时如果出现错误:nginx: [emerg] getpwnam(“www”) failed解决方法1: 在nginx.conf中 把user nobo ...