面向对象编程实践-欢乐斗地主

《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------

要求:实现录入及打印地主的信息功能
实现地主的摸牌,及查看牌面的功能。

// main 文件
#include <iostream>
#include "LandOwner.h"
using namespace std;
int main(){LandOwner *ptr_landowner1 = new LandOwner();LandOwner *ptr_landowner2 = new LandOwner("专业斗地主");LandOwner *ptr_landowner3 = new LandOwner("周扒皮");ptr_landowner1 -> ShowInfo();ptr_landowner2 -> ShowInfo();ptr_landowner3 -> ShowInfo();ptr_landowner2 -> TouchCard(3);// 向量容器vector, 动态数组可以在运行阶段设置长度// 具有数组的快速索引方式// 可以插入和删除元素// 定义和初始化 vector<double> vec1; vector<string> vec2(5); vector<int> vec3(20, 998)// 54 个元素的数组来表示扑克牌,除13得到花色,模13得到牌面delete ptr_landowner1;delete ptr_landowner2;delete ptr_landowner3;
}
// .h 文件
// 地主类
// Created by 陈莹莹 on 2021/2/5.
//#ifndef HELLOWORLD_LANDOWNER_H
#define HELLOWORLD_LANDOWNER_H
#include <iostream>
#include <vector>
using namespace std;class LandOwner {private:string m_NickName;string m_Sex;int m_Gold;long m_Exp;vector<int> currCards; // 当前玩家的手牌数组vector<int> packCards; // 默认的一副牌,从1-54vector<int> surplCards; // 摸牌后剩余的牌bool isContains(int); // 剩余牌中是否包含cardNum这个牌面void deleteCards(vector<int> &, int); // 删除剩余牌数组数string getColor(int); // 获得牌的花色string getValue(int); // 获得牌面public:LandOwner();LandOwner(string);LandOwner(string, string, int, long);~LandOwner();void ShowInfo();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();void ShowCards(vector<int> &);
};#endif //HELLOWORLD_LANDOWNER_H

vector显示输出:传统for循环输出、迭代器输出、简化迭代器:auto、auto区间遍历、copy算法输出

// .cpp文件
//
// Created by 陈莹莹 on 2021/2/5.
//
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include "LandOwner.h"
using namespace std;LandOwner::LandOwner(){SetNickName("默认地主");SetSex("保密");SetExp(0);SetGold(1000);cout << "LandOwner()" << endl;InitCards();}LandOwner::LandOwner(string nickName):m_NickName(nickName){SetSex("保密");SetExp(0);SetGold(1000);cout << "LandOwner(string nickName)" << endl;InitCards();
//    ShowCards(packCards);
//    ShowCards(currCards);
//    ShowCards(surplCards);
//    cout << "测试" << isContains(13);}
LandOwner::LandOwner(string nickName, string sex, int gold, long exp):m_NickName(nickName),m_Sex(sex),m_Gold(gold), m_Exp(exp)
{cout << "LandOwner(stirng nickName, string sex, int gold, long exp)" << endl;InitCards();
}void LandOwner::ShowInfo(){cout << "昵称:" << GetNickName() << endl;cout << "性别:" << GetSex() << endl;cout << "金币:" << GetGold() << endl;cout << "经验:" << GetExp() << endl;
}
void LandOwner::InitCards(){// 初始化packCards, surplusCards, currCards// 生成默认的一副扑克牌for(int i = 0; i < 54; i++){packCards.push_back(i + 1);surplCards.push_back(i + 1);}currCards.clear();
}void LandOwner::ShowCards(vector<int> &cards) {// 显示牌面信息// C 语言的习惯: 传统for 循环/** for(int i = 0; i < cards.size(); i++){cout << cards[i] << "\t";}cout << "\n" << endl;*/// C++语言习惯,迭代器的写法/** for(vector<int>::const_iterator iter = cards.begin(); iter != cards.end(); iter++){cout << *iter << ", ";}cout << endl; */// C++11 之后:迭代器的简写版本,类型推断/*for(auto iter = cards.begin(); iter != cards.end(); iter++){cout << *iter << "。 ";}cout << endl;*/// for 区间遍历for(auto card : cards){cout << card << ":" << getColor(card) << "-" << getValue(card) << "\t";}cout << endl;// 使用算法的方式,将容器的内容复制到cout 绑定的迭代器中// #include <iterator>
//    copy(cards.cbegin(), cards.cend(), ostream_iterator<int>(cout, "- "));
//    cout << endl;
}void LandOwner::TouchCard(int cardCount) {// 摸牌, 随机生成一张剩余牌中有的牌,更新连个牌面数组currCards, suplusCardssrand(time(NULL));for(int i = 0; i < cardCount; i++){int randIdex = rand() % 54 ; // 0-53 之间的随机数字// 判断:随机生成的这张牌是否在余牌数组中,私有方法if(isContains(packCards[randIdex])){currCards.push_back(packCards[randIdex]);// 在剩余牌数组中删除这张牌deleteCards(surplCards, packCards[randIdex]);}else{i--;     // 换一张牌}}cout << "<地主摸牌>-当前手牌如下" << endl;ShowCards(currCards);cout << "<地主摸牌>-剩余牌" << endl;ShowCards(surplCards);
}
bool LandOwner::isContains(int cardNum) {// 普通青年的做法
//    for(int i = 0; i < surplCards.size(); i++){//        if(surplCards[i] == packCards[cardIndex]){//            return true
//        }
//    }
//    return false// 使用算法来查找-findvector<int>::iterator iter = find(surplCards.begin(), surplCards.end(), cardNum);
//    if(iter == surplCards.end()){//        return false;
//    }
//    return true;return iter != surplCards.end();
}void LandOwner::deleteCards(vector<int> &cardVec, int card){// 普通青年的做法
//    for(auto iter = cardVec.begin(); iter != cardVec.end();){//        if(*iter == card){//            //iter = cardVec.erase(iter); // 返回值指向已删除元素的下一个元素
//        }
//        else{//            iter++;
//    }
//
//    }// 使用算法删除auto iter = find(cardVec.begin(), cardVec.end(), card);if(iter != cardVec.end()){cardVec.erase(iter); //方法调用不好}
}string LandOwner::getColor(int card) { // card 给的牌面if(card == 53) return "小王";if(card == 54) return "大王";string colors[] = {"黑桃", "红心", "方块", "梅花"};return colors[(card - 1) / 13];
}
string LandOwner::getValue(int card) {if(card == 53) return "Balck Joker";if(card == 54) return "Red Jocker";string values[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};return values[(card - 1) % 13];
}
LandOwner::~LandOwner(){cout << GetNickName() << "被释放" << endl;}

C++(15)--面向对象编程实践-欢乐斗地主(vector的花式输出)相关推荐

  1. 面向对象编程实践—桌面时钟的设计(Qt实现)

    桌面时钟是指集数字时钟.指针时钟.桌面月历.倒计时.日记本和闹铃提醒.备忘录提醒.整点半点报时.网络对时.定时关机.天气预报.定时任务.密码保护.在线更新.锁屏保护等功能于一身的一种桌面软件.桌面时钟 ...

  2. 面向对象编程,链式调用,先输出‘hello’,10秒之后,输出‘world’

    let obj={ awaitTime:null, consoleMsg:function(v){ if(this.awaitTime){ setTimeout(console.log(v),this ...

  3. Python类及面向对象编程【转】

    Python类及面向对象编程 类是用来创建数据结构和新类型对象的主要机制.本章的主题就是类,面向对象编程和设计不是本章的重点.本章假定你具有数据结构的背景知识及一定的面向对象的编程经验(其它面向对象的 ...

  4. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

  5. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  6. 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践

    本篇文章主要讲解在前文面向对象设计原则(SOLID)后,如何应用这些原则形成的LVOOP中HAL(Hardware Abstraction Layer)和MAL(Measurement Abstrac ...

  7. 这可能是 Python 面向对象编程的最佳实践

    Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了或者某一对象非常复杂了,其中的一些写法会相当相当繁琐,而且我们会经常碰到对象和 J ...

  8. ros机器人编程实践(15.2)- 使用科大讯飞语音控制turtlebot导航

    一.前言 接上一篇博客:ros机器人编程实践(15.1)- 使用科大讯飞语音控制turtlebot导航 二.使用科大讯飞语音SDK 对着上一篇博客中科大讯飞的安装教程,创建了robot_voice的基 ...

  9. 斗地主Java课程设计_JAVA面向对象编程课程设计——web版斗地主

    一.团队课程设计博客链接 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记录 注:这里只有部分提交记录,详细的提交记录在团队 ...

最新文章

  1. CodeAction_beta02 斐波那契 (多维DP)
  2. nginx proxy svn 加快_Hexo+Nginx+SVN搭建网站
  3. html dom获得父div,获取元素的父div
  4. python read_csv chunk_Python 数据分析之逐块读取文本的实现
  5. drill apache_使用Apache Drill深入研究当今的大数据
  6. 是什么让南浔银行动了心?“高端存储+双活”
  7. java自动封箱_java自动封箱是什么意思
  8. 用于android天气开发的背景图,Android开发天气预报APP的设计与实现毕业设计.pdf
  9. 如果赚钱很容易,为什么轮到你?
  10. 【一段日子荟萃】最近有点烦
  11. 刚接手的项目代码 怎么看_你们刚开始是怎么看英文文献的?
  12. javascript封装滑块
  13. 全球消费精品消博会亮相!科蒂、资生堂、欧莱雅、奔富、保乐力加、红牛、雀巢、拜耳、澳佳宝都来了 | 美通社头条...
  14. 零假设(Null Hypothesis)
  15. 【经验帖】深度学习如何训练出好的模型
  16. Unity中利用LineRenderer绘制寻路路径
  17. 当你的工作==你热爱的事情,是一种什么体验?
  18. 前端基础-黑马视频开始学习-1
  19. 文件上传与下载的场景梳理
  20. 【论文笔记】开放场景下的实时视觉重定位方法 HF-Net 2019

热门文章

  1. 修改了WINCE自带的驱动程序后如何编译
  2. 12306加密传输_三大运营商发5G消息白皮书:短消息服务升级,支持加密传输
  3. mysql存储引擎的区别_Mysql的两种存储引擎以及区别
  4. 【转】1.1异步编程:线程概述及使用
  5. 【转】理解SQL Server的安全对象和权限
  6. 静态html js文件上传,js实现动态添加上传文件页面
  7. 阿里云服务器被[kthreaddi]挖矿病毒攻击
  8. 【JS 逆向百例】XHR 断点调试,Steam 登录逆向
  9. Python3 爬虫学习笔记 C11【数据储存系列 — MongoDB】
  10. 分治算法求最大最小值c语言,[蓝桥杯][算法提高VIP]和最大子序列 (C语言代码)分治法...