【实验名称】数据的共享与保护

【实验目的】

1、观察程序运行中变量的作用域、生存期和可见性

2、学习类的静态成员、静态成员函数的使用

2、掌握友元函数的定义与使用

【实验原理】

在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

【实验内容】

1. 为某个自己设定的游戏设定玩家类Player,设计必要的成员变量/成员函数/构造函数等。在类中增加静态成员,用于记录当前已经注册的玩家数量,并设计静态成员函数用于访问该数据。在主函数中生成对象并进行测试。

代码(详细解释见注释):

#include<iostream>
#include <time.h>
#include <algorithm>
#include<string>
using namespace std;class player
{
public:player() {};player(string n, int a, string s, int I, int sh, int co, int at, int so, int an, int me, int bu, int pl);void character();//特性生成void show();//成员信息显示static void show_count();//显示人员总数static void show_y_count();//显示樱花庄情感信息static void express(player *peo[10]);//表白static void separate(player *peo[10]);//分手private:string name;//姓名int ages;//年龄string sex;//性别int blood;//血量int IQ;//智识int shooting;//射击int combat;//格斗int attract;//吸引力int social;//社交int animal;//驯兽int medical;//医疗int build;//建造int plant;//种植string my_character;//特性名称string my_details;//特性描述string my_effect;//特性效果string mate;//配偶static int count;//樱花庄人员总数static int y_count;//樱花庄有对象人员总数
};int player::count = 0;
int player::y_count = 0;//显示人员总数
void player::show_count()
{cout << "当前樱花庄成员总数:" << count << endl;
}//显示樱花庄情感信息
void player::show_y_count()
{cout << "当前樱花庄有对象成员总数:" << y_count << endl;cout << "当前樱花庄单身狗总数:" << count - y_count << endl;
}//初始化
player::player(string n, int a, string s, int I, int sh, int co, int at, int so, int an, int me, int bu, int pl)
{name = n;ages = a;;sex = s;blood = 100;IQ = I;shooting = sh;combat = co;attract = at;social = so;animal = an;medical = me;build = bu;plant = pl;mate = "无";cout << "冥冥之中自有天意...特性随机生成中" << endl;character();cout << "新的樱花庄成员诞生了!" << endl;count++;
}//特性随机生成
void player::character()
{string Character[10];string details[10];string effect[10];Character[0] = "冷枪手";Character[1] = "建筑工程师";Character[2] = "仿生学神学家";Character[3] = "乐天派";Character[4] = "悲观主义者";Character[5] = "倾国倾城";Character[6] = "丑陋";Character[7] = "聪明过头";Character[8] = "园艺专家";Character[9] = "格斗者";details[0] = "的枪法还不错,但他总是需要比别人花更久来瞄准目标";details[1] = "得益于父亲的熏陶,对于建筑的事情他简直是无所不知";details[2] = "感觉作为一个人类能做的事实在太有限了,做梦都在研究先进的仿生学部件";details[3] = "总是对他的情况有种积极的感觉,无论什么时候,无论什么情况";details[4] = "喜欢看生命中糟糕的一面";details[5] = "长得非常漂亮,有着貌美的面庞,人们往往在他张嘴说话之前就已经被倾倒";details[6] = "外貌太丑陋,那张脸生得好像就是一副现代抽象画,仅仅是看着他说话都需要鼓起很大的勇气";details[7] = "实在是机灵过人,他学起东西来比谁都快,但是偏向性比较严重";details[8] = "对园艺有一种特殊的爱好。他对每种一株植物都会觉得很高兴";details[9] = "喜欢近距离战斗,格斗技术非常不错,但他用起远程武器来就会很不开心";effect[0] = "射击+10";effect[1] = "建造+20";effect[2] = "医疗+8";effect[3] = "社交+10";effect[4] = "社交-10";effect[5] = "吸引力+15";effect[6] = "吸引力-15";effect[7] = "智识+12";effect[8] = "种植+8";effect[9] = "格斗+10";srand((unsigned)time(NULL));int flag = rand() % 10;my_character = Character[flag];my_details = name + details[flag];my_effect = effect[flag];if (flag == 0){shooting = min(100, shooting + 10);}else if (flag == 1){build = min(100, build + 20);}else if (flag == 2){medical = min(100, medical + 8);}else if (flag == 3){social = min(100, social + 10);}else if (flag == 4){social = max(0, social - 10);}else if (flag == 5){attract = min(100, attract + 15);}else if (flag == 6){attract = max(0, attract - 15);}else if (flag == 7){IQ = min(100, IQ + 12);}else if (flag == 8){plant = min(100, plant + 8);}else if (flag == 9){combat = min(100, combat + 10);}
}//显示成员信息
void player::show()
{cout << "*************************" << endl;cout << "姓名:" << name << endl;cout << "性别:" << sex << endl;cout << "年龄:" << ages << endl;cout << "血量槽:" << blood << endl;cout << "智识力:" << IQ << endl;cout << "射击力:" << shooting << endl;cout << "格斗力:" << combat << endl;cout << "吸引力:" << attract << endl;cout << "社交力:" << social << endl;cout << "驯兽力:" << animal << endl;cout << "医疗力:" << medical << endl;cout << "建造力:" << build << endl;cout << "种植力:" << plant << endl;cout << "特性名称:" << my_character << endl;cout << "特性描述:" << my_details << endl;cout << "特性效果:" << my_effect << endl;cout << "配偶:" << mate << endl;}//表白
void player::express(player *peo[10])
{string name1, name2;cout << "请输入表白者姓名:";cin >> name1;cout << "请输入被表白者姓名:";cin >> name2;int flag1, flag2;for (int i = 0; i < count; i++){if (name1 == peo[i]->name){flag1 = i;}else if (name2 == peo[i]->name){flag2 = i;}}if (peo[flag1]->mate == "无"){if (peo[flag2]->mate == "无"){if (peo[flag1]->attract >= peo[flag2]->social){cout << "表白成功!" << endl;peo[flag1]->mate = peo[flag2]->name;peo[flag2]->mate = peo[flag1]->name;y_count = y_count + 2;}else{cout << peo[flag1]->name << "的吸引力<" << peo[flag2]->name << "的社交力" << endl;cout << "表白失败!" << endl;}}else{cout << peo[flag2]->name << "已经有对象" << peo[flag2]->mate << endl;}}else{cout << peo[flag1]->name << "已经有对象" << peo[flag1]->mate << endl;}
}//分手
void player::separate(player *peo[10])
{string name1, name2;cout << "请输入分手者姓名:";cin >> name1;cout << "请输入被分手者姓名:";cin >> name2;int flag1, flag2;for (int i = 0; i < count; i++){if (name1 == peo[i]->name){flag1 = i;}else if (name2 == peo[i]->name){flag2 = i;}}if (peo[flag1]->mate != "无"){if (peo[flag2]->mate != "无"){if (peo[flag1]->mate == peo[flag2]->name&&peo[flag2]->mate == peo[flag1]->name){cout << peo[flag1]->name << "和" << peo[flag2]->name << "分手了!" << endl;y_count = y_count - 2;peo[flag1]->mate = "无";peo[flag2]->mate = "无";}else{cout << "他两不是一对!" << endl;}}else{cout << peo[flag2]->name << "还没对象呢!" << endl;}}else{cout << peo[flag1]->name << "还没对象呢!" << endl;}
}int main()
{cout << "**********************************" << endl;cout << "***       欢迎来到樱花庄       ***" << endl;cout << "*** 1.显示樱花庄成员信息       ***" << endl;cout << "*** 2.表白                     ***" << endl;cout << "*** 3.分手                     ***" << endl;cout << "*** 4.显示樱花庄感情情况       ***" << endl;cout << "*** 5.退出樱花庄               ***" << endl;cout << "**********************************\n" << endl;player *peo[10];int ans;cout << "请输入待进驻樱花庄的人员数:";cin >> ans;string name;//姓名int ages;//年龄string sex;//性别int IQ;//智识int shooting;//射击int combat;//格斗int attract;//吸引力int social;//社交int animal;//驯兽int medical;//医疗int build;//建造int plant;//种植//输入信息for (int i = 0; i < ans; i++){cout << "***    输入玩家信息    ***" << endl;cout << "请输入姓名:";cin >> name;cout << "请输入性别:";cin >> sex;cout << "请输入年龄:";cin >> ages;cout << "请输入智识力:";cin >> IQ;cout << "请输入射击力:";cin >> shooting;cout << "请输入格斗力:";cin >> combat;cout << "请输入吸引力:";cin >> attract;cout << "请输入社交力:";cin >> social;cout << "请输入驯兽力:";cin >> animal;cout << "请输入医疗力:";cin >> medical;cout << "请输入建造力:";cin >> build;cout << "请输入种植力:";cin >> plant;peo[i] = new player(name, ages, sex, IQ, shooting, combat, attract, social, animal, medical, build, plant);cout << endl;}int flag;while (true){cout << "\n请选择功能:";cin >> flag;if (flag == 1){//显示樱花庄成员信息player::show_count();for (int i = 0; i < ans; i++){peo[i]->show();}cout << endl;}else if (flag == 2){//表白player::express(peo);}else if (flag == 3){//分手player::separate(peo);}else if (flag == 4){//显示樱花庄感情情况player::show_count();player::show_y_count();}else if (flag == 5){//退出cout << "成功退出!" << endl;break;}}return 0;
}

运行演示:

2. 设计两个道具类Helm和Armor,设计必要的成员变量/成员函数/构造函数等,其中要求必须有成员变量valueOfDefense。在外部定义一个友元函数,可以读取该数据成员。在主函数中生成对象并进行测试。

代码(详细解释见注释):

#include<iostream>
#include <time.h>
#include <algorithm>
#include<string>
using namespace std;
class player;
void attack(player *peo[10]);
class helm
{
public:friend player;friend void attack(player *peo[10]);helm(){value_of_defense = 0;durability = 0;gem = 0;};helm(int v, int d, int g);void show();
private:int value_of_defense;//防御力int durability;//耐久次数int gem;//宝石
};class armor
{
public:friend player;friend void attack(player *peo[10]);armor(){value_of_defense = 0;durability = 0;gem = 0;};armor(int v, int d, int g);void show();
private:int value_of_defense;//防御力int durability;//耐久int gem;//宝石
};class player
{
public:friend void attack(player *peo[10]);player() {};player(string n, int a, string s, int co);void show();//成员信息显示static void show_count();//显示人员总数void equip_helm();void equip_armor();private:string name;//姓名int ages;//年龄string sex;//性别int blood;//血量int combat;//格斗helm *my_helm;//头盔armor *my_armor;//护甲static int count;//人员总数
};int player::count = 0;//装备护甲
void player::equip_armor()
{int value_of_defense;//防御力int durability;//耐久int gem;//宝石cout << "请输入护甲防御力:";cin >> value_of_defense;cout << "护甲耐久次数:";cin >> durability;cout << "护甲宝石等级:";cin >> gem;my_armor = new armor(value_of_defense, durability, gem);
}//装备头盔
void player::equip_helm()
{int value_of_defense;//防御力int durability;//耐久int gem;//宝石cout << "请输入头盔防御力:";cin >> value_of_defense;cout << "头盔耐久次数:";cin >> durability;cout << "头盔宝石等级:";cin >> gem;my_helm = new helm(value_of_defense, durability, gem);
}void attack(player *peo[10])
{int p1, p2;cout << "请输入格斗两人的编号:";cin >> p1 >> p2;p1--; p2--;int temp;while (true){temp = max(0, (peo[p1]->combat - peo[p2]->my_armor->value_of_defense - peo[p2]->my_helm->durability));peo[p2]->blood = peo[p2]->blood - temp;cout << peo[p1]->name << "对" << peo[p2]->name << "造成了" << temp << "点伤害" << endl;peo[p2]->my_armor->durability--;peo[p2]->my_helm->durability--;if (peo[p2]->my_armor->durability == 0){cout << "***" << peo[p2]->name << "的护甲损坏了" << "***" << endl;peo[p2]->my_armor->value_of_defense = 0;}if (peo[p2]->my_helm->durability == 0){cout << "***" << peo[p2]->name << "的头盔损坏了" << "***" << endl;peo[p2]->my_helm->value_of_defense = 0;}if (peo[p2]->blood <= 0){cout << "***" << peo[p1]->name << "战胜了" << peo[p2]->name << "***" << endl;break;}temp = max(0, (peo[p2]->combat - peo[p1]->my_armor->value_of_defense - peo[p1]->my_helm->durability));peo[p2]->blood = peo[p2]->blood - temp;cout << peo[p2]->name << "对" << peo[p1]->name << "造成了" << temp << "点伤害" << endl;peo[p1]->my_armor->durability--;peo[p1]->my_helm->durability--;if (peo[p1]->my_armor->durability == 0){cout << "***" << peo[p1]->name << "的护甲损坏了" << "***" << endl;peo[p1]->my_armor->value_of_defense = 0;}if (peo[p1]->my_helm->durability == 0){cout << "***" << peo[p1]->name << "的头盔损坏了" << "***" << endl;peo[p1]->my_helm->value_of_defense = 0;}if (peo[p1]->blood <= 0){cout << "***" << peo[p2]->name << "战胜了" << peo[p1]->name << "***" << endl;break;}}}//显示人员总数
void player::show_count()
{cout << "当前格斗场人员总数:" << count << endl;
}//初始化
player::player(string n, int a, string s, int co)
{name = n;ages = a;;sex = s;blood = 200;combat = co;my_helm = NULL;my_armor = NULL;cout << "新的格斗者诞生了!" << endl;count++;
}//显示成员信息
void player::show()
{cout << "*************************" << endl;cout << "姓名:" << name << endl;cout << "性别:" << sex << endl;cout << "年龄:" << ages << endl;cout << "血量槽:" << blood << endl;cout << "格斗力:" << combat << endl;if (my_helm != NULL){my_helm->show();}if (my_armor != NULL){my_armor->show();}
}helm::helm(int v, int d, int g)
{value_of_defense = v;durability = d;gem = g;cout << "宝石嵌入中..." << endl;cout << "头盔防御力+" << g * 10 << endl;value_of_defense = value_of_defense + g * 10;cout << "嵌入完成" << endl;
}void helm::show()
{cout << "头盔防御力:" << value_of_defense << endl;cout << "头盔耐久次数:" << durability << endl;cout << "头盔宝石等级:" << gem << endl;
}armor::armor(int v, int d, int g)
{value_of_defense = v;durability = d;gem = g;cout << "宝石嵌入中..." << endl;cout << "护甲防御力+" << g * 10 << endl;value_of_defense = value_of_defense + g * 10;cout << "嵌入完成" << endl;
}void armor::show()
{cout << "护甲防御力:" << value_of_defense << endl;cout << "护甲耐久次数:" << durability << endl;cout << "护甲宝石等级:" << gem << endl;
}int main()
{cout << "********************************" << endl;cout << "***      欢迎来到格斗场      ***" << endl;cout << "*** 1.显示格斗场成员信息     ***" << endl;cout << "*** 2.装备头盔               ***" << endl;cout << "*** 3.装备护甲               ***" << endl;cout << "*** 4.决斗                   ***" << endl;cout << "*** 5.退出格斗场             ***" << endl;cout << "********************************\n" << endl;player *peo[10];int ans;cout << "请输入待进驻格斗场的人员数:";cin >> ans;string name;//姓名int ages;//年龄string sex;//性别int combat;//格斗//输入信息for (int i = 0; i < ans; i++){cout << "***    输入玩家信息    ***" << endl;cout << "请输入姓名:";cin >> name;cout << "请输入性别:";cin >> sex;cout << "请输入年龄:";cin >> ages;cout << "请输入格斗力:";cin >> combat;peo[i] = new player(name, ages, sex, combat);cout << endl;}int flag;while (true){cout << "\n请选择功能:";cin >> flag;if (flag == 1){//显示格斗场成员信息player::show_count();for (int i = 0; i < ans; i++){peo[i]->show();}cout << endl;}else if (flag == 2){int i;cout << "要为第几个人装备头盔:";cin >> i;peo[i-1]->equip_helm();}else if (flag == 3){int i;cout << "要为第几个人装备护甲:";cin >> i;peo[i-1]->equip_armor();}else if (flag == 4){attack(peo);}else if (flag == 5){//退出cout << "成功退出!" << endl;break;}}return 0;
}

运行演示:

【小结或讨论】

这次的实验感觉并不是很难吧,静态成员和友元也是比较好理解和掌握的。在一开始,我还不知道存在静态成员和友元时,我就在写代码时就遇到了如定义成员总数和一个类调用另一个类的私有变量的问题(记得当时不得不把private改成了public)。但血量静态成员和友元后,这些问题就豁然开朗,也让我觉得这两者的创立,特别是友元类、友元函数,是非常有必要的。

这次实验总体上比较顺利,唯一让我有点卡住的是第二题的友元声明那一块。我的player类是基于helm和armor建立的,不能使用简单的类的前置声明,所以我就把这两个类放到了player的前面。我一开始把attack函数写在player类里,所以不但要把attack声明友元函数还要前置声明attack函数本身,但是这样player定义在helm和armor类之前就不行(其实直接声明友元类即可解决,但我还想试一试声明友元函数),所以我还是把attack单独提出来了才声明成功,然后发现player中的两个装备定义的是指针,还是不能直接访问私有成员,所以额外添加了两个友元类声明,最后实验成功。

但还是那句话,这样的实验并不科学,一些无聊的“自由发挥”实在没有必要。绝对不是一种值得提倡的方式。

C++实验5 游戏玩家类Player、两个道具类Helm和Armor相关推荐

  1. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  2. 游戏玩家的“梦想”,ROG Phone 6出圈,双USB-C,还有两个屏幕?

    华硕周二推出了他们最新的智能手机,专为游戏玩家而设计:The and .ROG Phone 6 and 6 Pro. ROG Phone 6系列的游戏体验始于显示屏.两款手机均使用6.78英寸AMOL ...

  3. 持久化技术——游戏玩家信息管理(基于 SQLite)

    如果对SQLite还有疑惑(・∀・(・∀・(・∀・*) 不妨先阅读一下之前的一篇文章 https://blog.csdn.net/nishigesb123/article/details/892027 ...

  4. DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年

    翻译|刘晓祯.沈佳丽.胡燕君.许晨阳.周亚坤 很少有人会否认,过去十年,AI领域最耀眼的明星组织当属DeepMind,没有之一. 那个震动世界的高光时刻发生在2016年3月的一天,AI选手AlphaG ...

  5. UnityStandardAsset工程、源码分析_4_赛车游戏[玩家控制]_摄像机控制

    上一章地址:UnityStandardAsset工程.源码分析_3_赛车游戏[玩家控制]_特效.声效 经过前几章的分析,我们已经大致地了解了车辆控制相关的脚本.现在还有最后一个与玩家体验息息相关的部分 ...

  6. 武汉理工大学数据结构综合实验——连连看游戏综合实践

    文章目录 实验目的 主要仪器设备及耗材 一.实验要求 二.分析与设计(非线性结构) 1.数据结构的设计 2.核心算法设计 一条直线消子 两条直线消子 三条直线消子 初始化游戏地图 搜寻路径 提示和重排 ...

  7. Unity3D中开发2D游戏——游戏玩家的出生、无敌、死亡方法

    关于2D游戏中游戏玩家的出生.无敌.死亡方法可以通过如下一个小实例详细讲解 我们小时候都玩过一款游戏--坦克大战 所以此实例为如何实现玩家坦克的出生.无敌.以及死亡方法 首先我们制作一个出生动画特效 ...

  8. 游戏玩家行为基本模式的初探小汇

    众所周知,游戏的设计应该以玩家为中心,游戏的成功与否决定于玩家对此款游戏的满意度.那么,玩家在游戏中究竟是处于一种什么样的位置?玩家有哪些基本的行为?笔者玩游戏多年,也作了一些研究,并于最近整理出了一 ...

  9. 我的世界java版联机不稳定_完善自己:“联机版游戏玩家”如何通过社交完善自己,这个社交跟你想的也许不一样1.0...

    点击左上角关注 暖暖桃林,获得更多图文 完善自己:"联机版游戏玩家"如何通过社交完善自己,这个社交跟你想的也许不一样1.0 假设我们在这个社会上,在这个世界上存在,是作为一款游戏 ...

最新文章

  1. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据
  2. ntfs分配单元大小怎么选_星月菩提尺寸大小怎么选
  3. 【转】 看IT人才最容易犯的17个错误
  4. 标准模板库(STL)之 vector 列传
  5. 教你一招!在Mac上使用自带的程序创建加密的文件磁盘
  6. [软件启动就报错退出]的问题解决
  7. 【非原创】python调用bartender操控打印机打印条码
  8. numpy.asarray()函数
  9. 【商城秒杀项目】-- 项目总结
  10. css动画:多个行星围绕中心恒星旋转
  11. vultr服务器win系统怎么重置密码,Windows RT 重置登录密码操作方法图文教程
  12. 【Java】文如何制作帮助文档
  13. 剑三重制版怎么同步插件_剑网三重制版茗伊插件怎么导入 | 手游网游页游攻略大全...
  14. Linux ps 命令
  15. 《与熊共舞》第一章--逆“风”而行
  16. 《数字恐龙》为了一次配种,他们努力了半年
  17. 油猴浏览器插件含下载安装使用教程(附赠脚本)
  18. Petri网-2、有向网
  19. 全网最简单的软渲染器
  20. android添加横幅广告,Android关于横幅banner广告的实现

热门文章

  1. Java-常用实现分页查询
  2. 关于vtt 与 srt 字幕 的相互转换
  3. 3D全景模型展示可视化技术演示
  4. 单元测试中 Right-BICEP 和 CORRECT
  5. html控制台 打印 consol,浏览器console.log()打印输出台不显示输出内容……
  6. Android opengl es 3.0 + ndk 绘画涂鸦项目
  7. 蚂蚁金服开发文档中心
  8. 19年拿了19个诺贝尔奖,日本科学为何“井喷”?
  9. 《图解TCP/IP》——第一章 网络基础知识
  10. 举头望明月打计算机术语,有趣的中秋节灯谜