《C++游戏编程入门》第8章 类:Critter Caretaker

《C++游戏编程入门》第8章 类:Critter Caretaker

8.1 定义新类型

08.simple_critter.cpp
cpp 复制代码
#include <iostream>
using namespace std;

class Critter // 类定义,定义新类型Critter
{
public:
    int m_Hunger; // 声明数据成员
    void Greet(); // 声明成员函数
};

void Critter::Greet() // 成员函数定义
{
    cout << "Hi. I'm a critter. My hunger level is " << m_Hunger << ".\n";
}

int main()
{
    Critter crit1; // 对象实例化
    Critter crit2;

    crit1.m_Hunger = 9; // 对象操作
    cout << "crit1's hunger level is " << crit1.m_Hunger << ".\n";

    crit2.m_Hunger = 3;
    cout << "crit2's hunger level is " << crit2.m_Hunger << ".\n\n";

    crit1.Greet(); // 成员函数调用
    crit2.Greet();

    return 0;
}

8.2 使用构造函数

构造函数,实例化新对象时自动调用,通常初始化工作,给数据成员赋值。

08.constructor_critter.cpp
cpp 复制代码
#include <iostream>
using namespace std;

class Critter
{
public:
    int m_Hunger;

    Critter(int hunger = 0); // 声明构造函数,提供默认参数
    void Greet();
};

Critter::Critter(int hunger) // 定义构造函数
{
    cout << "A new critter has been born!" << endl;
    m_Hunger = hunger;
}

void Critter::Greet()
{
    cout << "Hi. I'm a critter. My hunger level is " << m_Hunger << ".\n\n";
}

int main()
{
    Critter crit(7);
    crit.Greet();

    return 0;
}

8.3 设置成员访问级别

避免直接修改或访问对象的数据成员,让成员函数维护。

08.private_critter.cpp
cpp 复制代码
#include <iostream>
using namespace std;

class Critter
{
public: // begin public section
    Critter(int hunger = 0);
    int GetHunger() const;
    void SetHunger(int hunger);

private: // begin private section
    int m_Hunger;
};

Critter::Critter(int hunger)
    : m_Hunger(hunger)
{
    cout << "A new critter has been born!" << endl;
}

int Critter::GetHunger() const // const不能修改非静态数据成员值,不能调用非常量成员函数
{
    return m_Hunger;
}

void Critter::SetHunger(int hunger)
{
    if (hunger < 0)
    {
        cout << "You can't set a critter's hunger to a negative number.\n\n";
    }
    else
    {
        m_Hunger = hunger;
    }
}

int main()
{
    Critter crit(5);
    // cout << crit.m_Hunger; -- illegal, m_Hunger is private!
    cout << "Calling GetHunger(): " << crit.GetHunger() << "\n\n";

    cout << "Calling SetHunger() with -1.\n";
    crit.SetHunger(-1);

    cout << "Calling SetHunger() with 9.\n";
    crit.SetHunger(9);
    cout << "Calling GetHunger(): " << crit.GetHunger() << "\n\n";

    return 0;
}

8.4 使用静态数据成员与静态成员函数

08.static_critter.cpp
cpp 复制代码
#include <iostream>
using namespace std;

class Critter
{
public:
    static int s_Total; // 静态成员变量声明
                        // total number of Critter objects in existence

    Critter(int hunger = 0);
    static int GetTotal(); // 静态成员函数声明

private:
    int m_Hunger;
};

int Critter::s_Total = 0; // 静态成员变量定义并初始化

Critter::Critter(int hunger) : m_Hunger(hunger)
{
    cout << "A critter has been born!" << endl;
    ++s_Total;
}

int Critter::GetTotal() // 静态成员函数定义,不能访问非静态数据成员
{
    return s_Total;
}

int main()
{
    cout << "The total number of critters is: ";
    cout << Critter::s_Total << "\n\n"; // 访问静态常用变量

    Critter crit1, crit2, crit3;

    cout << "\nThe total number of critters is: ";
    cout << Critter::GetTotal() << "\n"; // 调用静态成员函数

    return 0;
}

8.5 Critter Caretaker游戏

08.critter_caretaker.cpp
cpp 复制代码
#include <iostream>
using namespace std;

class Critter
{
public:
    Critter(int hunger = 0, int boredom = 0);
    void Talk();
    void Eat(int food = 4);
    void Play(int fun = 4);

private:
    int m_Hunger;  // 饥饿程度
    int m_Boredom; // 厌倦程度

    int GetMood() const;
    void PassTime(int time = 1);
};

Critter::Critter(int hunger, int boredom)
    : m_Hunger(hunger), m_Boredom(boredom)
{
}

inline int Critter::GetMood() const
{
    return (m_Hunger + m_Boredom);
}

void Critter::PassTime(int time)
{
    m_Hunger += time;
    m_Boredom += time;
}

void Critter::Talk()
{
    cout << "I'm a critter and I feel ";

    int mood = GetMood();
    if (mood > 15)
        cout << "mad.\n";
    else if (mood > 10)
        cout << "frustrated.\n";
    else if (mood > 5)
        cout << "okay.\n";
    else
        cout << "happy.\n";

    PassTime();
}

void Critter::Eat(int food)
{
    cout << "Brruppp.\n";

    m_Hunger -= food;
    if (m_Hunger < 0)
        m_Hunger = 0;

    PassTime();
}

void Critter::Play(int fun)
{
    cout << "Wheee!\n";

    m_Boredom -= fun;
    if (m_Boredom < 0)
        m_Boredom = 0;

    PassTime();
}

int main()
{
    Critter crit;
    crit.Talk();

    int choice;
    do
    {
        cout << "\nCritter Caretaker\n\n";
        cout << "0 - Quit\n";
        cout << "1 - Listen to your critter\n";
        cout << "2 - Feed your critter\n";
        cout << "3 - Play with your critter\n\n";

        cout << "Choice: ";
        cin >> choice;

        switch (choice)
        {
        case 0:
            cout << "Good-bye.\n";
            break;
        case 1:
            crit.Talk();
            break;
        case 2:
            crit.Eat();
            break;
        case 3:
            crit.Play();
            break;
        default:
            cout << "\nSorry, but " << choice << " isn't a valid choice.\n";
        }
    } while (choice != 0);

    return 0;
}
相关推荐
jingfeng5143 分钟前
C++多态
开发语言·c++
kyle~15 分钟前
C/C++---浮点数与整形的转换,为什么使用sqrt函数时,要给参数加上一个极小的小数(如1e-6)
c语言·开发语言·c++
jokr_16 分钟前
C++ STL 专家容器:关联式、哈希与适配器
java·c++·哈希算法
倔强的石头1 小时前
java程序员如何搭建C++windows开发环境搭建(二)
c++·后端
weixin_424294671 小时前
Unity:游戏性能优化!之把分散在各个游戏角色GameObject上的脚本修改为在一个脚本中运行。这样做会让游戏运行更高效?
游戏·unity·性能优化
The Chosen One9852 小时前
红黑树下探玄机:C++ map&multimap 的幕后之旅
开发语言·c++
汤永红2 小时前
week5-[字符数组]查找
c++·算法·信睡奥赛
快乐的划水a2 小时前
中介者模式及优化
c++·设计模式·中介者模式
多吃蔬菜!!!2 小时前
VsCode 上的Opencv(C++)环境配置(Linux)
开发语言·c++
咔咔咔的3 小时前
1277. 统计全为 1 的正方形子矩阵
c++