前言
在本次课程设计中,我们组两个人完成结对后,通过合作讨论的方式对“黄金点游戏”的第一个版本进行编写,并且在程序中为游戏后续的迭代留下了空间。
一、“黄金点游戏”简述
分组编写一个满足下列要求的黄金点游戏程序。
➢ 游戏规则:N个同学(N通常大于10),每人写一个0~100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618 (所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
➢ 采用单机方式实现,需要为用户提供便利的输入界面。
➢ 该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
➢ 后续在此基础上迭代开发。
二、工作内容
1、项目分析
在本次项目中,首先为了保证每个玩家的安全性,我们决定在每个玩家对象中设置密码,这也是为了方便之后的游戏迭代。
项目要求首先计算出所有玩家数据的平均值,这一要求求出所有玩家数据的总和sum和玩家人数N即可满足。计算出该轮游戏的黄金点后,通过类似冒泡排序的迭代方法比较每个玩家数据与黄金点之间的距离,求出本轮游戏能获得分数和扣分的玩家。然后通过每个玩家类中的count变量存储每个玩家累计分数,在main函数中通过循环实现多轮游戏。
2.项目过程
(1)、创建Player类,其中包含密码和分数等变量,计算得分等方法:
class Player{
public:
string password;//密码
int count=0;//分数
int flag=1;//默认都是不加分
double shuru=0;//给出的数
int haoma;
public:
Player();//构造函数
~Player();
public:
void jisuan();//算出自己的得分
void Shuru();//输入自己的数字
void zhuce(int num);
};
(2)、玩家类中的jisuan函数,实现得出玩家自身的得分这一功能:
void Player::jisuan(){
if(flag==0)count=count+N;//flag为0则证明和黄金点差距最小,加分
else if(flag==1)count=count+0;
else if(flag==2)count=count-2;//flag为2则差距最大,减分
}
(3)、玩家类中的shuru函数,保证玩家通过密码验证后,输入自己的数据:
void Player::Shuru(){
string b;
cout<<"请"<<haoma<<"号玩家输入密码"<<endl;
cin>>b;
while(1){
if(password.compare(b)==0){
cout<<"请输入数据"<<endl;
cin>>shuru;
break;
}
else{
cout<<"请重新输入"<<endl;
cin>>b;
}
}
}
(4)、创建Judge类,其中计算每一轮各玩家得分情况等方法:
class Judge:public Player{
public:
Judge();//构造函数,其中构造数个Player
void menu();//菜单,还没写
void finish();//调用player的计算函数,算出所有人的得分
~Judge();//析构,把Player数组给删掉
void suan(); //核心部分,处理绝对值,max和min,并且赋值flag
int num;//玩家标号
void shuchu();//最后输出得分情况
void start();//调用每一个player的输入函数
protected:
double avg=0;//平均值,计算用中间量
Player player[100];//最多100个玩家
(5)、裁判类中的suan方法,通过迭代比较的方法来判断每一轮得分的玩家和扣分的玩家:
void Judge::suan(){
double sum=0;
for(int i=0;i<N;i++){
sum+=player[i].shuru;
}
avg=(sum/N)*0.618;
cout<<"本轮游戏的黄金点为"<<avg<<endl;
int max=0;
int min=100;
int x=0;//记录需要加分的
int y=0;//记录需要减分的
for(int j=0;j<N;j++){
if(fabs(player[j].shuru-avg)>max)
{
max=fabs(player[j].shuru-avg);
y=j;
}
if(fabs(player[j].shuru-avg)<min)
{
min=fabs(player[j].shuru-avg);
x=j;
}
}
player[y].flag=2;
player[x].flag=0;
}
(6)、main函数,通过创建对象来实现项目要求,通过循环实现多轮游戏:
int main(){
int a=0;
while(!a){
cout<<"请输入玩家人数"<<endl;
cin>>N;
Judge *judge1=new Judge();
int b=0;
while(!b){
judge1->start();
judge1->suan();
judge1->finish();
judge1->shuchu();
cout<<"输入数字1结束本轮游戏,输入0继续"<<endl;
cin>>b;
}
cout<<"输入数字1结束本次游戏,输入0继续"<<endl;
cin>>a;
}
system("PAUSE");
return 0;
}
总结
在这次的项目初步开发过程中,我们感受到在这次开发过程会遇到两个人思路不同等问题,但是最后仍能够通过交流讨论来完善彼此的想法,最后达成意见的统一。由此可以看出在软件工程课程设计中两人合作可以使得项目开发过程加上了“考虑别人”这一部分,由此使得项目的开发产品更能适应市场。
附上完整代码:
#include <io.h>
#include<iostream>
#include<string>
#include<math.h>
#include<complex.h>
#include<stdlib.h>
using namespace std;
int N;
class Player{
public:
string password;//密码
int count=0;//分数
int flag=1;//默认都是不加分
double shuru=0;//给出的数
int haoma;
public:
Player();//构造函数
~Player();
public:
void jisuan();//算出自己的得分
void Shuru();//输入自己的数字
void zhuce(int num);
};
//Player::Player(int num){
// cout<<num<<"号用户创建时请输入密码"<<endl;
// cin>>password;
//}
Player::Player(){
//to do
}
Player::~Player(){
//to do
}
void Player::zhuce(int num){
haoma=num;
cout<<num<<"号用户创建时请输入密码"<<endl;
cin>>password;
}
void Player::jisuan(){
if(flag==0)count=count+N;//flag为0则证明和黄金点差距最小,加分
else if(flag==1)count=count+0;
else if(flag==2)count=count-2;//flag为2则差距最大,减分
}
void Player::Shuru(){
string b;
cout<<"请"<<haoma<<"号玩家输入密码"<<endl;
cin>>b;
while(1){
if(password.compare(b)==0){
cout<<"请输入数据"<<endl;
cin>>shuru;
break;
}
else{
cout<<"请重新输入"<<endl;
cin>>b;
}
}
}
class Judge:public Player{
public:
Judge();//构造函数,其中构造数个Player
void menu();//菜单,还没写
void finish();//调用player的计算函数,算出所有人的得分
~Judge();//析构,把Player数组给删掉
void suan(); //核心部分,处理绝对值,max和min,并且赋值flag
int num;//玩家标号
void shuchu();//最后输出得分情况
void start();//调用每一个player的输入函数
protected:
double avg=0;//平均值,计算用中间量
Player player[100];//最多100个玩家
};
Judge::Judge(){
for(int i=0;i<N;i++){
num=i;
player[i].zhuce(num);
}
}
Judge:: ~Judge(){
delete []player;
}
void Judge::menu(){
//to do
}
void Judge::suan(){
double sum=0;
for(int i=0;i<N;i++){
sum+=player[i].shuru;
}
avg=(sum/N)*0.618;
cout<<"本轮游戏的黄金点为"<<avg<<endl;
int max=0;
int min=100;
int x=0;//记录需要加分的
int y=0;//记录需要减分的
for(int j=0;j<N;j++){
if(fabs(player[j].shuru-avg)>max)
{
max=fabs(player[j].shuru-avg);
y=j;
}
if(fabs(player[j].shuru-avg)<min)
{
min=fabs(player[j].shuru-avg);
x=j;
}
}
player[y].flag=2;
player[x].flag=0;
}
void Judge::shuchu(){
cout<<"本局结束,分数情况如下"<<endl;
for(int i=0;i<N;i++){
cout<<player[i].count<<endl;
}
}
void Judge::start(){
for(int i=0;i<N;i++){
player[i].Shuru();
}
}
void Judge::finish(){
for(int i=0;i<N;i++){
player[i].jisuan();
}
}
int main(){
int a=0;
while(!a){
cout<<"请输入玩家人数"<<endl;
cin>>N;
Judge *judge1=new Judge();
int b=0;
while(!b){
judge1->start();
judge1->suan();
judge1->finish();
judge1->shuchu();
cout<<"输入数字1结束本轮游戏,输入0继续"<<endl;
cin>>b;
}
cout<<"输入数字1结束本次游戏,输入0继续"<<endl;
cin>>a;
}
system("PAUSE");
return 0;
}