求打赏求收藏求转发!
提供PDF资源
https://download.csdn.net/download/weixin_43781565/12429066
(审核后可供下载)
Peace and love
目录
小组项目游戏"双人大战"的控制台指令实现
本次实验旨在主要对前期学习的有关C++面向对象部分的多态性知识进行实践操作,并综合前期的全部有关面向对象的内容,完成项目。
在理论方面主要体现了:
- 面向对象的抽象思维分析;
- 对继承关系的分析和实践应用;
- 对虚基类(virtual base class),派生类,类的实例化,动态联编(dynamic binding)等体现面向对象多态性内容的体现;
- 小组合作完成同意大型项目的配合能力,;
在实际操作方面,本次试验重点训练了:
- 继承关系的创建,与相关成员函数之间的调用关系;
- 虚基类的创建和多态的体现;
- 小组对项目问题讨论出的问题和解决方案;
IDE :CodeBlocks16.1 (Core:VC++6.0)
Language Standard : C++14
随着社会和科技的发展,计算机进入千家万户,除了日常的工作需要外,"游戏",成为了许多人使用计算机的理由。计算机游戏不仅能愉悦身心,尽情压力,还能锻炼自己的决策力和思维能力。综上所述,本次实验我们决定选择“双人大战”游戏这款项目,作为整个C++面向对象知识的整体训练。
根据我们的讨论结果,得到以下的项目需求:
“双人大战”,顾名思义,在项目中主要是围绕两个玩家之间的进行的交互操作,在此,我们设立2位玩家,并参考其他游戏的设置,设立3中人物属性为“法师”“战士”与“妖怪”,供玩家选择。另外,项目中采用回合制,通过生命值判断玩家是否存活,并作为是否胜利的判断依据。
其次,在游戏中,需要有防御力和攻击力这两个属性,与生命值一起作为玩家的基本属性。
再者,仿照其他游戏的配置,我们决定在游戏中引入“商店”机制,对于不同的角色售卖不同的“装备”,用来改变玩家的属性,例如:盔甲用于提升防御力,大刀用来提升攻击力等。
最后,我们需要给玩家加入金币的这个属性,作为在商店购买装备的要求,金币可以设置为在每回合打斗结束后随机获得的方式给予玩家。
根据项目需求,我们进行合理的抽象,将内容主要分为“角色”,“武器”和“防御”三个板块,而在其中由于每个角色的武器条目和商店内容又各不相同,并不能很好的将项目内容拆分,于是我们决定将项目合理拆分为:
- 盔甲类,盔甲商店类;
- 武器类,武器商店类;
- 角色类,主函数(回合打斗);
然后根据拆分的结果,各自完成自己负责的功能部分,统一变量名后,开始内容分析编写。
③小组分工内容
小组成员 | 项目内容 |
赵 | 盔甲类,盔甲商店类 |
刘 | 武器类,武器商店类 |
孙 | 角色类,主函数(回合打斗); |
根据需求的分析,首先得到图书管理系统的程序类关系,类图表示如下:
并参考需求分析中的要求,并结合相关内容,确定出上图类中的成员函数和数据成员,图书管理系统代码片段如下:
备注:已将部分代码数量较少的函数直接写入类中,未在外部进行编写。
- class Data //数据基类
- {
- public:
- Data() //初始化数据
- {
- strcpy(Name,"");
- Id=0;
- }
- Data(char *name, long id) //设置数据信息
- {
- strcpy(Name,name);
- Id=id;
- }
- long GetCode()
- {
- return Id;
- }
- void Show() //显示数据信息
- {
- cout<<"数据: "<<Name<<'\t'<<Id<<endl;
- }
- protected:
- char Name[40]; //名称
- long Id; //ID
- };
- class Book:public Data //派生类:书籍
- {
- public:
- Book() //初始化书籍信息
- {
- strcpy(Writer, "");
- strcpy(IndexId,"");
- }
- Book(char *writer, char *name, char *index, long id); //增加书籍
- void Show()//显示书籍信息
- {
- cout<<"书籍:"<<Name<<'\t'<< Writer<<'\t'<< IndexId <<'\t' << Id << endl;
- }
- private:
- char Writer [20]; //作者名
- char IndexId [10]; //索引
- };
- class Journal:public Data //派生类:期刊
- {
- public:
- Journal(); //初始化期刊信息
- Journal(char *name,int num,long id); //增加期刊
- void Show() ; //显示期刊信息
- private:
- int Number; //刊号
- };
根据相关的需求分析我们可知,通过继承的方式,将普通书籍(Book)与期刊(Journal)从基类数据类(Data)中派生出来,不仅可以清晰的体现各个类之间的层次关系,保护了相关的数据成员,而且还有效地节省了代码空间,减少了代码冗余。
- class Reader //借书人类
- {
- public:
- Reader();
- Reader(char *name,long id);
- ~Reader();
- void Show()
- {
- cout<<"借书人:\t"<<Name<<'\t'<<Id<< endl;
- } //显示借书人信息
- void Show_Book(); //显示所借书
- void Show_Journal(); //显示所借期刊
- void Add_Book(Book obj); //添加所借书
- void Add_Journal(Journal obj); //添加所借期刊
- void Del_Book(Book obj); //归还所借书
- void Del_Journal(Journal obj); //归还所借期刊
- private:
- char Name[20]; //借书人姓名
- long Id; //借书证号
- Book *books; //所借书籍
- int Counter_Book; //已借书数目
- Journal *journals; //所借期刊
- int Counter_Journal; //已借期刊数目
- };
对于部分实现功能的成员函数,具体代码如下:
1. 增加书籍
- Book::Book(char *writer, char *name, char *index, long id):
- Data(name, id)
- {
- strcpy(Writer, writer);
- strcpy(IndexId, index);
- }
- 增加期刊
- Journal::Journal(char *name,int num, long id):
- Data(name,id)
- {
- Number= num;
- }
3.显示期刊
- void Journal::Show ()
- {
- cout <<"期刊:"<<Name<<'\t'<<Number<<'\t'<<Id<< endl;
- }
- 初始化借书人
- Reader::Reader()
- {
- strcpy (Name, "");
- Id = 0;
- books= new Book[5];
- Counter_Book = 0;
- journals= new Journal[10];
- Counter_Journal = 0;
}
- 设置借书人信息
- Reader::Reader(char *name,long id)
- {
- strcpy(Name, name);
- Id = id;
- books = new Book[5];
- Counter_Book = 0;
- journals = new Journal[10];
- Counter_Journal = 0;
- }
- 展示借阅书籍情况
- void Reader::Show_Book()
- {
- if (Counter_Book == 0)
- {
- cout <<"书籍已归还! " << endl;
- return;
- }
- for(int i = 0; i<Counter_Book; i++)
- books[i].Show();
- }
- 展示借阅期刊情况
- void Reader::Show_Journal ()
- {
- if(Counter_Journal == 0)
- {
- cout << " 期刊己归还! " << endl;
- return;
- }
- for(int i = 0; i < Counter_Journal; i++)
- journals[i].Show();
- }
- 借阅书籍
- void Reader::Add_Book(Book obj)
- {
- if(Counter_Book < 5)
- {
- books[Counter_Book] = obj;
- Counter_Book++;
- }
- else
- {
- cout << " 您已经借阅5本书籍,请归还后继续借阅! " << endl;
- }
- }
- 归还书籍
- void Reader::Del_Book(Book obj)
- {
- for(int i = Counter_Book; i > 0; i--)
- if(books[i].GetCode() ==obj.GetCode()) break;
- for(int j = i; j < Counter_Book; j++)
- books[j] = books[j+1];
- Counter_Book-- ;
- }
- 借阅期刊
- void Reader::Add_Journal(Journal obj)
- {
- if(Counter_Journal < 5)
- {
- journals[Counter_Journal] = obj;
- Counter_Journal++;
- }
- else
- {
- cout << " 您已经借阅5本期刊,请归还后继续借阅! ! " << endl;
- }
- }
- 归还期刊
- void Reader::Del_Journal(Journal obj)
- {
- for(int i = Counter_Journal; i > 0 ; i --)
- if(journals [i].GetCode() == obj.GetCode()) break;
- for(int j = i; j < Counter_Journal; j++)
- journals[j] = journals[j+1];
- Counter_Journal--;
- }
- 相关构造,析构函数
- Journal::Journal():Data ()
- {
- Number= 0;
- }
- Reader:: ~Reader()
- {
- delete books;
- delete journals;
- }
13.主函数(存放测试用例)
- int main()
- {
- //增加书籍
- Journal journal1("电脑爱好者",11,201901);
- Journal journal2("人民日报",12,201912);
- Book book1("沈学东","C++语言面向对象程序设计使用教程", "TP312",1535);
- Book book2("吴柏师","大学物理","TP231", 1200);
- Book book3("Peter","离散数学","TP235", 1223);
- Book book4("张英平","大话区块链","TP434", 2911);
- Book book5("余华","活着","TP164", 2931);
- Book book6("编者","马克思主义基本原理","TP112", 1001);
- //增加借书人,并显示信息
- Reader reader1("朱鑫萌", 180601);
- Reader reader2("孙嘉成", 180602);
- reader1.Show();
- reader2.Show();
- //模拟借书操作
- reader1.Add_Book(book1);
- reader1.Add_Book(book2);
- reader1.Add_Book(book3);
- reader1.Add_Book(book4);
- reader1.Add_Book(book5);
- reader1.Add_Book(book6);
- reader1.Show_Book(); //显示所借书籍
- reader2.Add_Journal(journal1);
- reader2.Add_Journal(journal2);
- reader2.Del_Journal(journal1);
- reader2.Show_Journal(); //显示所借书籍
- return 0;
- }
以下为实验结果截图:
图3-3 借书数量超过限制(5本)
图3-4 借书人当前借阅书籍信息展示
七、实验分析及结论
在本次图书信息管理系统的试验操作之中,主要训练的是对前期学习的有关类的继承(inheritance)相关知识的实践与应用.要想准确的使用继承这一功能,我体会到,对与问题的分析和抽象能力显得尤其重要.比如在本次实验中,最重要的莫过于对图书馆功能的需求分析和数据类(Data),书籍类(Books)和期刊类(Journal)的设计的部分,只有对需求分析的足够准确,对问题的抽象足够好,才能准确的描述出程序中类与类之间的关系,从而准确的使用继承关系.
使用了继承之后的代码,能够很明显的体会到代码空间的减少,是解决代码冗余的有效解决方案.而在具体使用的时候,我再次复习了有关各种继承关系中成员函数和数据成员的调用和使用,加深了我对这一部分知识的记忆和理解.
总的来说,本次的图书管理系统重点突出的是继承有关的知识,所以对于其他的成员函数并没有重点关注,但其中还是使用了很多前期学习的比如参数列表,get函数的设计,以及构造函数的设置等等.为了简化功能,没有设计功能菜单相关的函数,可以在后期的项目维护中添加相关的功能.
附:程序源代码
- #include <string.h>
- #include <iostream>
- using namespace std;
- class Data //数据基类
- {
- public:
- Data() //初始化数据
- {
- strcpy(Name,"");
- Id=0;
- }
- Data(char *name, long id)//设置数据信息
- {
- strcpy(Name,name);
- Id=id;
- }
- long GetCode()
- {
- return Id;
- }
- void Show()//显示数据信息
- {
- cout<<"数据: "<<Name<<'\t'<<Id<<endl;
- }
- protected:
- char Name[40]; //名称
- long Id; //ID
- };
- class Book:public Data //派生类:书籍
- {
- public:
- Book() //初始化书籍信息
- {
- strcpy(Writer, "");
- strcpy(IndexId,"");
- }
- Book(char *writer, char *name, char *index, long id); //增加书籍
- void Show()//显示书籍信息
- {
- cout<<"书籍:"<<Name<<'\t'<< Writer<<'\t'<< IndexId <<'\t' << Id << endl;
- }
- private:
- char Writer [20]; //作者名
- char IndexId [10]; //索引
- };
- class Journal:public Data //派生类:期刊
- {
- public:
- Journal(); //初始化期刊信息
- Journal(char *name,int num,long id); //增加期刊
- void Show() ; //显示期刊信息
- private:
- int Number; //刊号
- };
- class Reader //借书人类
- {
- public:
- Reader();
- Reader(char *name,long id);
- ~Reader();
- void Show()
- {
- cout<<"借书人:\t"<<Name<<'\t'<<Id<< endl;
- } //显示借书人信息
- void Show_Book(); //显示所借书
- void Show_Journal(); //显示所借期刊
- void Add_Book(Book obj); //添加所借书
- void Add_Journal(Journal obj);//添加所借期刊
- void Del_Book(Book obj); //归还所借书
- void Del_Journal(Journal obj); //归还所借期刊
- private:
- char Name[20]; //借书人姓名
- long Id; //借书证号
- Book *books; //所借书籍
- int Counter_Book; //已借书数目
- Journal *journals; //所借期刊
- int Counter_Journal; //已借期刊数目
- };
- //增加书籍
- Book::Book(char *writer, char *name, char *index, long id):
- Data(name, id)
- {
- strcpy(Writer, writer);
- strcpy(IndexId, index);
- }
- Journal::Journal():Data ()
- {
- Number= 0;
- }
- //增加期刊
- Journal::Journal(char *name,int num, long id):
- Data(name,id)
- {
- Number= num;
- }
- //显示期刊
- void Journal::Show ()
- {
- cout <<"期刊:"<<Name<<'\t'<<Number<<'\t'<<Id<< endl;
- }
- //初始化借书人
- Reader::Reader()
- {
- strcpy (Name, "");
- Id = 0;
- books= new Book[5];
- Counter_Book = 0;
- journals= new Journal[10];
- Counter_Journal = 0;
- }
- //设置借书人信息
- Reader::Reader(char *name,long id)
- {
- strcpy(Name, name);
- Id = id;
- books = new Book[5];
- Counter_Book = 0;
- journals = new Journal[10];
- Counter_Journal = 0;
- }
- Reader:: ~Reader()
- {
- delete books;
- delete journals;
- }
- //展示借阅书籍情况
- void Reader::Show_Book()
- {
- if (Counter_Book == 0)
- {
- cout <<"书籍已归还! " << endl;
- return;
- }
- for(int i = 0; i<Counter_Book; i++)
- books[i].Show();
- }
- //展示借阅期刊情况
- void Reader::Show_Journal ()
- {
- if(Counter_Journal == 0)
- {
- cout << " 期刊己归还! " << endl;
- return;
- }
- for(int i = 0; i < Counter_Journal; i++)
- journals[i].Show();
- }
- //借阅书籍
- void Reader::Add_Book(Book obj)
- {
- if(Counter_Book < 5)
- {
- books[Counter_Book] = obj;
- Counter_Book++;
- }
- else
- {
- cout << " 您已经借阅5本书籍,请归还后继续借阅! " << endl;
- }
- }
- //归还书籍
- void Reader::Del_Book(Book obj)
- {
- for(int i = Counter_Book; i > 0; i--)
- if(books[i].GetCode() ==obj.GetCode()) break;
- for(int j = i; j < Counter_Book; j++)
- books[j] = books[j+1];
- Counter_Book-- ;
- }
- //借阅期刊
- void Reader::Add_Journal(Journal obj)
- {
- if(Counter_Journal < 5)
- {
- journals[Counter_Journal] = obj;
- Counter_Journal++;
- }
- else
- {
- cout << " 您已经借阅5本期刊,请归还后继续借阅! ! " << endl;
- }
- }
- //归还期刊
- void Reader::Del_Journal(Journal obj)
- {
- for(int i = Counter_Journal; i > 0 ; i --)
- if(journals [i].GetCode() == obj.GetCode()) break;
- for(int j = i; j < Counter_Journal; j++)
- journals[j] = journals[j+1];
- Counter_Journal--;
- }
- int main()
- {
- //增加书籍
- Journal journal1("电脑爱好者",11,201901);
- Journal journal2("人民日报",12,201912);
- Book book1("沈学东","C++语言面向对象程序设计使用教程", "TP312",1535);
- Book book2("吴柏师","大学物理","TP231", 1200);
- Book book3("Peter","离散数学","TP235", 1223);
- Book book4("张英平","大话区块链","TP434", 2911);
- Book book5("余华","活着","TP164", 2931);
- Book book6("编者","马克思主义基本原理","TP112", 1001);
- //增加借书人,并显示信息
- Reader reader1("朱鑫萌", 180601);
- Reader reader2("孙嘉成", 180602);
- reader1.Show();
- reader2.Show();
- //模拟借书操作
- reader1.Add_Book(book1);
- reader1.Add_Book(book2);
- reader1.Add_Book(book3);
- reader1.Add_Book(book4);
- reader1.Add_Book(book5);
- reader1.Add_Book(book6);
- reader1.Show_Book(); //显示所借书籍
- reader2.Add_Journal(journal1);
- reader2.Add_Journal(journal2);
- reader2.Del_Journal(journal1);
- reader2.Show_Journal(); //显示所借书籍
- return 0;
- }