代码改变世界

实训二——博客二

2018-12-26 21:57  wxl!  阅读(161)  评论(0编辑  收藏  举报

团队作业所有同学的学号

16012118 黄硕(组长)

16012117 董琪

16012122 田朝阳

16012101 王雪莲

作业GIT的提交地址:https://gitee.com/tzy123/goldteamtraining_ii

 

团队编程的过程性照片:

 

 

 

 

团队分工,及每个团队成员的个人贡献分

姓名 团队分工 个人贡献分
黄硕  数据库连接  10

董琪

 

 修改代码  7

田朝阳

 

 写游戏界面代码  9

王雪莲

 

 修改代码  8

 

 

 

 

 

 

 

 

 

 

 

主要代码的功能解释:

//登录窗口
import javax.swing.*;
public class Client_Login extends JFrame{
    
    
    Client_Socket client; //Socket操作
    JLabel label1;        //标签 账号
    JLabel label2;        //标签 密码
    JButton button1;      //按钮 登陆
    JButton button2;      //按钮 注册
    JTextField text1;     //账号 文本框
    JTextField text2;     //密码 文本框
    Client_Login(){
        label1 = new JLabel("账号");          //标签初始化
        label2 = new JLabel("密码");
        text1 = new JTextField();            //文本框初始化
        text2 = new JTextField();
        button1 = new JButton("登陆");        //按钮初始化
        button2 = new JButton("注册");
        label1.setBounds(70, 30, 50, 25);    //标签位置,大小
        label2.setBounds(70, 60, 50, 25);
        text1.setBounds(120, 30, 160, 25);   //文本框位置,大小
        text2.setBounds(120, 60, 160, 25);
        button1.setBounds(75, 100, 80, 25);  //按钮位置,大小
        button2.setBounds(175, 100, 80, 25);
        setTitle("登录界面");         //设置窗口名称
        setSize(427,427);
          //设置窗口大小
        setLayout(null);             //布局为空布局
        setLocationRelativeTo(null); //窗口居中
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);  //设置窗口关闭方式(关闭当前窗口)
        add(label1);      //向窗口增加部件
        add(label2);
        add(text1);
        add(text2);
        add(button1);
        add(button2);
        setVisible(true); //设置窗口可见
        client = new Client_Socket(); //初始化Socket操作
        button1.addActionListener(new Client_Login_button1(this));
        button2.addActionListener(new Client_Login_button2());
       
       
    }
}

 

//注册窗口
import javax.swing.*;
public class Client_zc extends JFrame{
    JLabel label1;      //标签 账号
    JLabel label2;      //标签 密码
    JLabel label3;      //标签 确认密码
    JButton button1;    //按钮 注册
    JButton button2;    //按钮 返回
    JTextField text1;   //账号 文本框
    JTextField text2;   //密码 文本框
    JTextField text3;   //确认密码 文本框
    Client_zc(){
        label1 = new JLabel("账号");
        label2 = new JLabel("密码");
        label3 = new JLabel("确认密码");
        text1 = new JTextField();
        text2 = new JTextField();
        text3 = new JTextField();
        button1 = new JButton("注册");
        button2 = new JButton("返回");
        label1.setBounds(50, 30, 50, 25);
        label2.setBounds(50, 60, 50, 25);
        label3.setBounds(50, 90, 60, 25);
        text1.setBounds(120, 30, 160, 25);
        text2.setBounds(120, 60, 160, 25);
        text3.setBounds(120, 90, 160, 25);
        button1.setBounds(75, 150, 80, 25);
        button2.setBounds(175, 150, 80, 25);
        setTitle("注册界面");
        setSize(350, 240);
        setLayout(null);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        add(label1);
        add(label2);
        add(label3);
        add(text1);
        add(text2);
        add(text3);
        add(button1);
        add(button2);
        button1.addActionListener(new Client_zc_button1(this));
        button2.addActionListener(new AllWinClose_button(this));
        setVisible(true);
    }
}
//服务器信息窗口
import javax.swing.*;
public class Server_DataWin extends JFrame{
    static JTextArea area;        //文本区
    static JScrollPane js;        //滚动面板
    static Server_Match[] match;  //当前可用的游戏对局
    Server_Database mysql;        //数据库操作
    Server_Socket serverSocket;   //Socket操作
    Server_DataWin(){
        area = new JTextArea();           //初始化文本区
        area.setEditable(false);          //文本区不可编辑
        area.setBounds(30, 30, 300, 200); //文本框位置,大小
        js = new JScrollPane(area);       //将文本区添加到滚动面板中
        js.setBounds(30, 30, 300, 200);   //滚动面板位置,大小(必须与文本区一致)
        setTitle("服务器界面");            //设置窗口名称
        setSize(370, 400);                //设置窗口大小
        setLayout(null);                  //窗口布局为空
        setLocationRelativeTo(null);      //窗口居中
        setDefaultCloseOperation(EXIT_ON_CLOSE);  //设置窗口关闭方式(退出程序)
        add(js);                          //向窗口增加部件(滚动面板)
        setVisible(true);                 //设置窗口可见
        mysql = new Server_Database();    //初始化数据库操作
        
        serverSocket = new Server_Socket();       //初始化Socket操作
    }
}
//数据库操作
import java.sql.*;
public class Server_Database {
    Connection con;         //用于与数据库建立连接
    static Statement stmt;  //用于发送sql语句
    Server_Database(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");  //驱动信息
            String url = "jdbc:mysql:// 127.0.0.1:3306/game? useSSL=true&characterEncoding=gb2312&serverTimezone=GMT%2B8";
            //?之后是一些参数,不写的话很大几率报错
            con = DriverManager.getConnection(url, "root", "111111");
            stmt = con.createStatement();
            Server_DataWin.area.append("数据库连接成功!\n");
        }catch(Exception e) {
            Server_DataWin.area.append("数据库连接失败!");
        }
        String sql ="create table `玩家信息`"+
                "(`账号` char(20),`密码` char(10),`总场数` int,`总分数` int,`总胜利局数` int,"+
                "primary key(`账号`))";
        largeUpdata(sql);
    }
    static void largeUpdata(String s){  //用于创建表
        try {
            stmt.executeLargeUpdate(s);
        }catch(SQLException e) {}
    }
    static void update(String s) {      //用于更新数据
        try {
            stmt.executeUpdate(s);
        }catch(SQLException e) {}
    }
    static String queryOne(String s) {  //用于查询单一数据
        ResultSet rs = null;
        String s1 = "";
        try {
            rs = stmt.executeQuery(s);
            rs.next();
            s1 = rs.getString(1);
        }catch(Exception e) {}
        return s1;
    }
    
    static String query1(String s) {   //用于查询玩家信息
        ResultSet rs = null;
        String data = "";
        try {
            rs = stmt.executeQuery(s);
            rs.next();
            data = "总场数: "+rs.getString(1)+"\n";
            data = data+"总分数: "+rs.getString(2)+"\n";
            data = data+"赢数: "+rs.getString(3)+"\n";
        }catch(Exception e) {}
        return data;
    }
}

 

//输入玩家个数
import java.util.Scanner;

public class game {
    game(){
    
//输入玩家个数 游戏局数
     System.out.println("请输入大于10的游戏人数:");
     Scanner reader=new Scanner(System.in);  
     int N=reader.nextInt();
     System.out.println("游戏局数:");
     int b=reader.nextInt();
    

     
     
        Scanner scanner=new Scanner(System.in);
        double sum;
        double max,min;
        int maxzf=0;
        int minzf=0;
        int []zf=new int[100];   
        double []v=new double[100];
        int [][]grade=new int[100][100];
        
        
        for(int j=1;j<=b;j++)
        { 
            sum=0.0;
            max=0.0;
            System.out.println("第"+j+"轮游戏");
            for(int i=1;i<=N;i++)
            {
                System.out.print("请玩家"+i+"输入数字:");
                double num=scanner.nextDouble();//玩家给出数字
                while(num>=100||num<0){
                System.out.println("请重新输入");
                 num=scanner.nextDouble();
                }
                
                v[i]=num;
                sum=sum+num;//所有玩家的总分
            }
            double G=(sum/N)*0.618;//计算G值
            System.out.println("G="+G);
            min=Math.abs(v[1]-G);//MATH.ABS绝对值
 //跟G比较,最近最远
            for(int I=1;I<=N;I++)                         
            {
                if(Math.abs(v[I]-G)>=max)
                {
                    max=Math.abs(v[I]-G);
                }
            
                if(Math.abs(v[I]-G)<=min)
                {
                    min=Math.abs(v[I]-G);    
                }
                    
            }
//将得分放到适当的位置            
            for(int m=1;m<=N;m++)
            {
                if(Math.abs(v[m]-G)==max)
                {
                    grade[j][m]=-2;
                }
                else if(Math.abs(v[m]-G)==min)
                {
                    grade[j][m]=N;
                }
               else 
                {
                    grade[j][m]=0;
                }
                 System.out.println("第"+m+"名游戏玩家所得分数为:"+grade[j][m]);
            }
        }
        
        
        
//求总分    
        
        for(int p=1;p<=N;p++)
        {
            for(int q=1;q<=b;q++)
            {
                zf[p]=grade[q][p]+zf[p];
            }
            System.out.println("第"+p+"名玩家所得总分为:"+zf[p]);
        }
        
//求最大值最小值    
        for(int s=1;s<=N;s++)
        {
            if(zf[s]>=maxzf)
            {
                maxzf=zf[s];
            }
            if(zf[s]<=minzf)
            {
                minzf=zf[s];
            }
        }
//最大值最小值赋值输出        
        for(int t=1;t<=N;t++)
        {
            if(zf[t]==maxzf)
            {
                System.out.println("玩家"+t+"胜利!");
            }
            if(zf[t]==minzf)
            {
                System.out.println("玩家"+t+"失败!");
            }
        }
        
    }
}
//一个Socket对应一个玩家
import java.io.*;
import java.net.Socket;
public class Server_SocketToClient{
    Socket socket;
    DataInputStream in;
    DataOutputStream out;
    String user;
    String password;
    String sql;
    int isReady;    //是否准备,0没准备,1追备好了
    double num;     //每轮提交的数字
    int grade;      //对局的成绩
    Server_SocketToClient(Socket socket){
        isReady = 0;
        grade = 0;
        num = 0;
        this.socket = socket;
        try {
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            new Server_SocketToClient_Receive(this).start();
        }catch(Exception e) {}
    }
    void register(){
        try {
            user = in.readUTF();
            password = in.readUTF();
        }catch(Exception e) {}
        sql = "select `账号` from `玩家信息` where `账号`='"+user+"'";
        if(Server_Database.queryOne(sql).equals("")) {
            sql = "insert into `玩家信息` values('"+user+"','"+password+"',0,0,0)";
            Server_Database.update(sql);
            sql = "create table `"+user+"-战绩`"+
                    "(`日期` date,`时间` time,`场级` char(6),"+
                    "`人数` int,`排名` int,"+
                    "primary key(`日期`,时间))";
            Server_Database.largeUpdata(sql);
            try {
                out.writeUTF("注册成功");
            }catch(Exception e) {}
        }else {
            try {
                out.writeUTF("此账号已存在");
            }catch(Exception e) {}    
        }
    }
    void login() {
        try {
            user = in.readUTF();
            password = in.readUTF();
        }catch(Exception e) {}
        sql = "select `账号` from `玩家信息` where `账号`='"+user+"'";
        if(Server_Database.queryOne(sql).equals("")) {
            try {
                out.writeUTF("此用户不存在");
            }catch(Exception e) {}    
        }else {
            sql = "select `密码` from `玩家信息` where `账号`='"+user+"'";
            if(Server_Database.queryOne(sql).equals(password)) {
                try {
                    out.writeUTF("登陆成功");
                }catch(Exception e) {}           
            }else {
                try {
                    out.writeUTF("密码错误");
                }catch(Exception e) {}
            }
        }
    }
    void query() {
        String data = Server_Database.query1("select * from `"+user+"-战绩`");
        String data1 = Server_Database.query1("select `总场数`,`总分数`,`赢数` from `玩家信息` where `账号`='"+user+"'");
        try {
            out.writeUTF(data);
            out.writeUTF(data1);
        }catch(Exception e) {}
    }
}

团队作业的运行截图:

 

 

 

 

 

 

 

小结感受:

在本次团队合作中,遇到了很多问题,虽然游戏代码可以正确运行,但是出现了新的问题就是无法将各个部分正确的连接在一起,尤其是数据库

的链接,这个人问题困扰了我们很长时间,虽然我们经过修改找资料,仍就无法正确连接,在其他小组引导下。终于成功了!。在此过程中,收

获了很多。也学会了付出,和吸取他人意见。