黄金点第二次博客

本周成果:在 idea 集成开发环境用 java 语言写出了初步的 UI 界面。

 

一. 目前实现的功能有:

  • 实现用户相关信息的输入(玩家可以手动输入自己的名字、年龄等信息,在游戏过程中更方便区分)
  • 每一轮结束后都可以查看当前轮的分数以及可以选看历史分数。
  • 游戏结束后可以查看每个人的游戏总得分。

 

二. 开发过程中遇到了一些 bug,目前正在解决:

  • 如果在输入每轮分数时,不在输入框里输入数据而直接计算结果,程序会强制退出。
  • 查看历史成绩的框体会保留每一次查询的记录以及对应的时点数据,界面不够美观简洁。

 

三. 项目未来的方向:

  • 在每次玩家输入分数时,将输入框实时输入的数字以 “*” 代替来防止其他玩家偷看从而确保游戏公平性。
  • 修复若干 bug ;
  • 适当美化界面;
  • 加入其它机制以丰富游戏内容。

 

四. 下面是分模块的代码展示:

  1. 玩家类

     1 package homework;
     2 
     3 public class Player {
     4     private String player_name;  // 姓名
     5     private  int player_score;  // 分数
     6     // 构造函数
     7     public Player(String name,int score){
     8         super();
     9         this.player_name=name;
    10         this.player_score=score;
    11     }
    12     // 获取玩家姓名
    13     public String getPlayer_name() {
    14         return player_name;
    15     }
    16     // 设置玩家姓名
    17     public void setPlayer_name(String player_name) {
    18        this.player_name = player_name;
    19     }
    20     // 获取玩家历史总分数
    21     public  int getPlayer_score() {
    22         return player_score;
    23     }
    24     // 设置玩家分数(单轮)
    25     public void setPlayer_score(int player_score) {
    26         this.player_score = player_score;
    27     }
    28 }

     

  2.  游戏流程类(包含游戏进行、展示历史成绩等的方法)

      1 package homework;
      2 
      3 import java.util.Scanner;
      4 
      5 // 游戏流程类
      6 public class Work {
      7     public static int player_num;  // 玩家个数
      8     public static int round_num;  // 游戏总轮数
      9     public static int now_round_num=1;  // 当前所在轮数
     10     public static double now_result=0; // 本轮结果
     11     public static int[] point_choice;  // 玩家所选分数
     12     public static double[] now_distance;  // 当前离黄金点的距离
     13     public static int[][] history_score;  // 历史分数,history_score[i][j]代表第 i 位玩家在第 j 轮的分数
     14     public static Player[] players;  // 玩家数组
     15 
     16     public static void main(String[] args) {
     17         Gaming();  // 游戏开始
     18         ShowResult();  // 展示结果
     19         return;
     20     }
     21     // 查看历史分数(支持每轮都查看,每轮更新)
     22     public static  void ShowHistory(){
     23         for (;;){
     24             System.out.println("是否查看每轮历史记录?Y/N");
     25             Scanner in=new Scanner(System.in);
     26             String choice;
     27             choice=in.nextLine();
     28             if(choice.equals("Y") || choice.equals("y")){
     29                 System.out.print("您想查看第几轮的成绩?输入数字则查看指定轮成绩,输入 0 则查看全部历史成绩:");
     30                 int tempNum;
     31                 Scanner in1=new Scanner(System.in);
     32                 tempNum=in.nextInt();
     33                 if(tempNum == 0){
     34                     for(int i = 0; i < history_score.length; i++){
     35                         System.out.println("第"+(i+1)+"轮的成绩是:");
     36                         for(int j = 0; j < player_num; j++){
     37                             System.out.println(players[i].getPlayer_name()+":"+history_score[i][j]);
     38                         }
     39                     }
     40                 }
     41                 else if (tempNum >= 1 && tempNum <= history_score.length){
     42                     System.out.println("第"+tempNum+"轮的成绩是:");
     43                     for(int j = 0; j < player_num; j++){
     44                         System.out.println(players[j].getPlayer_name()+":"+history_score[tempNum-1][j]);
     45                     }
     46                 }
     47                 else System.out.println("输入有误!");
     48                 System.out.println("是否继续?Y/N");
     49                 Scanner in2=new Scanner(System.in);
     50                 choice=in2.nextLine();
     51                 if(choice=="y"||choice=="Y"){
     52                     continue;
     53                 }
     54                 else{
     55                     return;
     56                 }
     57             }
     58             return;
     59         }
     60     }
     61     // 游戏结束时展示这一句游戏的每位玩家的总成绩
     62     public static  void ShowResult(){
     63         System.out.println("游戏结束!成绩如下:");
     64         for(int i=0;i<player_num;i++){
     65             System.out.println(players[i].getPlayer_name()+"的成绩是"+players[i].getPlayer_score());
     66         }
     67 
     68     }
     69     // 游戏开始
     70     public  static void Gaming(){
     71         System.out.print("请输入游戏人数:");
     72         Scanner in1=new Scanner(System.in);
     73         player_num=in1.nextInt();
     74         players=new Player[player_num];
     75         point_choice=new int[player_num];
     76         now_distance=new double[player_num];
     77         System.out.print("请输入游戏轮数:");
     78         Scanner in2=new Scanner(System.in);
     79         round_num=in2.nextInt();
     80         history_score=new int[round_num][player_num];
     81         NameScanner();
     82         while (now_round_num<=round_num){
     83             int[] round_score=new int[player_num];
     84             System.out.println("请输入每个人的分数:");
     85             for(int i = 0; i < player_num; i++){
     86                 System.out.print("请输入第"+(i+1)+"个人的分数:");
     87                 Scanner in =new Scanner(System.in);
     88                 point_choice[i]=in.nextInt();
     89                 now_result+=point_choice[i];
     90             }
     91             now_result=(now_result/player_num)*0.618;  // 计算黄金点
     92             System.out.println("黄金点:"+now_result);
     93             for(int i = 0; i < player_num; i++){
     94                 now_distance[i] = Math.abs(point_choice[i] - now_result);
     95             }
     96             // 输入完毕后计算每人离黄金点的距离
     97             for(int i = 0; i < player_num; i++){
     98                 System.out.println(players[i].getPlayer_name()+"的距离是"+now_distance[i]);
     99             }
    100             // 计算最大值与最小值
    101             double max =getMaxMin.getMax(now_distance);
    102             double min =getMaxMin.getMin(now_distance);
    103             System.out.println("max:"+max+"min:"+min);
    104             // 开始选择本轮得分和扣分的玩家
    105             for(int i = 0; i < player_num; i++){
    106                 if(now_distance[i] == min){
    107                     players[i].setPlayer_score(players[i].getPlayer_score()+player_num);
    108                     round_score[i]=player_num;
    109                 }
    110                 else if(now_distance[i] == max){
    111                     players[i].setPlayer_score(players[i].getPlayer_score()-2);
    112                     round_score[i]=-2;
    113                 }
    114                 else round_score[i]=0;
    115             }
    116             System.out.println("本轮的成绩是:");
    117             for(int j = 0; j < player_num; j++){
    118                 System.out.println(players[j].getPlayer_name()+":"+round_score[j]);
    119             }
    120             // 更新历史记录
    121             for(int k=0;k<player_num;k++){
    122                 history_score[now_round_num-1][k]=round_score[k];  // 添加历史记录
    123             }
    124             ShowHistory();
    125             now_round_num++;  // 进入下一轮
    126             now_result=0;
    127         }
    128     }
    129 
    130     public  static void NameScanner(){
    131         for (int i=0;i<player_num;i++){
    132             System.out.print("请输入"+(i+1)+"号玩家的名字:");
    133             Scanner in = new Scanner(System.in);
    134             players[i]=new Player(in.nextLine(),0);;
    135         }
    136     }
    137 }

     

  3. 游戏数据更新的类及输入方法

     1 package homework;
     2 
     3 public class WorkChange {
     4     public static int player_num;
     5     public static int round_num;
     6     public static int now_round_num=1;
     7     public static double now_result=0;
     8     public static int[] point_choice;
     9     public static double[] now_distance;
    10     public static int[][] history_score;
    11     public static Player[] players;
    12     // 展示历史成绩
    13     public  String ShowHistory(){
    14         StringBuilder str= new StringBuilder();
    15                     for(int i = 0; i < history_score.length; i++){
    16                         str.append("第").append(i + 1).append("轮的成绩是:<br>");
    17                         System.out.println("第"+(i+1)+"轮的成绩是:");
    18                         for(int j = 0; j < player_num; j++){
    19                             str.append(players[j].getPlayer_name()).append(":").append(history_score[i][j]).append("<br>");
    20                         }
    21                         str.append("<br>");
    22                     }
    23                     return str.toString();
    24         }
    25     // 更新玩家选择的分数
    26     public void numScanner(int a,int b) {
    27         player_num = a;
    28         players = new Player[player_num];
    29         point_choice = new int[player_num];
    30         now_distance = new double[player_num];
    31         round_num = b;
    32         history_score = new int[round_num][player_num];
    33     }
    34     // 玩家输入分数
    35     public void nameScanner(String[] arr){
    36         for (int i=0;i<arr.length;i++){
    37             players[i]=new Player(arr[i],0);;
    38         }
    39     }
    40     // 游戏数据更新
    41     public void Gaming(int[] arr){
    42         // 如果当前所在轮数还小于总轮数则继续进行游戏
    43         if (now_round_num<=round_num){
    44             int[] round_score=new int[player_num];
    45             for(int i = 0; i < player_num; i++){
    46                 point_choice[i]=arr[i];
    47                 now_result+=point_choice[i];
    48             }
    49             now_result=(now_result/player_num)*0.618;  // 黄金点
    50             System.out.println("黄金点:"+now_result);
    51             for(int i = 0; i < player_num; i++){
    52                 now_distance[i] = Math.abs(point_choice[i] - now_result);
    53             }
    54             for(int i = 0; i < player_num; i++){
    55                 System.out.println(players[i].getPlayer_name()+"的距离是"+now_distance[i]);
    56             }
    57             double max =getMaxMin.getMax(now_distance);
    58             double min =getMaxMin.getMin(now_distance);
    59             System.out.println("max:"+max+"min:"+min);
    60 
    61             for(int i = 0; i < player_num; i++){
    62                 if(now_distance[i] == min){
    63                     players[i].setPlayer_score(players[i].getPlayer_score()+player_num);
    64                     round_score[i]=player_num;
    65                 }
    66                 else if(now_distance[i] == max){
    67                     players[i].setPlayer_score(players[i].getPlayer_score()-2);
    68                     round_score[i]=-2;
    69                 }
    70                 else round_score[i]=0;
    71             }
    72             System.out.println("本轮的成绩是:");
    73             for(int j = 0; j < player_num; j++){
    74                 System.out.println(players[j].getPlayer_name()+":"+round_score[j]);
    75             }
    76             for(int k=0;k<player_num;k++){
    77                 history_score[now_round_num-1][k]=round_score[k];//添加历史记录
    78             }
    79             now_round_num++;
    80             now_result=0;
    81         }
    82     }
    83 
    84     public String ShowResult(){
    85         String str="";
    86         //System.out.println("游戏结束!成绩如下:");
    87         for(int i=0;i<player_num;i++){
    88             //System.out.println(players[i].getPlayer_name()+"的成绩是"+players[i].getPlayer_score());
    89             str+=players[i].getPlayer_name()+"的成绩是"+players[i].getPlayer_score()+"<br><br>";
    90         }
    91         return str;
    92     }
    93 
    94 }

     

  4. 计算每轮结果类 turnResult

     1 package homework;
     2 
     3 public class TurnResult {
     4     public String turnResult(int num,int arr[]){
     5         StringBuilder str= new StringBuilder();
     6         double now_result=0;
     7         int[]score=new int[num];
     8         double distance[]=new double[num];
     9         int[]point=new int[num];
    10         for (int i=0;i<num;i++){
    11             point[i]=arr[i];
    12             now_result+=point[i];
    13         }
    14         now_result=(now_result/num)*0.618;
    15         for (int i=0;i<num;i++){
    16             distance[i]=Math.abs(point[i]-now_result);
    17         }
    18         double max =getMaxMin.getMax(distance);
    19         double min =getMaxMin.getMin(distance);
    20         for (int i=0;i<num;i++){
    21             if (distance[i]==min){
    22                 score[i]=num;
    23             }
    24             else if (distance[i]==max){
    25                 score[i]=-2;
    26             }
    27             else score[i]=0;
    28         }
    29 
    30         for (int i=0;i<num;i++){
    31             str.append("第"+(i+1)+"号的得分是:"+score[i]+"!<br><br>");
    32         }
    33 
    34         return str.toString();
    35     }
    36 }

     

  5. 获取数组最值类

     1 package homework;
     2 
     3 public class getMaxMin {
     4     public static double getMax(double[] arr){
     5         double x=-1;
     6         for (double v : arr) {
     7             if (v > x) {
     8                 x = v;
     9             }
    10         }
    11         return x;
    12     }
    13     public static double getMin(double[] arr){
    14         double x=10000;
    15         for (double v : arr) {
    16             if (v < x) {
    17                 x = v;
    18             }
    19         }
    20         return x;
    21     }
    22 }

     

  6. 游戏主界面(UI界面)

      1 package homework;
      2 
      3 import javax.swing.*;
      4 import java.awt.*;
      5 import  java.awt.Container;
      6 import java.awt.event.ActionEvent;
      7 import java.awt.event.ActionListener;
      8 
      9 public class BeginWin{
     10 
     11     //
     12     private static int wait1=0;
     13     private static int wait2=0;
     14     private static int[] wait3;
     15     //
     16     int playNum;
     17     int turnNum;
     18     String []name;
     19     int[] score;
     20     String result;
     21     String history;
     22     //开始页面组件
     23     private JFrame beginFrame=new JFrame("开始");
     24     private JButton ok1=new JButton("确定");
     25     private JTextField turnNumField=new JTextField(16);
     26     private JTextField peopleNumField=new JTextField(16);
     27     //信息录入页面组件
     28     private JFrame nameFrame=new JFrame("信息录入");
     29     private JButton ok2=new JButton("确定");
     30     private JTextField[] nameField;
     31     //轮数页面组件
     32     private JFrame[] turnsFrame;
     33     private JButton[] ok3;
     34     private JButton[] his;
     35     private  JPasswordField[][] turnField;
     36     //历史成绩页面组件
     37     private JFrame hisFrame=new JFrame("历史记录");
     38     private JTextArea hisArea=new JTextArea(300,300);
     39     //本轮成绩页面组件
     40     private JFrame[]scoreFrame;
     41     private JTextArea[] scoreArea;
     42     //结束页面组件
     43     private JFrame endFrame=new JFrame("结束");
     44     private  JTextArea endArea=new JTextArea(300,300);
     45 
     46     public void Init1() {
     47         //开始页面
     48         //流式布局
     49         Container beginFrameContentPaneContent = beginFrame.getContentPane();
     50         beginFrameContentPaneContent.setLayout(new FlowLayout());
     51         //添加组件
     52         Box aBox = Box.createVerticalBox();
     53         JLabel welcome_text = new JLabel("欢迎来到黄金点游戏!");
     54         welcome_text.setFont(new Font("宋体", Font.PLAIN, 20));
     55         aBox.add(welcome_text);
     56         Box bBox = Box.createHorizontalBox();
     57         bBox.add(new JLabel("请输入玩家人数:"));
     58         bBox.add(peopleNumField);
     59         Box cBox = Box.createHorizontalBox();
     60         cBox.add(new JLabel("请输入游戏轮数:"));
     61         cBox.add(turnNumField);
     62         aBox.add(Box.createVerticalStrut(30));
     63         aBox.add(bBox);
     64         aBox.add(Box.createVerticalStrut(30));
     65         aBox.add(cBox);
     66 
     67         beginFrameContentPaneContent.add(aBox);
     68         beginFrameContentPaneContent.add(ok1, BorderLayout.SOUTH);
     69         //设置页面
     70         beginFrame.setSize(800, 600);
     71         beginFrame.setVisible(true);
     72         beginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     73 
     74         ok1.addActionListener(new ActionListener() {
     75             @Override
     76             public void actionPerformed(ActionEvent e) {
     77                 //全局变量设置
     78                 playNum=Integer.parseInt(peopleNumField.getText());
     79                 turnNum=Integer.parseInt(turnNumField.getText());
     80                 score=new int[playNum];
     81                 name=new String[playNum];
     82                 wait3=new int[playNum];
     83                 //组件设置
     84                 turnsFrame=new JFrame[turnNum];
     85                 for (int i=0;i<turnNum;i++){
     86                     turnsFrame[i]=new JFrame("第"+(i+1)+"轮");
     87                 }
     88 
     89                 his=new JButton[turnNum];
     90                 for (int i=0;i<turnNum;i++){
     91                     his[i]=new JButton("历史");
     92                 }
     93 
     94                 ok3=new JButton[turnNum];
     95                 for (int i=0;i<turnNum;i++){
     96                     ok3[i]=new JButton("确定");
     97                 }
     98 
     99                 nameField=new JTextField[playNum];
    100                 for (int i=0;i<playNum;i++){
    101                     nameField[i]=new JTextField(5);
    102                 }
    103 
    104                 turnField= (JPasswordField[][]) new JPasswordField[turnNum][playNum];
    105                 for (int i=0;i<turnNum;i++){
    106                     for(int j=0;j<playNum;j++)
    107                     turnField[i][j]= (JPasswordField) new JPasswordField(5);
    108                 }
    109 
    110                 scoreFrame=new JFrame[playNum];
    111                 scoreArea=new JTextArea[playNum];
    112                 for (int i=0;i<playNum;i++) {
    113                     scoreFrame[i]=new JFrame("本轮("+(i+1)+")轮成绩");
    114                     scoreArea[i]=new JTextArea();
    115                 }
    116                 //
    117                 //结束界面设置
    118                 endFrame.setLayout(new FlowLayout());
    119                 endFrame.setSize(800,600);
    120                 endFrame.setVisible(false);
    121 
    122                 //历史界面设置
    123                 hisFrame.setLayout(new FlowLayout());
    124                 //hisFrame.add(new JLabel("历史成绩如下:"));
    125                 hisFrame.setSize(800,600);
    126                 hisFrame.setVisible(false);
    127 
    128                 //本轮成绩界面设置
    129                 for (int i=0;i<turnNum;i++){
    130                     scoreFrame[i].setLayout(new FlowLayout());
    131                     //scoreFrame[i].add(new JLabel("本轮记录如下:"));
    132                     //scoreFrame[i].add(scoreArea[i]);
    133                     scoreFrame[i].setSize(800,600);
    134                     scoreFrame[i].setVisible(false);
    135                 }
    136 
    137                 beginFrame.setVisible(false);
    138                 wait1=1;
    139             }
    140         });
    141     }
    142     public void Init2() {
    143         //信息录入页面
    144         nameFrame.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
    145 
    146         //设置页面
    147         nameFrame.setSize(800, 600);
    148         nameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    149         //
    150         nameFrame.add(new JLabel("请输入每个玩家的名字:"));
    151         for (int i = 0; i < playNum; i++) {
    152             nameFrame.add(nameField[i]);
    153         }
    154         nameFrame.add(ok2);
    155         nameFrame.setVisible(true);
    156 
    157         ok2.addActionListener(new ActionListener() {
    158             @Override
    159             public void actionPerformed(ActionEvent e) {
    160                 for (int i = 0; i < playNum; i++) {
    161                     name[i] = nameField[i].getText();
    162                 }
    163                 nameFrame.setVisible(false);
    164                 wait2=1;
    165             }
    166         });
    167     }
    168     public void Init3(int i) {
    169         //轮数页面
    170         turnsFrame[i].setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
    171         turnsFrame[i].add(new JLabel("请输入每个人的报数:"));
    172         for (int j = 0; j < playNum; j++) {
    173             turnsFrame[i].add(turnField[i][j]);
    174         }
    175         turnsFrame[i].add(his[i]);
    176         turnsFrame[i].add(ok3[i]);
    177         turnsFrame[i].setSize(800, 600);
    178         turnsFrame[i].setVisible(true);
    179 
    180         //历史查询响应
    181         his[i].addActionListener(new ActionListener() {
    182             @Override
    183             public void actionPerformed(ActionEvent e) {
    184                 hisFrame.getContentPane().removeAll();
    185                 hisFrame.add(new JLabel("<html><body>"+"历史成绩如下:<br><br>"+history+"<body></html>"));
    186                 hisFrame.setVisible(true);
    187             }
    188         });
    189 
    190         ok3[i].addActionListener(new ActionListener() {
    191             @Override
    192             public void actionPerformed(ActionEvent e) {
    193                 String str;
    194                 hisFrame.setVisible(false);
    195                 turnsFrame[i].setVisible(false);
    196                 for (int j=0;j<playNum;j++){
    197                     score[j]=Integer.parseInt(turnField[i][j].getText());
    198                 }
    199                 //
    200                 TurnResult turnResult=new TurnResult();
    201                 str=turnResult.turnResult(playNum,score);
    202                 scoreFrame[i].add(new JLabel("<html><body>本轮成绩如下:<br><br>"+str+"<body></html>"));
    203                 scoreFrame[i].setVisible(true);
    204                 wait3[i]=1;
    205             }
    206         });
    207     }
    208     public void Init4(){
    209         endFrame.add(new JLabel("<html><body>总成绩如下:<br><br>"+result+"<body></html>"));
    210         endFrame.setVisible(true);
    211     }
    212     public int getPeopleNum(){
    213         return playNum;
    214     }
    215     public int getTurnNum(){
    216         return turnNum;
    217     }
    218     public String[] getName(){
    219         return name;
    220     }
    221     public int[] getScore(){
    222         return score;
    223     }
    224 
    225     public static void main(String[] args) {
    226         BeginWin beginWin=new BeginWin();
    227         WorkChange workChange=new WorkChange();
    228 
    229         beginWin.Init1();
    230         //线程等待
    231         while (wait1==0) {
    232             try {
    233                 Thread.sleep(1000);
    234             } catch (InterruptedException e) {
    235                 System.exit(0);
    236             }
    237         }
    238         workChange.numScanner(beginWin.getPeopleNum(),beginWin.getTurnNum());
    239         beginWin.Init2();
    240         while (wait2==0) {
    241             try {
    242                 Thread.sleep(1000);
    243             } catch (InterruptedException e) {
    244                 System.exit(0);
    245             }
    246         }
    247         workChange.nameScanner(beginWin.getName());
    248         for (int i=0;i<beginWin.turnNum;i++){
    249             beginWin.Init3(i);
    250             while (wait3[i]==0) {
    251                 try {
    252                     Thread.sleep(1000);
    253                 } catch (InterruptedException e) {
    254                     System.exit(0);
    255                 }
    256             }
    257             workChange.Gaming(beginWin.getScore());
    258             beginWin.history=workChange.ShowHistory();
    259         }
    260         beginWin.result=workChange.ShowResult();
    261         beginWin.Init4();
    262     }
    263 }

     

 五. UI界面展示

  1. 游戏开始界面——输入玩家人数以及游戏轮数

 

 

  2. 输入玩家信息(暂定为以名字区分)

 

  3. 输入每位玩家的选择

 

 

  4. 查看当前所在轮分数

 

 

  5. 查看历史分数(支持在每轮结束后都查看)

 

 

  6. 游戏结束并显示每位玩家总成绩

 

 

六. 总结

  本周我们实现了用 java 语言实现了初步的 UI 界面,并且基本实现了实验要求的所有功能。未来我们的方向与规划有:

  • 加入 AI 功能(通过深度学习中的相关算法);
  • 使游戏更加丰富智能(每次输入两个数,加入干扰黄金点位置功能);
  • 多轮游戏结果的可视化展示(以柱形图分析每局中不同玩家在黄金点距离上的分布,以折线图分析玩家在每一轮中的黄金点距离变化与得分情况)。
posted @ 2020-11-01 21:14  软工课设第29组  阅读(73)  评论(0)    收藏  举报