C++ 友元 实验6

定义一个“大富翁”游戏角色类CRole。

1、描述角色的私有数据成员为:

姓名(char *pName)、金钱(iCash)、存款(iSavings)、得意时口头禅(char *pGoodWords)、沮丧时口头禅(char *pBadWords)、游戏的角色数目( iRoleNum)、游戏角色平均资产(iMoney)。

2、定义相应的成员函数来设置和读取这些私有成员(游戏角色数目和平均资产只能通过计算得到,不能直接设置)。定义成员函数Speak()输出口头禅(根据资产数超过还是低于平均资产而定)。

3、定义构造函数:

(每次构造成功,显示[对象姓名+“角色进入”])、拷贝构造函数和析构函数(每次析构显示[对象姓名+“角色退出”]。

4、在main函数里用该类定义一个对象数组,包括以下5个对象信息(姓名、口头禅)。

孙小美   好的开始是成功的一半! 还给人家啦

钱夫人 你的是我的,我的还是我的! 老娘跟你没完!

沙隆巴斯 阿拉真主,我赞美你! 人生不如意十有八九 再加两个角色A,B及其口头禅(自定)。

5、通过cin依次输入三个角色的现金和存款(要求每个输入前有输入说明提示)。输入完后直接调用speak观看输出结果。输出结果必须按照资产由高到低的角色顺序输出。


 代码如下:

头文件(CR.h)代码如下:

#pragma once
#include <iostream>
using namespace std;

class fund {
public:
	static int iMoney;//平均资金
	static int sumMoney;//总资金
	friend class CRole; //友元类
	static int getsumMoney( );//得到总资金
	int getiMoney(int m, int i);//得到平均资产

};

class CRole {
private:
	char pName[10]; //角色名
	char pGoodWord[100];//好的口头禅
	char pBadWord[100];//坏的口头禅
	int iCash; //现金
	int iSaving;//存款
	static int iRoleNum;//角色人数
	friend class fund; 友元类
	int personmoney;//个人资产
public:
	friend void setmoney(fund x,CRole &a);//设置现金,存款
	friend void Speak(fund x,CRole& a);//输出
	int getiRoleNum();//得到角色人数
	const char *getpName();//得到角色名
	int getpersonmoney();//得到个人资产
	CRole(const char* name,const char *pGoodWord,const char *pBadWord);//构造函数,给角色属性赋值
	~CRole();//析构函数

};

main文件如下:

#include"CR.h"
#include<string>

int CRole::iRoleNum = 0;
int fund::iMoney = 0;
int fund::sumMoney = 0;
int CRole::getiRoleNum()//得到角色人数
{
	return iRoleNum;
}
const char *CRole::getpName()
{
	return pName;
}

CRole::CRole(const char* name, const char* GoodWord, const char* BadWord)//初始化
{
	iRoleNum++;
	strcpy_s(pName,name);
	strcpy_s(pGoodWord, GoodWord);
	strcpy_s(pBadWord, BadWord);
	cout << pName << "角色进入游戏" << endl;
}
CRole::~CRole() {
	cout << pName << "角色退出" << endl;
}
void setmoney(fund x,CRole &a)
{
	int x1, x2;
	cout << a.pName << "的现金和存款是(输入整数,用空格隔开):"<< endl;
	cin >> x1>>x2;
	a.iCash = x1;
	a.iSaving = x2;
	a.personmoney = x1 + x2;
	x.sumMoney += x1 + x2;
}
int fund::getsumMoney()
{
	return sumMoney;
}
int fund::getiMoney(int m, int i) {
	return iMoney=m / i;
}
int CRole::getpersonmoney( ) {
	return personmoney;
}

void Speak(fund x,CRole &a) {
	cout << "角色姓名:" << a.getpName() << "  角色资金:" << a.getpersonmoney();
	if (a.getpersonmoney() < x.getiMoney(x.getsumMoney(),a.getiRoleNum()))
	{
		cout<<"  口头禅:"<<a.pBadWord<<endl;
	}
	else
		cout << "  口头禅:"<<a.pGoodWord << endl;
}

void main() {
	 CRole *s[6] = {NULL};
	s[0] = new CRole("孙小美", "好的开始是成功的一半","还给人家啦");
	s[1] = new CRole("钱夫人", "你的是我的,我的还是我的", "老娘跟你没完");
	s[2] = new CRole("沙隆巴斯", "阿拉真主,我赞美你!", "人生不如意十有八九");
	s[3] = new CRole("张三", "我爱学习", "学习好难,还是玩游戏吧");
	s[4] = new CRole("李四", "我爱运动", "我还是躺着吧");
	cout <<"角色人数:"<< s[4]->getiRoleNum()<<endl;
	fund fd;
	for(int i = 0;i<s[0]->getiRoleNum();i++)
	{
		setmoney(fd,*s[i]);
	}
	cout << "总资金为:" << fd.getsumMoney( ) << endl;
	cout << "角色平均资产是:" << fd.getiMoney(fd.getsumMoney(), s[0]->getiRoleNum()) << endl;

	//重新排序
	for(int i=0;i<5;i++)
		for (int j = 0; j <5 - i; j++)
		{
			if (s[j]->getpersonmoney()<= s[j + 1]->getpersonmoney())
			{
				s[5] = s[j + 1];
				s[j + 1] = s[j];
				s[j] = s[5];
			}
		}

	for (int i = 0; i < s[0]->getiRoleNum(); i++)
	{
		Speak(fd,*s[i]);
	}

	for (int i = 0; i < s[0]->getiRoleNum(); i++)
	{
		char tmp;
		cout<<s[i]->getpName()<<"角色要退出吗?(y/x)"<<endl;
		cin >> tmp;
		if (tmp == 'y')
		{
			s[i]->~CRole();
		}
		else
		{
			cout << s[i]->getpName() << "角色待在游戏里,不退出" << endl;
			continue;
		}
	}

}

运行截图如下:


代码仅供参考

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值