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

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


《老九学堂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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Protobuf 使用介绍

直接在 www.google.com.hk 上搜索google protobuf 后下载官方版本。 官方版本支持C\Java\Python三门语言。 还有很多非官方的语言版本支持&#xff0c;如C\NET(C#/Vb.net)\Flex(AS3)等. 要通信&#xff0c;必须有协议&#xff0c;否则双方无法理解对方的码流。在protobuf中&…

epoll的再次认识

使用mmap加速内核与用户空间的消息传递。 这 点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很 重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关…

leetcode82. 删除排序链表中的重复元素 II

给定一个排序链表&#xff0c;删除所有含有重复数字的节点&#xff0c;只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输出: 2->3 思路&#xff1a;判断n…

C++(16)--运算符重载(自定义Integer类)

运算符重载1.运算符重载--重点2.友元函数--难点(流运算符重载)《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》 -------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)--------…

反应器组件 ACE_Reactor

6.1 反应器组件 ACE_Reactor反应器的基本原理是: 针对关心的某个事件写一个事件处理器(event_handler). 将该事件处理器登记到反应器中(同时指明关心的事件). 然后反应器会自动检测事件的发生. 并调用预先登记的事件处理器中的回调函数. 所以ACE Reactor 框架的责任&#x…

C++(17)--详解const

详解const《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.const修饰成员变量 2.const修饰函数参数 3.c…

cppcheck的安装和使用

首先从这里下载linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下载对应的版本,解压,之后安装: 编译: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安装: make install

leetcode24 两两交换链表中的节点

给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 思路&#xff1a;这一看就是个递归定义&…

再议指针和引用的一些事情吧

关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题。 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自己也都是随性写的,可以参看以前我的一个文章:http://blog.csd…

C++(18)--复制构造函数

复制构造函数《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------包装基本类&#xff0c;封装一些算法。 需求…

lua与C++粘合层框架

一. lua调用C 在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型: typedef int (*lua_CFunction) (lua_State *L);   也就是说, 偶们在C中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是…

leetcode147 对链表进行插入排序

丢人&#xff0c;我就是按插入排序老老实实写的啊。。。。 别人肯定map了hhh。 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始&#xff0c;该链表可以被认为已经部分排序&#xff08;用黑色表示&#xff09;。 每次迭代时&#xff0c;从输入数据中移除一个…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 属于完全可见的信念网络&#xff0c;需要对 概率密度 建模。给定图像数据x&#xff0c;想要对概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同时作用结果的一个联合分布。一…

Expression : invalid operator 解决方法

从技术上说&#xff0c;用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。&#xff08;传给sort等算法的比较函数也有同样的限制&#xff09;,就是两个对象比大小或先后的规则&#xff0c;比如两个 string对象比大小的规则…

leetcode23 合并K个排序链表

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一个链表当成数组中的一个数&#xff0c;做…

Xcode LaunchImage 载入界面大小设置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 删除链表中的节点(你意想不到的做法,注意细节)

请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 现有一个链表 -- head [4,5,1,9]&#xff0c;它可以表示为: 示例 1: 输入: head [4,5,1,9], node 5 输出: [4,1,9] 解释: 给定你链…

cppcheck值得注意的一些筛选项

使用完cppcheck进行C代码检测之后&#xff0c;可能筛选起来很麻烦&#xff0c;一般常见的优化有 emptiness&#xff0c;就是当你使用stl的时候&#xff0c;最好用empty替代size 还有就是 leak

C++(19)--自定义Array,vector练习

自定义Array,vector1.自定义Array2.自定义vector《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.自定义…

让cocos2dx支持并通过arm64 编译

为了要支持64位,请把这个文件直接替换到对应的lib目录下,本来是需要改neton_matrix_impl.c里的宏定义, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 为#if defined(_ARM_ARCH_7) 还有 third_party目录下的curl的支持。