使用类创建对象

类的两种实例化的方式

在这里插入图片描述

项目

在这里插入图片描述

程序

main.cpp

#include <iostream>
#include <string>
#include "Landowner.h"
using namespace std;

int main()
{
    Landowner* ptr_Landower1 = new Landowner();
    Landowner* ptr_Landower2 = new Landowner("傻不拉几改改熊");
    Landowner* ptr_Landower3 = new Landowner("机智善勇红红狗");

    ptr_Landower1 -> showInfo();
    ptr_Landower2 -> showInfo();
    ptr_Landower3 -> showInfo();

    ptr_Landower1 ->TouchCard(20);
    ptr_Landower2 ->TouchCard(20);

    delete ptr_Landower1;
    delete ptr_Landower2;
    delete ptr_Landower3;


    cout << "Hello world!" << endl;
    return 0;
}

include\Landowner.h

#ifndef LANDOWNER_H
#define LANDOWNER_H
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Landowner
{
    public:
        Landowner();

        Landowner(string);
        Landowner(string, string, int, long);

        virtual ~Landowner();

        string GetNickName() { return m_NickName; }
        void SetNickName(string val) { m_NickName = val; }
        string GetSex() { return m_Sex; }
        void SetSex(string val) { m_Sex = val; }
        int GetGold() { return m_Gold; }
        void SetGold(int val) { m_Gold = val; }
        long GetExp() { return m_Exp; }
        void SetExp(long val) { m_Exp = val; }

        void TouchCard(int cardCount);//摸牌
        void InitCards();//初始化packCards surplusCards currCards
        void showInfo();
        void showCards(const vector<int>&);//显示牌面

    protected:

    private:
        string m_NickName;
        string m_Sex;
        int m_Gold;
        long m_Exp;
        vector<int> packCards; //原始牌,从1到54
        vector<int> surplusCards; //摸牌后,剩余的牌
        vector<int> currCards; //当前玩家的手牌数组
        bool isContains(int); //剩余牌中是否包含cardNums这个牌面
        void deleteCard(vector<int>&, int);//删除集合中的数字
        string getColor(int); //获得牌的花色
        string getValue(int); //获得牌面
};

#endif // LANDOWNER_H

src\Landowner.cpp

#include "Landowner.h"
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
Landowner::Landowner()
{
    //ctor
    SetNickName("默认地主巨无霸");
    SetSex("不告诉你");
    SetGold(1000);
    SetExp(0);
    cout << "Landowner()" << endl;
    InitCards();
}
Landowner::Landowner(string nickName) : m_NickName(nickName)
{
    SetNickName(nickName);
    SetSex("保密");
    SetGold(1000);
    SetExp(0);
    cout << "Landowner(string)" << endl;
    InitCards();
}
Landowner::Landowner(string nickName, string sex, int gold, long exp) : m_NickName(nickName),m_Sex(sex),m_Gold(gold),m_Exp(exp)
{
    cout << "Landowner(string, string, int, long)" << endl;
    InitCards();
}
void Landowner::showInfo()
{
    cout << "昵称: " << GetNickName() << endl;
    cout << "性别: " << GetSex() << endl;
    cout << "金币: " << GetGold() << endl;
    cout << "经验: " << GetExp() << "\n********************" << endl;
}
void Landowner::InitCards()//初始化packCards surplusCards currCards
{
    //生成默认的一副扑克牌
    for(int i = 0; i < 54; i++)
    {
        packCards.push_back(i+1);
        surplusCards.push_back(packCards.at(i));
    }
    currCards.clear();
    //showCards(packCards);
}
void Landowner::showCards(const vector<int>& cards)//显示牌面
{
    /*法一 c语言习惯
    for(unsigned int i = 0; i < cards.size(); i++)
    {
        cout << cards[i] << ", ";
    }
    */
    /*//法二 使用迭代器
    for(vector<int>::const_iterator iter = cards.begin(); iter != cards.end(); iter++)
    {
        cout << *iter << ", ";
    }
    */
    /*//法三 使用迭代器的简写方式 C++11的类型推断功能auto
    for(auto iter = cards.begin(); iter != cards.end(); iter++)
    {
        cout << *iter << ", ";
    }
    */
    /*//法四 c++11的for区间遍历
    for(auto card : cards)
    {
        cout << card << ", ";
    }
    */
    /*
    //使用算法的方式,将容器的内容复制到cout绑定的迭代器中
    //需要导入头文件 #include<iterator> #include<algorithm>
    copy(cards.cbegin(),cards.cend(),ostream_iterator<int>(cout,", "));
    */
    for(auto card : cards)
    {
        cout << card << "-" << getColor(card) << "-" << getValue(card) << ", ";
    }
    cout << endl;
}

void Landowner::TouchCard(int cardCount)//摸牌
{
    //随机生成一张剩余牌集合中有的牌,添加到currCards集合中,从surplusCards中删除这张牌
    //需要#include <cstdlib> #include <ctime>
    srand(time(NULL));//时间种子
    for(int i = 0; i < cardCount; i++)
    {
        int randIndex = rand() % 54; //0-53之间的随机数字
        //判断:随机生成的这张牌是否在剩余牌集合中
        if(isContains(packCards[randIndex]))
        {
            currCards.push_back(packCards[randIndex]);//将摸的牌放到当前手牌数组中
            deleteCard(surplusCards, packCards[randIndex]);//在剩余牌集合中删除刚刚摸的那张牌
        }
        else
        {
            i--;//重新摸牌,相当于这一轮啥也没干
        }
    }
    cout << "地主摸牌 当前手牌如下: \n";
    showCards(currCards);
    cout << "\n********************\n地主摸牌后 剩余牌面如下: \n";
    showCards(surplusCards);


}
bool Landowner::isContains(int cardNum)
{
    //使用算法查找
    vector<int>::iterator iter = find(surplusCards.begin(), surplusCards.end(), cardNum);
    if(iter == surplusCards.end())
    {
        return false;
    }
    else
    {
        return true;
    }
}
void Landowner::deleteCard(vector<int>& cardVec, int card)
{
    //使用算法删除
    auto iter = find(cardVec.begin(), cardVec.end(), card);
    if(iter != cardVec.end())
    {
        cardVec.erase(iter);
    }
}
string Landowner::getColor(int card) //获得牌的花色
{
    if(card == 53) return "小王";
    if(card == 54) return "大王";
    string colors[] = {"黑桃","红心","方块","梅花"};
    return colors[(card-1)/13];//因为card不是下标,card-1才是下标
}
string Landowner::getValue(int card) //获得牌面
{
    if(card == 53) return "Black Joker";
    if(card == 54) return "Red Joker";
    string values[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    return values[(card-1)%13];
}
Landowner::~Landowner()
{
    //dtor
    cout << GetNickName() << "所占内存空间被释放\n";
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值