【C++】 小项目---宠物小屋的分析设计与开发实现

news/2024/10/17 22:25:27/

目录

需求

分析设计

动物类

 笼子类

房子类

人类

小贴士

 整体设计图

开发实现

动物类

笼子类

房子类

人类

小贴士

控制台主函数


需求

动物猫(CCat)、狗(CDog)、蛇(CSnake),包含名字(m_strName)、颜色(m_strColor)、年龄(m_nAge)。
笼子类(CCage):它负责装3种动物,每个笼子有对应的编号。
房子类(CHouse):负责存放装动物的笼子。
人(CPeople):负责花钱买动物,造笼子,将动物放到笼子中,存放到房子里,杀死某个笼子动物,销毁某个笼子(如果有动物一并销毁),
查看某个或所有笼子动物,和某个动物玩耍。

控制台程序,通过输入命令,可以进行简单的人机交互。

分析设计

动物类

由于猫狗蛇有着许多共同的属性,所以我们选择创建一个动物类作为他们的父类,用继承和多态来实现他们的关系。

  • 它的成员属性包括:名字、颜色、年龄
  • 成员函数包括:初始化、玩耍、展示

 笼子类

它与动物类的关系是关联的关系

  • 成员属性:笼子编号、装的动物
  • 成员函数:笼子初始化、向笼子中装动物

房子类

 它与笼子类是聚合的关系

  • 成员属性:存放笼子的链表
  • 成员函数:向房子中装笼子

人类

它与动物类、笼子类和房子类是依赖的关系

  • 成员属性:姓名、钱
  • 成员函数:初始化、买动物、造笼子、将动物放在笼子里、将笼子放在房子里、清除笼子中的动物、销毁笼子、查看所有笼子、查看某一个笼子、和某个动物去玩、显示人物信息

小贴士

最后我们创建了一个小贴纸,将枚举类型和宏定义放在了里面

  • 枚举动物的种类,宏定义动物的价格和人的钱

 整体设计图

 

开发实现

动物类

  • 父类
//CAnimal.h
#pragma once
#include <string>
#include <iostream>
using namespace std;class CAnimal
{
public:string m_strName;string m_strColor;int m_nAge;
public:CAnimal();virtual ~CAnimal(); //虚析构void initAni(string name, string color, int age);virtual void PlayAni() = 0;void ShowAni();};
//CAnimal.cpp
#include "CAnimal.h"CAnimal::CAnimal():m_nAge(0)
{
}CAnimal::~CAnimal()
{
}void CAnimal::initAni(string name, string color, int age)
{m_strName = name;m_strColor = color;m_nAge = age;
}void CAnimal::ShowAni()
{cout << "name: " << m_strName << ", color: " << m_strColor << ", age" << m_nAge << endl;
}
  • 三个子类

狗:

//CDog.h
#pragma once
#include "CAnimal.h"
class CDog :public CAnimal
{
public:virtual void PlayAni();
};
//CDog.cpp
#include "CDog.h"void CDog::PlayAni()
{cout << "汪~汪~汪,去啃骨头" << endl;
}

猫:

//CCat.h
#pragma once
#include "CAnimal.h"
class CCat :public CAnimal
{
public:virtual void PlayAni();
};
//CCat.cpp
#include "CCat.h"void CCat::PlayAni()
{cout << "喵~喵~喵,捞鱼吃" << endl;
}

蛇:

//CSnake.h
#pragma once
#include "CAnimal.h"
class CSnake :public CAnimal
{
public:virtual void PlayAni();
};
//CSnake.cpp
#include "CSnake.h"void CSnake::PlayAni()
{cout << "嘶~嘶~嘶,吃老鼠" << endl;
}

笼子类

//CCage.h
#pragma once
#include "CAnimal.h"
class CCage
{
public:int m_id;CAnimal* m_pAni;
public:CCage();~CCage();void InitCage(int id);void PushAnimal(CAnimal* pAni);
};
//CCage.cpp
#include "CCage.h"CCage::CCage():m_id(0),m_pAni(nullptr)
{
}CCage::~CCage()
{
}void CCage::InitCage(int id)
{m_id = id;
}void CCage::PushAnimal(CAnimal* pAni)
{if (pAni) {m_pAni = pAni;}
}

房子类

//CHouse.h
#pragma once
#include<list>
#include "CCage.h"
using namespace std;class CHouse
{
public:list<CCage*> m_lstCage;
public:CHouse();~CHouse();void PushCage(CCage* pCage);
};
//CHouse.cpp
#include "CHouse.h"CHouse::CHouse()
{
}CHouse::~CHouse()
{list<CCage* >::iterator ite = m_lstCage.begin();while (ite != m_lstCage.end()) {if ((*ite)) {  //笼子不为空if ((*ite)->m_pAni) {  //如果存在动物delete(*ite)->m_pAni;  //销毁动物(*ite)->m_pAni = nullptr;}delete(*ite);  //销毁笼子(*ite) = nullptr;}ite++;}m_lstCage.clear();   //清空节点}void CHouse::PushCage(CCage* pCage)
{if (pCage) m_lstCage.push_back(pCage);
}

人类

//CPeople.h
#pragma once
#include "CHouse.h"
#include "config.h"class CPeople
{
public:string m_name;int m_money;
public:CPeople();~CPeople();void InitPeople(string name, int money);bool BuyAnimal(CAnimal* pAni, ani_kind kind);CCage* CreatCage();void PushAniToCage(CCage* pCage, CAnimal* pAni);void PushCageToHouse(CHouse* pHouse, CCage* pCage);void KillAnimal(CHouse* pHouse, int id);void DestoryCage(CHouse* pHouse, int id);void LookAll(CHouse* pHouse);void LookOne(CHouse* pHouse, int id);void PlayWithAnimal(CHouse* pHouse, int id);void showPeople();};
//CPeople.cpp
#include "CPeople.h"CPeople::CPeople():m_money(0)
{
}CPeople::~CPeople()
{
}void CPeople::InitPeople(string name, int money)
{m_name = name;m_money = money;
}#define BUY_ANIMAL(ANI_PRICE)\if (m_money - ANI_PRICE >= 0) {\m_money -= ANI_PRICE;\}\else {\cout << "穷鬼~,钱不够买动物了" << endl;\return false;\}bool CPeople::BuyAnimal(CAnimal* pAni, ani_kind kind)
{if (!pAni) {cout << "动物的指针为空" << endl;return false;}switch (kind) {case ani_kind::ani_dog:{/*	if (m_money - DOG_PRICE >= 0) {m_money -= DOG_PRICE;}else {cout << "穷鬼~,钱不够买动物了" << endl;return false;}*/BUY_ANIMAL(DOG_PRICE)}break;case ani_kind::ani_cat:{BUY_ANIMAL(CAT_PRICE)}break;case ani_kind::ani_sna:{BUY_ANIMAL(SNA_PRICE)}break;}cout << "动物买成功了" << endl;return true;
}CCage* CPeople::CreatCage()
{CCage* pCage = new CCage;cout << "请输入笼子的ID(ID>0)" << endl;int id = 0;cin >> id;while (id <= 0) {cout << "输入的ID不合法,重新输入" << endl;cin >> id;}pCage->InitCage(id);return pCage;
}void CPeople::PushAniToCage(CCage* pCage, CAnimal* pAni)
{if (!pCage || !pAni) {cout << "参数不合法" << endl;return;}pCage->PushAnimal(pAni);cout << "动物成功的添加到笼子中" << endl;
}void CPeople::PushCageToHouse(CHouse* pHouse, CCage* pCage)
{if (!pHouse || !pCage) {cout << "参数不合法" << endl;return;}pHouse->PushCage(pCage);cout << "笼子成功的添加到房子中" << endl;}void CPeople::KillAnimal(CHouse* pHouse, int id)
{if (!pHouse) {cout << "房子的指针为空" << endl;return;}list<CCage*>::iterator ite = pHouse->m_lstCage.begin();while (ite != pHouse->m_lstCage.end()) { //遍历笼子的链表if ((*ite) && (*ite)->m_id == id) {  //笼子不为空 且 匹配到了if ((*ite)->m_pAni) {    //笼子中存在着动物delete(*ite)->m_pAni;   //杀死动物(*ite)->m_pAni = nullptr;}cout << "笼子中不存在动物了" << endl;return;}ite++;}cout << "未匹配到笼子id:" << id << endl;
}void CPeople::DestoryCage(CHouse* pHouse, int id)
{if (!pHouse) {cout << "房子的指针为空" << endl;return;}list<CCage*>::iterator ite = pHouse->m_lstCage.begin();while (ite != pHouse->m_lstCage.end()) { //遍历笼子的链表if ((*ite) && (*ite)->m_id == id) {  //笼子不为空 且 匹配到了if ((*ite)->m_pAni) {    //笼子中存在着动物delete(*ite)->m_pAni;   //杀死动物(*ite)->m_pAni = nullptr;}delete(*ite);  //销毁笼子(*ite) = nullptr;cout << "笼子被成功的销毁了" << endl;return;}ite++;}cout << "未匹配到笼子id:" << id << endl;
}void CPeople::LookAll(CHouse* pHouse) {if (!pHouse) {cout << "房子的指针为空" << endl;return;}for (CCage* pCage: pHouse->m_lstCage) {if (pCage) {cout << "id : " << pCage->m_id << " , ";if (pCage->m_pAni) {pCage->m_pAni->ShowAni();}else {cout << "笼子为空" << endl;}}}
}
void CPeople::LookOne(CHouse* pHouse, int id) {if (!pHouse) {cout << "房子的指针为空" << endl;return;}for (CCage* pCage : pHouse->m_lstCage) {if (pCage && pCage->m_id == id) {cout << "id : " << pCage->m_id << " , ";if (pCage->m_pAni) {pCage->m_pAni->ShowAni();}else {cout << "笼子为空" << endl;}return;}}cout << "未匹配到笼子id:" << id << endl;
}
void CPeople::PlayWithAnimal(CHouse* pHouse, int id) {if (!pHouse) {cout << "房子的指针为空" << endl;return;}for (CCage* pCage : pHouse->m_lstCage) {if (pCage && pCage->m_id == id) {cout << "准备去玩耍..." << endl;if (pCage->m_pAni) {pCage->m_pAni->PlayAni();}else {cout << "自己玩耍" << endl;}return;}}cout << "未匹配到笼子id:" << id << endl;
}
void CPeople::showPeople() {cout << "name : " << m_name << ",  money : " << m_money << endl;
}

小贴士

//config.h
#pragma onceenum class ani_kind {ani_cat,ani_dog,ani_sna
};#define DOG_PRICE 100
#define CAT_PRICE 80
#define SNA_PRICE 120#define PEO_MONEY 1200#define CMD_BUY_CAT "buy cat"
#define CMD_BUY_DOG "buy dog"
#define CMD_BUY_SNA "buy sna"#define CMD_KILL_ANI    "kill"
#define CMD_DESTORY_ANI "destory"#define CMD_LOOK_ONE    "look one"
#define CMD_LOOK_ALL    "look all"#define CMD_PLAY        "play"
#define CMD_SHOW        "show"#define CMD_QUIT        "quit"#define CMD_HELP        "help"

控制台主函数

#include <iostream>
using namespace std;
#include "CPeople.h"
#include "CCat.h"
#include "CDog.h"
#include "CSnake.h"
#include <windows.h>void help() {cout << "*********宠物小屋 by wangj 2023.4.30*************************************************" << endl;cout << "*" << CMD_BUY_CAT << "买猫  *********************************************************" << endl;cout << "*" << CMD_BUY_DOG << "买猫  *********************************************************" << endl;cout << "*" << CMD_BUY_SNA << "买蛇  *********************************************************" << endl;cout << "*" << CMD_KILL_ANI << "杀死动物  *********************************************************" << endl;cout << "*" << CMD_DESTORY_ANI << "销毁笼子(如果有动物,一并销毁)  *********************************************************" << endl;cout << "*" << CMD_LOOK_ONE << "查看某个动物  *********************************************************" << endl;cout << "*" << CMD_LOOK_ALL << "查看所有动物  *********************************************************" << endl;cout << "*" << CMD_PLAY << "和某个动物玩耍  *********************************************************" << endl;cout << "*" << CMD_SHOW << "显示人物信息  *********************************************************" << endl;cout << "*" << CMD_QUIT << "程序退出  *********************************************************" << endl;cout << "*" << CMD_HELP << "命令帮助  *********************************************************" << endl;cout << "**********************************************************" << endl;
}#define BUY_ANIMAL(ANI_CLASS,ANI_KIND)\pAni = new ANI_CLASS;\cout << "请输入动物的名字、颜色、年龄" << endl;\cin >> name >> color >> age;\pAni->initAni(name, color, age);\if (!pPeo->BuyAnimal(pAni, ANI_KIND)) {\delete pAni;\pAni = nullptr;\}int main() {CPeople* pPeo = new CPeople;pPeo->InitPeople("张三", PEO_MONEY);CHouse* pHouse = new CHouse;//-------------------------------------------------------string cmd;string Return;help();while (1) {//cout << "请输入命令" << endl;//cin >> cmd;getline(cin, cmd);  //读取一行(遇到空格不停止)//cin.sync();//cin.clear();//判断输入的命令是否是买动物string name;string color;int age = 0;CAnimal* pAni = nullptr;if (cmd == CMD_BUY_CAT) {//pAni = new CCat;//cout << "请输入动物的名字、颜色、年龄" << endl;//cin >> name >> color >> age;//pAni->initAni(name, color, age);//if (!pPeo->BuyAnimal(pAni, ani_cat)) {//买动物如果失败,将new的动物回收//	delete pAni;//	pAni = nullptr;//}BUY_ANIMAL(CCat, ani_kind::ani_cat)}else if (cmd == CMD_BUY_DOG) {BUY_ANIMAL(CDog, ani_kind::ani_dog)}else if (cmd == CMD_BUY_SNA) {BUY_ANIMAL(CSnake, ani_kind::ani_sna)}if (pAni) {  //动物买成功了,建造笼子装动物,装房子CCage* pCage = pPeo->CreatCage();  //建造笼子pPeo->PushAniToCage(pCage, pAni);  //装动物pPeo->PushCageToHouse(pHouse, pCage);//装房子}if (CMD_KILL_ANI == cmd) {int id = 0;cout << "请输入要杀死动物的笼子id" << endl;cin >> id;pPeo->KillAnimal(pHouse, id);}if (CMD_DESTORY_ANI == cmd) {int id = 0;cout << "请输入要销毁的笼子id" << endl;cin >> id;pPeo->DestoryCage(pHouse, id);}if (CMD_LOOK_ONE == cmd) {int id = 0;cout << "请输入要查看的笼子的id" << endl;cin >> id;pPeo->LookOne(pHouse,id);}if (CMD_LOOK_ALL == cmd) {pPeo->LookAll(pHouse);}if (CMD_PLAY == cmd) {int id = 0;cout << "请输入要玩耍的动物的笼子" << endl;cin >> id;pPeo->PlayWithAnimal(pHouse, id);}if (CMD_SHOW == cmd) {pPeo->showPeople();}if (CMD_QUIT == cmd) {cout << "程序即将退出..." << endl;Sleep(2000);break;}if (CMD_HELP == cmd) {help(); }getline(cin, Return);}//-------------------------------------------------------delete pHouse;pHouse = nullptr;delete pPeo;pPeo = nullptr;return 0;
}

 


http://www.ppmy.cn/news/55580.html

相关文章

【福利赠书】有人说,测试驱动开发已死?(文末赠书3本)

友情推荐一本测试领域的教科书&#xff1a;&#xff08;文末送3本&#xff09; 《 测试驱动开发&#xff1a;入门、实战与进阶》&#xff0c;英文原书名为《Learning Test-Driven Development 》&#xff0c;是一本实用且有趣的TDD实践教程。如果你想开始做测试驱动开发&#x…

基于全过程通道相关像素值顺序的彩色图像可逆数据隐藏

文献学习&#xff1a; 基于全过程通道相关像素值顺序的彩色图像可逆数据隐藏 原文题目&#xff1a; Reversible data hiding for color images based on pixel value order of overall process channel. 发表期刊&#xff1a; Signal Processing&#xff08;中科院二区&#xf…

设计模式之建造者模式

1、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于…

OpenCV——概率霍夫检测

概率霍夫变换是一种基于泛洪算法的直线检测算法。相较于传统霍夫变换&#xff0c;概率霍夫变换可以在保证一定的精度前提下&#xff0c;大大提高了直线检测效率。下面是 OpenCV C 实现概率霍夫检测的示例代码&#xff1a; #include <opencv2/opencv.hpp> #include &l…

华为OD机试真题(Java),整数编码(100%通过+复盘思路)

一、题目描述 实现一个整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下&#xff1a; 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码&#xff1b;字节的最高位表示后续是否还有字节&#xff0c;置1表…

《利用光体积描记图信号的模糊递推特性估计无袖带血压的级联卷积神经网络模型》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

Java并发(三)----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

QSqlQuery简单使用

QSqlQuery简单使用 1 执行一个查询2 浏览查询结果3 插入、更新和删除记录关键代码 Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法程序所在路径当前工作目录用户目录路径我的文档路径桌面路径程序数据存放路径临时文件路径 Qt中路径问题小结 原文链接&…