结对编程1——黄金点小游戏项目简介及需求分析
一、项目成员
2018141461085 | 龚泽楠 |
2018141461012 | 蔡铧荣 |
二、项目名称
黄金点小游戏
三、项目简介
游戏规则: N个同学( N通常大于 10 ),每人写一个 0~100 之间的有理数 (不包括 0或100) ,交给裁判算出所有数字的平均值然后乘以 0.618 (所谓黄金分割常数),得到 G值。提交的数字最靠近 G(取绝对值)的同 学得到 N分,离 G最远的同学得到- 2分,其他同学得 0分。
黄金点游戏其实是一个博弈论G值(博弈值,在黄金点游戏中为黄金点;在市场竞标中为标线;在拍卖中为成交额)的数据收集实验,因此该项目为社会公益项目,普遍情况黄金点游戏项目都会将最后数据或实时数据上传至网络公开使用。
这个游戏规定第一名得到全部的分数, 第二名(不管多接近)到倒数第二名都是 0 分,最后一名还要倒扣分。
四、项目需求
(1)项目结构需求
(2)算法需求
计算G值和每位玩家得分
每位玩家得分分轮次存储
查询每轮得分情况
(3)数据库需求
输入数据合法性检查
输入数据分轮次存储
(4)UI及可视化功能需求
游玩人数输入
显示每轮得分情况
五、项目的主要功能
a.基础功能:
1.用户注册登陆
2.输入数据进行游戏
b.拓展功能:
1.良好UI及可视化
2.查看当局游戏数据
3.查看排行榜
六、 开发工具
开发工具:IDEA,ECLIPSE
七、 概要设计
模块名称 | 新房间创建 |
---|---|
输入 | 设置游戏玩家个数、游戏回合时长、总回合数、限制玩家总数 |
输出 | 开始基于新的游戏设置回合 |
功能 | 开始新的游戏 |
模块名称 | 功能 |
---|---|
输入 | 黄金点游戏用户想要输的点数 |
输出 | 黄金点游戏G值 |
功能 | 进行黄金点游戏 |
模块名称 | 得分纪录 |
---|---|
输出 | 每回合每个玩家的得分 |
功能 | 记录玩家得分情况 |
八、 代码实现(JAVA)
主体功能实现(计算黄金值、比较排名,计算分数)
public static int Count(int n,int round) throws IOException {//负责统计数据和数据的写入 int state = 0; //表明数据状态 Scanner input = new Scanner(System.in); System.out.println("请输入每位同学的点数: "); String str = input.nextLine(); String [] list = str.split(" "); Double [] list2 = new Double[list.length]; //用于计算距离 Double [] list3 = new Double[list.length]; //用于排名 for(int i = 0;i < list.length;i++) {//检测数据是否异常,并复制到另一个double数组 list2[i] = Double.parseDouble(list[i]); if(list2[i] <= 0 || list2[i] >= 100) { state = 1; return state; //返回异常 } } //计算黄金点 double sum = 0; //加总 double Msum = 0; //乘上黄金分割比的Msum for(int i = 0;i < list2.length;i++) { sum += list2[i]; } Msum = (sum / n) * 0.618; //每位选手离黄金点的距离 Double [] Distance = new Double[n]; for(int i = 0;i < list2.length;i++) { Distance[i] = abs(list2[i] - Msum); list3[i] = Distance[i]; } //排名 Arrays.sort(list3); //距离的升序排序 int [] ExRank = new int[list.length]; int number = 1; //用于排名,同时也代表着最低排名 ExRank[0] = 1; //最高位默认为排名1, for(int i = 1;i < list3.length;i++) { NumberFormat nf = NumberFormat.getInstance(); nf.setGroupingUsed(false); String DATA1 = nf.format(list3[i]); String DATA2 = nf.format(list3[i-1]); if(DATA1.equals(DATA2)) { ExRank[i] = number; } else{ ExRank[i] = ++number; } } //索引回原先数字 int [] Rank = new int[list.length]; for(int i = 0;i < list3.length;i++) { for(int j = 0;j < list3.length;j++) { if(Distance[i] == list3[j]) { Rank[i] = ExRank[j]; //System.out.print(Rank[i] + " ") //test break; } } } //得分结算 for(int i = 0;i < list.length;i++) { if(Rank[i] == 1) { score[i] += n; } else if(Rank[i] == number) { score[i] -= 2; } else { score[i] = 0; } } //列出此局情况 String [] data = new String[n + 2]; data[0] = "此为第" + round + "局"; data[1] = "此局的黄金点为 : " + Msum; System.out.println(data[0]); System.out.println(data[1]); for(int i = 0;i < list.length;i++) {//此局战况 data[i+2] = "第" + (i+1) +"位选手所选择的数 " + list[i] + "; 其于黄金点的距离为 : " + Distance[i] + "; 排名为 : " + Rank[i] + "; 所得分 : " + score[i]; System.out.println(data[i+2]); } //数据保存在文件中 inputdata(data); return state; }
文件数据管理:
public static void Readdata() throws IOException {//将文件中的数据读取 BufferedReader in = new BufferedReader(new FileReader(path)); String str=null;//定义一个字符串类型变量str int i = 0;//定义一个整型变量 while ((str = in.readLine())!= null) {//readLine()方法, 用于读取一行,只要读取内容不为空就一直执行 i++; byte[] bytes=str.getBytes(); System.out.println(str); } in.close(); } public static void inputdata(String [] input) throws IOException { FileWriter fw = new FileWriter(path,true); //将这个普通的FileWriter对象传递给BufferedWriter构造方法即可 BufferedWriter bw = new BufferedWriter(fw); //后面bw的时候和fw没有区别 for(int i = 0;i < input.length;i++) { bw.write(input[i]); bw.newLine(); } //关闭流 bw.close(); } public static void Delete() throws IOException { FileWriter fileWriter =new FileWriter(path); fileWriter.write(""); fileWriter.flush(); fileWriter.close(); } public static void WriteDate() throws IOException{ FileWriter fw = new FileWriter(path,true); //将这个普通的FileWriter对象传递给BufferedWriter构造方法即可 BufferedWriter bw = new BufferedWriter(fw); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String DATE = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳 bw.write(DATE); bw.newLine(); bw.close(); } public static double abs(double a) {//绝对值函数 return (a < 0) ? -a : a; } }
新建游戏以及游戏菜单:
public class GoldCount { static String path = "D:\\Project\\code\\java\\GoldCount\\src\\data.txt"; //导出的数据 static int [] score = new int[100]; //得分,人数尽量不大于100 public static void main(String[] args) throws IOException { WriteDate(); Scanner input = new Scanner(System.in); System.out.print("请输入需要进行的游戏轮数(尽量大于10):"); int round = input.nextInt(); System.out.print("请输入参与该游戏的人数:"); int n = input.nextInt(); for(int sur = 0;sur < round;sur++ ) { int Qstate = 1; int Dstate = 1; while(1 == 1) {//不用switch语法是因为不好控制选项 menu(); int choice = input.nextInt(); if(Dstate == 0) { WriteDate(); Dstate = 1; } if (choice == 1) { while(1 == 1) {//用于处理数据异常 int Mstate = Count(n,sur+1); if (Mstate == 1) { System.out.println("输入的数据有误,请重新输入!"); } else { break; } } break; } else if (choice == 2) { //System.out.println("现在是第" + sur + "轮"); Readdata(); //返回至循环开始 } else if (choice == 3) { Delete(); Dstate = 0; } else if (choice == 4) { Qstate = 0; break; } else { System.out.println("输入有误,请重新输入!"); //返回至循环开始 } } if(Qstate == 0) { break; } } }
九、 运行结果
十、 后期计划
进行产品迭代,增加额外功能,以及设计UI和可视化界面