8.1 Design the data structures for a generic deck of cards. Explain how you would subclass the data structures to implement blackjack.

这道题让我们设计一个21点纸牌游戏的数据结构,用面向对象的思想来设计。那么既然21点是一种特定的纸牌游戏,它可以是从普通纸牌的基础上派生出来的。所以我们先实现最基本的纸牌类Card,里面包括值和花色,还有一些基本的判断或标记可用性的函数。然后就是基本的牌堆类Deck,可以用来加入牌,洗牌,发牌以及算剩余牌数。还需要一个当前手牌类Hand,可以计算当前分数,可以加牌等。然后就是它们的派生类21点纸牌类BlackJackCard,包括计算值,计算最大最小值,判断是不是Ace等等,然后就是21点手牌类BlackjackHand,计算当前得分,判断是否爆了,是否是21点等等。以下代码为书上代码,有些函数体写实现,所以暂时无法用具体运行。

// C++ defination
enum Suit {Club, Diamond, Heart, Spade}; template<class T>
class Deck {
public:
void setDeckOfCards(vector<T> deckOfCards) {}; // ...
void shuffle() {}; // ...
int remainingCards() {
return _cards.size() - _dealtIndex;
}
vector<T> dealHead(int number) {}; // ...
T dealCard() {}; // ...
private:
vector<T> _cards;
int _dealtIndex = ;
}; class Card {
public:
Card(int c, Suit s): _faceValue(c), _suit(s) {};
virtual int value() = ;
Suit suit() { return _suit; };
bool isAvailable() { return _available; };
void markUnavailable() { _available = false; };
void markAvailable() { _available = true; };
protected:
int _faceValue;
Suit _suit;
private:
bool _available = true;
}; template<class T>
class Hand {
public:
int score() {
int score = ;
for (T card : cards) {
score += card.value();
}
return score;
}
void addCard(T card) {
cards.add(card);
}
protected:
vector<T> cards;
}; class BlackJackCard: public Card {
public:
BlackJackCard(int c, Suit s): Card(c,s) {};
int value() {
if (isAce()) return ;
else if (_faceValue >= && _faceValue <= ) return ;
else return _faceValue;
}
int minValue() {
if (isAce()) return ;
else return value();
}
int maxValue() {
if (isAce()) return ;
else return value();
}
bool isAce() {
return _faceValue == ;
}
bool isFaceCard() {
return _faceValue >= && _faceValue <= ;
}
}; class BlackjackHand: public Hand<BlackJackCard> {
public:
int score() {
vector<int> scores = possibleScores();
int maxUnder = INT_MIN, minOver = INT_MAX;
for (auto a : scores) {
if (a > && a < minOver) {
minOver = a;
} else if (a <= && a > maxUnder) {
maxUnder = a;
}
}
return maxUnder == INT_MIN ? minOver : maxUnder;
}
bool busted() { return score() > ; };
bool is21() { return score() == ; };
bool isBlackJack() {}; // ...
private:
vector<int> possibleScores() {}; // ...
};

[CareerCup] 8.1 Implement Blackjack 实现21点纸牌的更多相关文章

  1. [CareerCup] 3.1 Implement Three Stacks using Array 使用数组来实现三个栈

    3.1 Describe how you could use a single array to implement three stacks. 这道题让我们用一个数组来实现三个栈,书上给了两种方法, ...

  2. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列

    3.5 Implement a MyQueue class which implements a queue using two stacks. LeetCode上的原题,请参见我之前的博客Imple ...

  3. [CareerCup] 7.4 Implement Multiply Subtract and Divide 实现乘法减法和除法

    7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...

  4. [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表

    8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 这道题让 ...

  5. WinForm-简单21点纸牌小游戏

    纸牌游戏有很多种玩法,C#代码写的纸牌游戏,网上也能找到不少,从中也能学习到不少知识,自己动手也写一个,算是记录下学习过程吧. 纸牌21点的玩法也比较简单,就是看谁手中的所有牌相加是21点,或是离21 ...

  6. C++和Java中枚举enum的用法

    在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...

  7. python面对对象编程----1:BlackJack(21点)

    昨天读完了<Mastering Object-oriented Python>的第一部分,做一些总结. 首先,第一部分总过八章,名字叫Pythonic Classes via Specia ...

  8. CareerCup All in One 题目汇总 (未完待续...)

    Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...

  9. BlackJack Strategy

    GAME SPEC: 2-deck, 104 cards total. Bellagio has 2-deck and 6-deck games. based on hard 17, dealer h ...

随机推荐

  1. animation of android (1)

    android把动画的模式分为:property animation,view animation,drawable animation. view animation:给出动画的起止状态,并且通过一 ...

  2. C# List中随机获取N个字符

    static void Main(string[] args) { List<string> strList = new List<string>(); ; i <= ; ...

  3. WebService核心之WSDL深入详解

    WebService核心之WSDL深入详解 根据上一篇文章开发的Web Service实例生成的WSDL文档如下: XML里两个属性介绍: targetNamespace          相当于ja ...

  4. Javascript中substr和substring的区别

    由于在项目中有需要对字符串进行截取,然后手残使用了IDE自动提示的substr,没想那么多以为substr和substring没多大区别. 然而并不是,且听我一一道来. 1. substr(index ...

  5. PPT制作教程:如何制作ppt

    PowerPoint(PPT)是专门用于制作演示文稿(俗称幻灯片).广泛运用于各种会议.产品演示.学校教学等.学会如何制作ppt,成为提升工作效 率的好帮手.PPT包含有很多的功能,我们可以根据个人喜 ...

  6. 利用API方式进行数据库的增删改查

    /* 将数据库的增删改查单独放进一个包 */ package com.itheima28.sqlitedemo.dao; import java.util.ArrayList; import java ...

  7. linux搭建mysql 5.6.28

    1.下载rmp文件 http://dev.mysql.com/downloads/mysql/ 2.安装 rpm -ivh MySQL-server--.linux_glibc2..x86_64.rp ...

  8. Java Consumer and Producer demo

    import java.util.Random; import java.util.concurrent.LinkedBlockingQueue; class producer {     Rando ...

  9. HBase 专题技术收录

    HBase系列: 博客地址:http://www.cnblogs.com/panfeng412/tag/HBase/ 技术专题文章: HBase中MVCC的实现机制及应用情况 HBase在单Colum ...

  10. cnblogs美化及插件

    1.vp计数 http://www.amazingcounters.com 2.来源地图 http://clustrmaps.com 2.1来源地图 http://www.flagcounter.co ...