C++ “电子宠物游戏”
完整源码
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std; struct Food{string name;int consume;
}F[4];//食物库 //以下所有bool函数遵循成功执行该项操作返回true,否则返回false的原则
class Pet
{protected:char sex;//性别 char kind;//类别 int fd;//饱食度 int hd;//愉悦度 int wt;//体重int cd;//清洁度public:Pet(char s,char k);//由玩家初始化公母和宠物类型 void showstatus();//展示状态 void refresh();//休息回血 virtual bool play()=0;//玩耍 virtual void getfeed(int id)=0;//接受喂食virtual bool getclean(int pd)=0;//被主人清洁void limit();//限制各种度 } ;void Pet::limit(){if(fd<0) fd = 0;if(hd<0) hd = 0;if(wt<0) wt = 0;if(cd<0) cd = 0;}void Pet::refresh(){hd+=30;cd-=5;fd-=60;limit();}void Pet::showstatus(){cout<<"当前宠物的状态为:"<<endl;cout<<"体重:"<<wt<<endl<<"饱食度:"<<fd<<endl<<"愉悦度:"<<hd<<endl<<"清洁度:"<<cd<<endl; }class Cat: public Pet{public:friend class Player;Cat(char s,char k):Pet(s,k){;}virtual void getfeed(int id);//接受喂食 virtual bool getclean(int pd);//接受清洁 virtual bool play();//玩耍 void sadcat(int n);//非交互时间扣分 bool selfclean();//自洁 bool catchm();//捉老鼠friend bool catcal(Cat& c);//结算函数,用在一次成功操作末尾,对一次行为结算 };class Dog:public Pet{public:friend class Player;Dog(char s,char k):Pet(s,k){;}virtual void getfeed(int id);virtual bool getclean(int pd);virtual bool play(); void saddog(int n);friend bool dogcal(Dog& d);};class Player{public:Player();void Show(); //展示玩家状态 int Gett();//获取时间 void Sett(int n);//修改时间,当前时间+n void Setp(int n);//修改体力,当前体力+n bool Tutor();//家教bool Waiter();//麦当劳兼职bool Mowing();//割草bool PurchaseFood();//购买宠物粮食int Feed();//给宠物喂食,返回食物编号,不成功返回0 void Rest();//休息bool Play();//跟宠物玩耍bool Clean();//清洗宠物void Sleep();//睡眠 bool judge(int a,int b,int c);//判断玩家状态void Archive(char flag,Dog dog,Cat cat,int day1,int pa1,int pa2,int pa3);//存档 void Read(char flag,Dog& dog,Cat& cat,int& day1,int& pa1,int& pa2,int& pa3);//读档 private:int power;int money;int time;int foodbase[4];//食物数量
};void Player::Archive(char flag,Dog dog,Cat cat,int day1,int pa1,int pa2,int pa3){//存档 ofstream Data("Database.txt");//利用构造函数创建txt文本,并且打开该文本fstream file("Database.txt", ios::out);Data <<this->power<<endl<<this->money<<endl<<this->time<<endl<<this->foodbase[1]<<endl<<this->foodbase[2]<<endl<<this->foodbase[3]<<endl;if(flag == 'g'){Data <<dog.sex<<dog.kind<<endl<<dog.fd<<endl<<dog.hd<<endl<<dog.wt<<endl<<dog.cd;}else{Data <<cat.sex<<cat.kind<<endl<<cat.fd<<endl<<cat.hd<<endl<<cat.wt<<endl<<cat.cd;}Data <<endl<<day1<<endl<<pa1<<endl<<pa2<<endl<<pa3;Data.close();//关闭Database.txt文件
}void Player::Read(char flag,Dog& dog,Cat& cat,int& day1,int& pa1,int& pa2,int& pa3){//读档 ifstream ReadData("Database.txt");ReadData >>this->power>>this->money>>this->time>>this->foodbase[1]>>this->foodbase[2]>>this->foodbase[3];if(flag == 'g'){ReadData >>dog.sex>>dog.kind>>dog.fd>>dog.hd>>dog.wt>>dog.cd>>day1>>pa1;}else{ReadData >>cat.sex>>cat.kind>>cat.fd>>cat.hd>>cat.wt>>cat.cd>>day1>>pa1>>pa2>>pa3;}ReadData.close();//关闭Database.txt文件
}Pet::Pet(char s,char k){sex=s;kind=k;fd=100;hd=100;cd=100;if(s=='g'&&k=='m')wt=10;else if(s=='m'&&k=='m')wt=6;else wt=45;}bool Dog::play(){if(hd<30) {cout<<"操作失败!宠物已经很不高兴了,它拒绝与你玩耍!"<<endl; return false;} else{cout<<"操作成功!宠物更爱你了呢!"<<endl;fd-=40;hd+=70;cd-=10;limit();return true;}}void Dog::getfeed(int id){cout<<"汪汪汪!";if(id==1){fd+=30;hd+=10;cd-=15;}else if(id==2){fd+=50;hd+=40;cd-=5;} else{fd+=20;hd+=30;cd-=20;} limit(); }bool Dog::getclean(int pd) {if(hd<70){cout<<"操作失败!宠物貌似不太高兴,你竟敢逼它洗澡!"<<endl;return false;} else{cout<<"操作成功!你已成功为它洗澡。它现在是一条干净的狗狗了!" <<endl;cd+=100;return true;}} void Dog::saddog(int n){hd=hd-n*20;fd=fd-n*20;cd=cd-n*20;limit();}bool Cat::play(){if(hd<30){cout<<"操作失败!宠物已经很不高兴了,它拒绝与你玩耍!"<<endl; return false;} else{cout<<"操作成功!宠物更喜欢你了呢!"<<endl;fd-=20;hd+=30;cd-=10;limit();return true;}}void Cat::getfeed(int id){cout<<"喵喵喵~"<<endl;if(id==1){fd+=30;hd+=10;cd-=15;}else if(id==2){fd+=50;hd+=40;cd-=5;} else{fd+=20;hd+=30;cd-=20;} limit();}bool Cat::getclean(int pd){int mark;if(hd<=90) {cout<<"操作失败!宠物貌似不太高兴,你竟敢逼它洗澡!"<<endl;return false;} else if (pd<30) {cout<<"洗澡间隔太短了吧喵~"<<endl;cout<<"是否强行清洗(是1,否0):";cin>>mark;if(mark){cout<<"哼~等着主子发飙吧!"<<endl;hd-=50;cd+=100;limit();return true;} else{cout<<"明智的选择!该项操作被撤回!"<<endl; return false;}}else if(cd>80) {cout<<"主子已经很干净了!"<<endl;cout<<"是否强行清洗(是1,否0):";cin>>mark;if(mark){cout<<"哼~等着主子发飙吧!"<<endl;hd-=50;cd+=100;limit();return true;} else{cout<<"明智的选择!该项操作被撤回!"<<endl; return false;}} else{cout<<"操作成功!你已成功为它洗澡。它现在是一只干净的猫咪了!" <<endl;cd+=100;return true;}} void Cat::sadcat(int n){fd=fd-n*20;cd=cd-n*5;limit();}bool Cat::selfclean(){int x;x=rand()%10;if(x==1||x==2||x==3)//自洁被触发 {cout<<"随机事件自洁被触发!当前交互失效且扣除1时间!"<<endl;cd+=30;return true;}return false;} bool Cat::catchm(){int x;x=rand()%10;if(x==1||x==2)//自洁被触发 {cout<<"随机事件猫捉鼠被触发!当前交互失效且扣除1时间!"<<endl; if(fd<50){cout<<"嗝儿~猫吃掉了老鼠!"<<endl;fd+=40;cd-=30;hd+=5;}else{cout<<"吓!猫咪和老鼠玩起了游戏,要命的那种~"<<endl;fd-=20;cd-=10;hd+=40;}limit();return true;}return false;}bool dogcal(Dog& d){if(d.fd<=0){d.hd-=10;d.wt-=2;d.limit();}if(d.fd>=100)d.wt+=2;if(d.wt<30||d.wt>60)d.hd-=10;if(d.cd<=0)d.hd-=30;d.limit();if(d.cd>80)d.hd+=10;if(d.wt<15||d.wt>75){cout<<"当前体重为"<<d.wt<<",超出允许范围,宠物死亡,游戏结束!";return true; }if(d.hd<=0){cout<<"你不是一个合格的主人,宠物已经离家出走了!游戏结束!";return true;}return false;}bool catcal(Cat& c){if(c.fd<=0){c.hd-=10;c.wt-=1;c.limit();}if(c.fd>=100)c.wt+=1;if(c.sex=='m'){if(c.wt<4||c.wt>8)c.hd-=10;}if(c.sex=='g'){if(c.wt<8||c.wt>12)c.hd-=10;}if(c.cd<=0)c.hd-=30;c.limit();if(c.cd>80)c.hd+=10;if((c.wt<4||c.wt>16)&&(c.sex=='g')){cout<<"当前体重为"<<c.wt<<",超出允许范围,宠物死亡,游戏结束!";return true; }if((c.wt<2||c.wt>10)&&(c.sex=='m')){cout<<"当前体重为"<<c.wt<<",超出允许范围,宠物死亡,游戏结束!";return true; }if(c.hd<=0){cout<<"你不是一个合格的主人,宠物已经离家出走了!游戏结束!";return true;}return false;}Player::Player(){memset(foodbase,0,sizeof(foodbase));power=100;money=0;time=7;
}void Player::Show()
{cout<<"当前玩家状态为:"<<endl;cout<<"体力:"<<power<<endl<<"金钱:"<<money<<endl<<"时间:"<<time<<endl; cout<<"食物库状态:"<<endl;cout<<"1号食物:"<<foodbase[1]<<" ";cout<<"2号食物:"<<foodbase[2]<<" ";cout<<"3号食物:"<<foodbase[3]<<" "<<endl;
}int Player::Gett()
{return time;
}void Player::Sett(int n)
{time+=n;
}void Player::Setp(int n)
{power+=n;
}bool Player::Tutor()//家教
{int pt=power-30,mt=money+50,ti=time-2;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;return true;}return false;
}bool Player::Waiter()//麦当劳兼职
{int pt=power-70,mt=money+120,ti=time-4;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;return true;}return false;
}bool Player::Mowing()//割草
{int pt=power-20,mt=money+20,ti=time-1;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;return true;}return false;
}bool Player::PurchaseFood()//购买宠物粮食
{int id;cout<<"输入期望购买的食物编号"<<endl;cin>>id;int pt=power-20,ti=time-1,mt=money-F[id].consume;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;foodbase[id]++;return true;}return false;
}int Player::Feed()//给宠物喂食
{int id;cout<<"输入期望投喂的食物编号:";cin>>id;if(foodbase[id]==0){cout<<"操作失败!你还没有该款食物哦!"<<endl;return 0;}else{int pt=power-20,ti=time-1,mt=money;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;foodbase[id]--;return id;}elsereturn 0;}
}void Player::Rest()//休息
{int pt=power+50,ti=time-1,mt=money;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;}
}bool Player::Play()//跟宠物玩耍
{int ti=time-1,pt=power-50,mt=money;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;return true;}return false;
}bool Player::Clean()//清洗宠物
{int ti=time-1,pt=power-30,mt=money;if(judge(pt,mt,ti)){power=pt;money=mt;time=ti;return true;}return false;
}void Player::Sleep()//睡眠,仅在一天结束时发生
{power=100;//恢复全部体力 time=7;//重置时间
} bool Player::judge(int a,int b,int c)//判断玩家状态
{if(a<0){cout<<"行动失败!体力不足,请立即休息。"<<endl;return false;}if(b<0){cout<<"购买失败!金币不足,快去打工赚钱吧。"<<endl;return false;}if(c<0){cout<<"时间不够啦,换件事做做吧。"<<endl;return false;}else if(c==0){cout<<"时间已耗尽,当前操作结束后将强制进入休息状态!"<<endl;time=0; money=b;return true;//这里必须返回真,因为这算操作成功,而不是失效 }return true;
}int main(){ F[1].name="aa";F[1].consume=30;F[2].name="bb";F[2].consume=60;F[3].name="cc";F[3].consume=20;srand((int)time(NULL));Player P;char chioce,sel; int day=30,passday=0;cout<<"选择宠物的种类(g==狗子,c==猫咪):";cin>>chioce;if(chioce=='g'){Pet* A; Dog D('g','g');Cat CC('g','m');A =& D; bool flag1=true,flag2=true;cout<<"是否读档(0.否 1.是):";int du;cin>>du;if(du){int temp1,temp2;P.Read(chioce,D,CC,day,passday,temp1,temp2);goto loop;} while(day--&&flag1){while(P.Gett()!=0&&flag2){loop:cout<<endl;P.Show();cout<<endl;D.showstatus();cout<<endl;int ch;cout<<"输入想要进行的活动的编号(1.打工2.买狗粮3.喂狗子4.小憩一会5.陪狗子玩耍6.给狗子洗澡):";cin>>ch;if(ch==1){cout<<"输入打工类型(1.做家教2.去麦当劳兼职3.割草):";int chh;cin>>chh;if(chh==1){if(P.Tutor())D.saddog(2);else goto loop;}else if(chh==2){if(P.Waiter())D.saddog(4);else goto loop;}else if(chh==3) {if(P.Mowing())D.saddog(1);else goto loop;}}else if(ch==2){if(P.PurchaseFood())D.saddog(1);else goto loop;}else if(ch==3) {int temp=P.Feed();if(temp){D.getfeed(temp);}else goto loop;}else if(ch==4){P.Rest();D.saddog(1);}else if(ch==5){if(P.Play()){if(!D.play()){P.Sett(1);P.Setp(50);//若宠物不玩,操作失效撤回 goto loop;}}else goto loop;} else if(ch==6) {if(P.Clean()){if(!D.getclean(10)){P.Sett(1);P.Setp(30);goto loop;}}else goto loop;}if(dogcal(D)){flag1=flag2=false;}}passday++;cout<<"第"<<passday<<"天结束!"<<endl; P.Sleep(); D.refresh();cout<<"是否存档?(0.否 1.是):";int cun;cin>>cun;if(cun){P.Archive(chioce,D,CC,day,passday,0,0);cout<<"游戏结束!"<<endl;break;} }cout<<endl;P.Show();cout<<endl;D.showstatus();cout<<endl;}else{cout<<"选择宠物性别(g.公猫 m.母猫):"<<endl;cin>>sel;Pet* A;Cat C(sel,'m');Dog DD('g','g');A =& C;bool flag1=true,flag2=true;int pred=-6,prec = 0;//为了计算洗澡间隔的变量 cout<<"是否读档(0.否 1.是):";int du;cin>>du;if(du){P.Read(chioce,DD,C,day,passday,pred,prec);goto loopp;} while(day--&&flag1){while(P.Gett()!=0&&flag2){loopp:cout<<endl;P.Show();cout<<endl;C.showstatus();cout<<endl;int ch;cout<<"输入想要进行的活动的编号输入想要进行的活动的编号(1.打工2.买猫粮3.喂猫咪4.小憩一会5.陪猫咪玩耍6.给猫猫洗澡):";cin>>ch;if(C.selfclean()||C.catchm()){P.Sett(-1);}else{if(ch==1){cout<<"输入打工类型(1.做家教2.去麦当劳兼职3.割草):";int chh;cin>>chh;if(chh==1){if(P.Tutor())C.sadcat(2);else goto loopp;}else if(chh==2){if(P.Waiter())C.sadcat(4);else goto loopp;}else{if(P.Mowing())C.sadcat(1);else goto loopp;}}else if(ch==2){if(P.PurchaseFood())C.sadcat(1);else goto loopp;}else if(ch==3){int temp=P.Feed();if(temp){C.getfeed(temp);}else goto loopp;}else if(ch==4){P.Rest();C.sadcat(1);}else if(ch==5){if(P.Play()){if(!C.play()){P.Sett(1);P.Setp(50); goto loopp;}}else goto loopp;} else if(ch==6) {if(P.Clean()){if(!C.getclean(7*(passday-pred-1)+prec-P.Gett()+6)){pred = passday;prec = P.Gett();P.Sett(1);P.Setp(30);goto loopp;}}else goto loopp;}//需要注意,若操作失效被撤回 ,不应当执行下面语句 ,故每句都有跳跃判断 if(catcal(C)){flag1=flag2=false;}}}//内层while结束,代表一天结束 passday++;cout<<"第"<<passday<<"天结束!"<<endl; P.Sleep();C.refresh();cout<<"是否存档?(0.否 1.是):";int cun;cin>>cun;if(cun){P.Archive(chioce,DD,C,day,passday,pred,prec);cout<<"游戏结束!"<<endl;break;}}cout<<endl;P.Show();cout<<endl;C.showstatus();cout<<endl;}return 0;}
实验报告
电子宠物游戏
一、 问题描述
(1)完成玩家类设计和代码实现,并测试独立行为;
(2) 宠物类的设计,宠物类必须思考相关公共部分,并抽象为宠物基类,猫和狗均继承自该基类,完成抽象类和具体类的设计。根据设计,完成代码。(3)在设计阶段画出公共属性和方法,能有效帮助抽象设计,画出猫和狗各自独立的内容,能有效帮助多态设计,活用虚函数,完成猫 和狗的多态性实现;并测试各独立行为。
二、 分析设计
第一阶段:
1.程序架构:
玩家类的架构:
分别声明展示玩家状态函数Show(),获取时间Gett(),打工三个函数Waiter()麦当劳兼职,Tutor()家教,Moving()割草,PurchaseFood()购买宠物粮食,Feed()给宠物喂食,Rest()休息,Play()和宠物玩耍,Clean()清洗宠物,Sleep()睡眠,judje()判断玩家状态是否能完成目前操作,Archive()进行存档,Read()进行读档。
2.函数设计
展示玩家状态函数Show()是类成员函数直接可以展示玩家的那些状态(体力、金钱、时间、食物库)私有成员,直接cout输出,Rest()、Sleep()函数也是类似的直接对玩家类的私有数据成员进行修改。三个打工函数Tutor()、Waiter()、Moving函数也是由指导书规定进行对玩家类私有数据成员进行修改。judje()函数就比较特殊,在所有的改变玩家类私有数据成员的函数内都必须调用,因为玩家各项操作都有各种代价,比如体力的流失、金钱的减少、时间的流逝等等,所以必须判定玩家是否能完成本次操作,如果条件不符合需要进行输出提示并且将操作撤销。而PurchaseFood()购买宠物粮食,Feed()给宠物喂食, Play()和宠物玩耍,Clean()清洗宠物等操作则是与宠物类之间的交互,第一阶段先搁置,只留好接口等第二阶段设计。而Archive()进行存档,其实是引用头文件#include 然后对文件进行操作,建立一个名为Database的txt文件,然后逐行往里面写入玩家和宠物的状态数据。随后可以调用Read()进行读档,将玩家类和宠物类的属性数据按顺序写入。
基类:Pet类(抽象基类)
基类中的数据成员和成员函数都是接下来需要设计的猫、狗继承类所需要用到的公共部分,体现在数据成员上是衡量宠物状态的四个指标。即饱食度,愉悦度,体重及清洁度。
而基类的成员函数其实就是宠物的共同行为,即每天结束时的休息行为,玩耍行为,接受喂食和接受洗澡的行为。除了休息行为猫和狗完全相同以外,其它行为都有所差别,所以这里将它们声明为纯虚函数,以便在基类中重载,完成猫和狗的多态性实现。
子类:Dog类(具体类,继承了Pet类)
子类Dog类继承自抽象基类Pet类,对玩耍,接受喂食,接受洗澡的函数进行重载,以实现狗做出以上行为时产生的影响。除此之外,还添加了两个处理状态的函数。saddog函数用于处理非交互时间对狗的状态产生的影响,而dogcal函数用于一天结束时对狗状态的结算,因为需要访问类的私有成员,故在这里声明为友元函数。
子类:Cat类(具体类,继承了Pet类)
子类Cat类继承自抽象基类Pet类,对玩耍,接受喂食,接受洗澡的函数进行重载,以实现猫做出以上行为时产生的影响。同Dog类一样,这里还添加了两个处理状态的函数,具体功能这里不再赘述。而与Dog类不同的是,猫多了两个行为,分别是自洁和捉老鼠。所以还需要向Cat类添加这两个函数以实现猫的各种行为。
关键功能实现
- void Dog::getfeed(int id) //狗的喂食函数
思想:喂食狗以后,狗先发出叫声,之后通过传来的参数ID对应食物的种类,使狗的相应状态指标升高或降低。
2. bool Dog::dogcal(Dog& d) //狗的结算函数
思想:根据题目要求,每天结束后,狗的各种状态指标会相互影响。具体而言,饱食度会影响体重和愉悦度,体重和清洁度会影响愉悦度。每天结算完成后,应当判断体重和愉悦度是否正常,若超出给定范围,则判定游戏结束,返回false,否则返回true。
3. bool Cat::catchm() 猫捉鼠的行为函数
思想:根据题意,猫捉鼠是一个给定了概率的随机触发行为。为了实现这个功能,可以调用rand函数,让其在1~10之间生成随机值。那么它取1或2的概率就是20%,这便满足了要求。同时猫的饱食度不同时,捉鼠以后的行为也不同,这里需要一个分支结构加以选择。最后若触发了则返回true,否则返回false。
各独立行为的测试
- 玩家的独立行为测试(喂食,洗澡,玩耍属于交互行为,不再此处测试!)
(1)打工
(2)买狗粮
(3)喂食
(4)休息
- 狗的独立行为测试(接受喂食,接受洗澡,玩耍属于交互行为,不再此处测试!)
无 - 猫的独立行为测试(接受喂食,接受洗澡,玩耍属于交互行为,不再此处测试!)
(1)自洁
(2)捉老鼠被触发
高饱食度情况
低饱食度情况
3.输出
利用玩家类Show()函数输出玩家类的各个状态(私有数据成员)来检验玩家类的独立行为是否正确,状态变化是否符合要求。而与宠物类有关的交互操作需要在第二阶段完成,而且也不是独立行为,所以目前搁置。
第二阶段
1.程序架构
食物类的设计利用一个结构体来储存食物类,包含玩家所拥有的食物库,也就是玩家已购买的食物类别和数量。然后将各种食物的初始价格初始化,那么食物类就可以正常引用了。
随后的玩家类和宠物类的交互有的利用友元函数,有的就利用类成员函数。也就是家互操作形式上的问题一解决,在一个函数内引用修改两个类的私有数据成员的问题解决其他就比较简单了,就是根据指导书里面的规定什么操作改变多少玩家和宠物的属性值。直接修改就完了。但是也要引用函数judge()判定是否可以执行。所以很多交互函数类型都是bool型的。
2.交互测试
对玩家对宠物的各种行为进行测试,每次都输出当前玩家和宠物的状态,便于用户玩这个游戏,可以从这些信息中选择某些行为来养这只电子宠物。程序也对用户的各种输入进行响应,一个数字操作符就改变了玩家类和宠物类的信息,体现了类的交互性。
第三阶段
1.程序架构
系统设计和代码实现
存档读档测试:
存档情况
这是存储数据而建立的txt文件
读档情况
存档时和读档后的数据完全一致,说明存档、读档功能没有问题
中途宠物死亡测试:
当宠物死亡或者离家出走时都会提示你游戏结束和结束的原因,而且最后输出最后的状态
30天游玩测试:
由于指导书提供的一些数据不太合理,所以基本不可能玩到30天。狗最多玩到了第三天就因为体重过轻饿死了,猫最多玩到第5天也饿死了。其实狗比猫难养很多,因为在玩家与宠物非交互时间内狗狗所有属性会降低,最主要的就是狗子的愉悦度降得很快,所以一般养狗子大多都是以狗子离家出走为结束。而猫咪因为在非交互时间受到的影响很小,而且还有随机自洁和随机抓老鼠,所以更好养活,最后猫咪一般以体重过轻死亡游戏结束。
三、 总结
经过本次实验对类的理解更加深刻了,不仅仅是那些什么类里的成员函数,私有数据成员怎么引用之类的,更多的是类的继承的优越性、多个类中成员函数的交互作用,以及在两个类中引用数据的方法。就拿宠物类来说,现在只有2种宠物,你可以分别编写他们,工作量也不算太大,但是你要知道他们绝大部分
属性类型都是相同的,如果有很多种这样的类呢,比如有几千个这样的类,你也分别编写吗?就算编写方面来说是一样的,但是你要考虑代码的可读性,太臃肿的代码大家谁都不想看,而我们以后必定是要与其他人合作的,所以这种习惯不可取。而使用了基类的情况下,子类就无需重复定义,大大增大了代码的质量。
而且对不同类的数据交互的理解也有突破。可以利用一个类中的友元函数将他们联系起来,也可以直接调用其中一个类的成员函数,如果这样做必定需要声明友元,因为你要在其他类里面修改一个类中的私有数据成员。总而言之,本次实验大大提升了我设计类的能力,受益匪浅。
C++ “电子宠物游戏”相关推荐
- 元宇宙介绍:游戏赚钱时代来临
你能想到的个人玩儿游戏能赚钱的方式是什么?代练.卖号.售卖稀有id.稀有装备.参与游戏赛事或衍生经济?No,这些都是目前十分常态化的路子了. 格局打开,你再想想.有这样一个游戏,玩家可以直接在游戏里赚 ...
- 谁能走得更远?百度、阿里、腾讯的区块链技术与布局对垒
技术更迭随时会让一个巨人倒下--手机领域曾经的霸主诺基亚.摩托罗拉没跟上智能手机系统步伐,从巅峰转瞬跌入谷底.BAT都明白其中利害,早已枕戈待战. 互联网帝国之争 群雄逐鹿的区块链竞争格局,大致可分为 ...
- 你应该知道的6个GameFi机制
作者:汪天凡@jpejpejpe18,贝塔斯曼亚洲投资基金董事总经理 来源:mirror.xyz 本文来自贝塔斯曼亚洲投资基金董事总经理汪天凡的即刻播客<八万四千>,详细文字内容整理发布在 ...
- 莪的拽、像省田各号①样没尽頭队——软件需求规格说明书
团队Github地址:https://github.com/m8705/Pixel-Pet 目录 1. 引言 1.1. 编写目的 1.2. 项目背景 2. 任务概述 2.1. 一般描述 2.2. 游戏 ...
- 以几款火爆链游为例 读懂GameFi常见机制
Axie Infinity Axie Infinity 是一款建立在以太坊区块链上的去中心化回合制策略游戏,起初为以太坊主链,而后由于 gas 费用过高和延迟问题迁移到了自建的 Ronin 侧链上.主 ...
- 区块链寒冬,你必须看的一篇深度贴,你想知道的都在这里了
区块链泡沫就要破灭了吗? 行业内最近一片惨淡,所有的社群都充满着极端的消极.无奈.悲观的情绪. 骂声哭声嚎叫声声声入耳,叫天天不应叫地地不灵! 覆巢之下,焉有完蛋. 熊市之下,不要说赛马了,能活下来的 ...
- 有多少人等着看百度区块链的笑话?
哀其不幸,怒其不争.--鲁迅 提起百度,很多人的反应都是摇摇头,沉默许久后,只吐出两个字: 不行. 这并不难理解.对比腾讯和百度Q3的财报,百度一如既往地输得很惨.腾讯今年Q3财报显示,腾讯Q3营收8 ...
- 怎么玩转迷恋猫呢?---来源于godapp分析
迷恋猫是世界首款区块链游戏.玩家可以收集和繁殖喵咪,创造出全新的喵星人并解锁珍稀属性. 迷恋猫是以太猫中文名称,是国外非常火的区块链养猫平台.那么迷恋猫怎么玩?我带来了迷恋猫养猫攻略手册,赶快来看看吧 ...
- 格斗类游戏和休闲类游戏不同
前阵子我开发了Match3D, 一个可以把三维动画输出成为swf的工具, 而且实现了swf渲染的实时三维角色动画, 这可以说是我真正推出的第一个flash第三方软件, 其实这以前, 我曾经开发过几个其 ...
- 一款可以在BCH链上养大熊猫的游戏——CryptoPandas
近日,一篇关于在BCH区块链上开发类似Cryptokitties(加密猫)游戏可行性的贴子,在BCH论坛r/btc引起热烈讨论.发帖的是一名以太坊开发人员,他认为BCH区块链似乎对于创建DApp很有吸 ...
最新文章
- linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计
- 最新BERT相关论文汇总
- 纯CSS 实现组织架构图,学习
- 分享几点Android 开发中的小技巧吧。不知道算不算?
- 同时防服务器维修,加强服务器日常运维,避免宕机灾难发生
- raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题
- Xshell登录Linux服务器 提示WARNING! The remote SSH server rejected X11 forwarding request 及 提示符显示-bash-4.2#
- 深入理解es module
- Vue+Vue Router+Webpack打包网站基础页面
- cmd常用命令 cmd打开文件软件等
- Part I. S2. 直觉模糊集理论
- SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
- wampserver安装错误 应用程序无法正常启动0xc000007b解决方法
- MVP衣明志——15年技术生涯
- 实时计算与SparkSteaming的对比
- 透明、柔性指纹传感器问世
- CleanMyMac4.13最新免费mac电脑系统优化软件
- UEFI EDK2 同一代码在IA32可以运行,X64就不可以!
- DevExpress中实现对DataTable的操作、转换
- 千锋PMP企业核心竞争力赋能计划,助力近百家企业提升人才动能
热门文章
- matlab输出相反数,在MATLAB将等于某一数列相反数的数据都赋值为0
- zblog php 分类页,zblog怎样实现不同分类页调用不同页面模板和样式
- 关于geoserver中line图层线颜色不统一,style中sld写法
- 数字黑洞java,java解决数字黑洞问题
- RGB、HSL、Hex网页色彩,看完这篇全懂了
- Flutter 实现一款简单的音乐播放器
- 修改360企业版杀毒软件备注名的方法
- 36个顶级数据分析方法与模型!
- 2021年等保2.0工作必须了解的40个问题汇总
- 林海峰讲的python_Python面向对象进阶-林海峰篇