java黄金分割点游戏_结对编程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 = newScanner(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 = newDouble[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);returnstate;
}
文件數據管理:
public static void Readdata() throws IOException {//將文件中的數據讀取
BufferedReader in = new BufferedReader(newFileReader(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) throwsIOException {
FileWriter fw= new FileWriter(path,true);//將這個普通的FileWriter對象傳遞給BufferedWriter構造方法即可
BufferedWriter bw = newBufferedWriter(fw);//后面bw的時候和fw沒有區別
for(int i = 0;i < input.length;i++)
{
bw.write(input[i]);
bw.newLine();
}//關閉流
bw.close();
}public static void Delete() throwsIOException {
FileWriter fileWriter=newFileWriter(path);
fileWriter.write("");
fileWriter.flush();
fileWriter.close();
}public static void WriteDate() throwsIOException{
FileWriter fw= new FileWriter(path,true);//將這個普通的FileWriter對象傳遞給BufferedWriter構造方法即可
BufferedWriter bw = newBufferedWriter(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(doublea)
{//絕對值函數
return (a < 0) ? -a : a;
}
}
新建游戲以及游戲菜單:
public classGoldCount
{static String path = "D:\\Project\\code\\java\\GoldCount\\src\\data.txt"; //導出的數據
static int [] score = new int[100]; //得分,人數盡量不大于100
public static void main(String[] args) throwsIOException {
WriteDate();
Scanner input= newScanner(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和可視化界面
總結
以上是生活随笔為你收集整理的java黄金分割点游戏_结对编程1——黄金点小游戏项目简介及需求分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 表格分页代码,[Php]分页及表
- 下一篇: java 正则表达式 反向_正则表达式中