1. 程式人生 > >黃金點遊戲

黃金點遊戲

end n) int con 容易 發現 fab iostream space

結對編程:黃金點遊戲

什麽是黃金點遊戲?

黃金點遊戲是一個數字小遊戲,其遊戲規則是:

N個同學,每人寫一個有理數,交給裁判,裁判算出所有數字的平均值,然後乘以0.618(所謂黃金分割常數),得到G值。提交的數字最靠近G(取絕對值)的同學得到N分,離G最遠的同學得到-2分,其他同學得0分。玩過之同學們可以發現很有意思的現象,比如黃金點在逐漸地往下移動。

功能如下:

用戶自己輸入遊戲輪數和人數設定,在輸入自己所寫的數,然後程序自動運行得出分數

代碼如下:

#include <iostream>
#include<stdio.h>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<math.h>
using namespace std;

int main()
{
int game_num;
map<string, double>mp;
int i, n;
double num, sum, ave, G;
int temp = 0;
string name;
printf("請輸入遊戲的人數:");
scanf("%d", &n);
printf("\n");
printf("請輸入此次遊戲進行的輪數:");
scanf("%d", &game_num);
printf("\n");

while (game_num--)
{
++temp;
mp.clear(); //清空map中的數據
sum = 0; ave = 0; G = 0;
printf("第%d輪開始:\n", temp);
printf("請輸入每人的姓名和有理數(空格隔開):\n");
for (i = 0; i<n; i++)
{

cin >> name >> num;
if (num>0.0&&num<100.0)
{
mp[name] = num; //建立map的關系
sum = sum + num;
}
else
{
printf("請輸入(0-100)的有理數\n");
i--;
}
}

map<string, double>::iterator iter, result_high, result_low;

printf("總和為:%.4lf\n", sum);
ave = sum / n;
printf("平均值:%.4lf\n", ave);
G = ave*0.618;
printf("G點值:%.4lf\n", G);

for (iter = mp.begin(); iter != mp.end(); iter++)
{
iter->second = (double)fabs(G - (double)iter->second); //iter存的是差值

}

for (iter = mp.begin(), result_high = mp.begin(), result_low = mp.begin(); iter != mp.end(); iter++)
{
if (iter->second<result_high->second)
result_high = iter;
if (iter->second>result_low->second)
result_low = iter;
}

cout << endl;
cout << "姓名" << "\t" << "差值" << endl;
cout << result_high->first << "\t" << result_high->second << "\t" << "得到" << n << "分" << endl;
cout << result_low->first << "\t" << result_low->second << "\t" << "得到-2分" << endl;
cout << endl;

for (iter = mp.begin(); iter != mp.end(); iter++)
{
iter->second = 0;
}

for (iter = mp.begin(); iter != mp.end(); iter++)
{
if (iter == result_high)
iter->second += n;
if (iter == result_low)
iter->second += -2;
}
cout << "第" << temp << "輪結果:" << endl;
cout << "姓名" << "\t" << "分數" << endl;
for (iter = mp.begin(); iter != mp.end(); iter++)
cout << iter->first << "\t" << iter->second << endl;
cout << endl;
}
return 0;
}

總結:

此代碼是一個小遊戲 人多一點才好玩才能更容易發現有意思的現象 這是我們的一個結對編程項目 有我和我同學兩個人共同完成 代碼借鑒於網上 然後我們稍加修改而成

好好學習 天天向上 繼續努力

黃金點遊戲