#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);//修改时间,当前时间+nvoid Setp(int n);//修改体力,当前体力+nbool Tutor();//家教 bool Waiter();//麦当劳兼职bool Mowing();//割草bool PurchaseFood();//购买宠物粮食int Feed();//给宠物喂食,返回食物编号,不成功返回0void 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;elsewt=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; }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846电子宠物游戏
一、 问题描述
(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类添加这两个函数以实现猫的各种行为。
关键功能实现
思想:喂食狗以后,狗先发出叫声,之后通过传来的参数ID对应食物的种类,使狗的相应状态指标升高或降低。
2. bool Dog::dogcal(Dog& d) //狗的结算函数
思想:根据题目要求,每天结束后,狗的各种状态指标会相互影响。具体而言,饱食度会影响体重和愉悦度,体重和清洁度会影响愉悦度。每天结算完成后,应当判断体重和愉悦度是否正常,若超出给定范围,则判定游戏结束,返回false,否则返回true。
3. bool Cat::catchm() 猫捉鼠的行为函数
思想:根据题意,猫捉鼠是一个给定了概率的随机触发行为。为了实现这个功能,可以调用rand函数,让其在1~10之间生成随机值。那么它取1或2的概率就是20%,这便满足了要求。同时猫的饱食度不同时,捉鼠以后的行为也不同,这里需要一个分支结构加以选择。最后若触发了则返回true,否则返回false。
各独立行为的测试
(2)买狗粮
(3)喂食
(4)休息
狗的独立行为测试(接受喂食,接受洗澡,玩耍属于交互行为,不再此处测试!)(2)捉老鼠被触发
高饱食度情况
低饱食度情况
3.输出
利用玩家类Show()函数输出玩家类的各个状态(私有数据成员)来检验玩家类的独立行为是否正确,状态变化是否符合要求。而与宠物类有关的交互操作需要在第二阶段完成,而且也不是独立行为,所以目前搁置。
第二阶段
1.程序架构
食物类的设计利用一个结构体来储存食物类,包含玩家所拥有的食物库,也就是玩家已购买的食物类别和数量。然后将各种食物的初始价格初始化,那么食物类就可以正常引用了。
随后的玩家类和宠物类的交互有的利用友元函数,有的就利用类成员函数。也就是家互操作形式上的问题一解决,在一个函数内引用修改两个类的私有数据成员的问题解决其他就比较简单了,就是根据指导书里面的规定什么操作改变多少玩家和宠物的属性值。直接修改就完了。但是也要引用函数judge()判定是否可以执行。所以很多交互函数类型都是bool型的。
2.交互测试
对玩家对宠物的各种行为进行测试,每次都输出当前玩家和宠物的状态,便于用户玩这个游戏,可以从这些信息中选择某些行为来养这只电子宠物。程序也对用户的各种输入进行响应,一个数字操作符就改变了玩家类和宠物类的信息,体现了类的交互性。
第三阶段
1.程序架构
系统设计和代码实现
存档读档测试:
存档情况
这是存储数据而建立的txt文件
读档情况
存档时和读档后的数据完全一致,说明存档、读档功能没有问题
中途宠物死亡测试:
当宠物死亡或者离家出走时都会提示你游戏结束和结束的原因,而且最后输出最后的状态
30天游玩测试:
由于指导书提供的一些数据不太合理,所以基本不可能玩到30天。狗最多玩到了第三天就因为体重过轻饿死了,猫最多玩到第5天也饿死了。其实狗比猫难养很多,因为在玩家与宠物非交互时间内狗狗所有属性会降低,最主要的就是狗子的愉悦度降得很快,所以一般养狗子大多都是以狗子离家出走为结束。而猫咪因为在非交互时间受到的影响很小,而且还有随机自洁和随机抓老鼠,所以更好养活,最后猫咪一般以体重过轻死亡游戏结束。
三、 总结
经过本次实验对类的理解更加深刻了,不仅仅是那些什么类里的成员函数,私有数据成员怎么引用之类的,更多的是类的继承的优越性、多个类中成员函数的交互作用,以及在两个类中引用数据的方法。就拿宠物类来说,现在只有2种宠物,你可以分别编写他们,工作量也不算太大,但是你要知道他们绝大部分
属性类型都是相同的,如果有很多种这样的类呢,比如有几千个这样的类,你也分别编写吗?就算编写方面来说是一样的,但是你要考虑代码的可读性,太臃肿的代码大家谁都不想看,而我们以后必定是要与其他人合作的,所以这种习惯不可取。而使用了基类的情况下,子类就无需重复定义,大大增大了代码的质量。
而且对不同类的数据交互的理解也有突破。可以利用一个类中的友元函数将他们联系起来,也可以直接调用其中一个类的成员函数,如果这样做必定需要声明友元,因为你要在其他类里面修改一个类中的私有数据成员。总而言之,本次实验大大提升了我设计类的能力,受益匪浅。
相关知识
基于c++的电子宠物
C++ “电子宠物游戏”
毕业论文(设计)模拟养成游戏《电子宠物狗》的策划及设计
电子宠物游戏(附C++源码)
桌面电子蟑螂:互动模拟宠物游戏介绍
C++ 基础教程
电子宠物游戏
电子宠物游戏下载
C++实现电子宠物系统
电子宠物养成游戏
网址: C++ “电子宠物游戏” https://m.mcbbbk.com/newsview725801.html
上一篇: 电子宠物重出江湖,你还会买吗? |
下一篇: 电子宠物介绍 |