黄金点第二次博客
本周成果:在 idea 集成开发环境用 java 语言写出了初步的 UI 界面。
一. 目前实现的功能有:
- 实现用户相关信息的输入(玩家可以手动输入自己的名字、年龄等信息,在游戏过程中更方便区分)
- 每一轮结束后都可以查看当前轮的分数以及可以选看历史分数。
- 游戏结束后可以查看每个人的游戏总得分。
二. 开发过程中遇到了一些 bug,目前正在解决:
- 如果在输入每轮分数时,不在输入框里输入数据而直接计算结果,程序会强制退出。
- 查看历史成绩的框体会保留每一次查询的记录以及对应的时点数据,界面不够美观简洁。
三. 项目未来的方向:
- 在每次玩家输入分数时,将输入框实时输入的数字以 “*” 代替来防止其他玩家偷看从而确保游戏公平性。
- 修复若干 bug ;
- 适当美化界面;
- 加入其它机制以丰富游戏内容。
四. 下面是分模块的代码展示:
-
玩家类
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 }
-
游戏流程类(包含游戏进行、展示历史成绩等的方法)
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 }
-
游戏数据更新的类及输入方法
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 }
-
计算每轮结果类 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 }
-
获取数组最值类
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 }
-
游戏主界面(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 功能(通过深度学习中的相关算法);
- 使游戏更加丰富智能(每次输入两个数,加入干扰黄金点位置功能);
- 多轮游戏结果的可视化展示(以柱形图分析每局中不同玩家在黄金点距离上的分布,以折线图分析玩家在每一轮中的黄金点距离变化与得分情况)。

浙公网安备 33010602011771号