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.pswp.cn/news/444804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444804.shtml
英文地址,請注明出處:http://en.pswp.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的支持。