- // <Copyright liaoqb>
- // This is a class for 21!!!
- #include <iostream>
- #include <cstdlib>
- #include <ctime>
- #include <string>
- #include <vector>
- #include <unistd.h> //仅适用于Linux系统, windows系统请用#include <windows.h>且将sleep(2)改为Sleep(2000)
- using namespace std;
- struct card {
- std::string type;
- std::string number;
- };
- const std::string color[4] = {"spade", "hearts", "plum", "diamonds"};
- const std::string pick[13] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
- class Card {
- public:
- Card();
- ~Card();
- void firstDeal();
- void shuffle(); // make the poker a random order
- void playerDeal(); // deal for player
- void bankerDeal(); // deal for banker
- bool isDead(std::vector<card> c) const;
- bool isPlayerWanted();
- bool replay();
- void printBanker() const;
- void printPlayer() const;
- void result();
- bool bankerWanted();
- std::vector<card> getPlayer() const {return player;}
- private:
- static card poker[52];
- std::vector<card> banker;
- std::vector<card> player;
- int count;
- void swap(int c1, int c2);
- void init();
- int getTotleNumber(std::vector<card> c) const;
- };
- card Card::poker[52] = {{"", ""}};
- Card::Card() {
- count = 0;
- init();
- }
- Card::~Card() {}
- void Card::init() {
- card cards;
- for (int i = 0; i < 52; ++i) {
- cards.type = color[i % 4];
- cards.number = pick [i / 4];
- poker[i] = cards;
- }
- }
- void Card::firstDeal() {
- bankerDeal();
- playerDeal();
- bankerDeal();
- playerDeal();
- }
- void Card::shuffle() {
- srand(static_cast<int>(time(NULL)));
- int a = 0;
- int b = 0;
- for (int i = 0; i < 1000; ++i) {
- a = rand() % 52;
- b = rand() % 52;
- swap(a, b);
- }
- }
- void Card::playerDeal() {
- player.push_back(poker[count++]);
- }
- void Card::bankerDeal() {
- banker.push_back(poker[count++]);
- }
- bool Card::bankerWanted() {
- if (getTotleNumber(banker) < getTotleNumber(player) && !isDead(banker) && !isDead(player)) {
- return true;
- } else if (getTotleNumber(banker) == getTotleNumber(player) &&
- !isDead(banker) && !isDead(player) && getTotleNumber(banker) >=20) {
- return false;
- } else {
- return false;
- }
- }
- int Card::getTotleNumber(std::vector<card> c) const {
- bool check = false;
- int num = 0;
- for (unsigned int i = 0; i < c.size(); ++i) {
- if (c[i].number == "A") {
- check = true;
- num += 1;
- } else if (c[i].number == "2" || c[i].number == "3" || c[i].number == "4" ||
- c[i].number == "5" || c[i].number == "6" || c[i].number == "7" ||
- c[i].number == "8" || c[i].number == "9") {
- num += atoi(c[i].number.c_str());
- } else {
- num += 10;
- }
- }
- if (check && num + 10 <= 21)
- num += 10;
- return num;
- }
- bool Card::isDead(std::vector<card> c) const {
- if (getTotleNumber(c) > 21)
- return true;
- else
- return false;
- }
- bool Card::isPlayerWanted() {
- char c;
- do {
- std::cout << "Do you want a card?Y/N : ";
- std::cin >> c;
- } while (!(c == 'y' || c == 'Y' || c == 'n' || c == 'N'));
- if (c == 'y' || c == 'Y')
- return true;
- else
- return false;
- }
- bool Card::replay() {
- banker.clear();
- player.clear();
- count = 0;
- char c;
- do {
- std::cout << "Do you want to replay?Y/N : ";
- std::cin >> c;
- } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
- if (c == 'y' || c == 'Y')
- return true;
- else
- return false;
- }
- void Card::printBanker() const {
- std::cout << "The banker's cards are:\\n";
- for (unsigned int i = 0; i < banker.size(); ++i) {
- if (i)
- std::cout << ' ' << banker[i].number;
- else
- std::cout << banker[i].number;
- }
- std::cout << endl;
- std::cout << "Banker's total numbers are:\\n" << getTotleNumber(banker) << endl;
- std::cout << endl;
- }
- void Card::printPlayer() const {
- std::cout << "The player's cards are:\\n";
- for (unsigned int i = 0; i < player.size(); ++i) {
- if (i)
- std::cout << ' ' << player[i].number;
- else
- std::cout << player[i].number;
- }
- std::cout << endl;
- std::cout << "Your total numbers are:\\n" << getTotleNumber(player) << endl;
- std::cout << endl;
- }
- void Card::result() {
- if (isDead(banker)) {
- std::cout << "player wins!!!\\n";
- } else if (isDead(player)) {
- std::cout << "banker wins!!!\\n";
- } else {
- if (getTotleNumber(banker) > getTotleNumber(player))
- std::cout << "banker wins!!!\\n";
- else if (getTotleNumber(banker) < getTotleNumber(player))
- std::cout << "player wins!!!\\n";
- else
- std::cout << "equal!!!\\n";
- }
- std::cout << endl;
- }
- void Card::swap(int c1, int c2) {
- card c;
- c = poker[c1];
- poker[c1] = poker[c2];
- poker[c2] = c;
- }
- int main(int argc, char* argv[]) {
- Card c;
- do {
- bool flag = false;
- c.shuffle();
- c.firstDeal();
- c.printBanker();
- cout << endl;
- c.printPlayer();
- cout << endl;
- while (c.isPlayerWanted()) {
- c.playerDeal();
- cout << endl;
- c.printBanker();
- cout << endl;
- c.printPlayer();
- cout << endl;
- if (c.isDead(c.getPlayer())) {
- flag = true;
- break;
- }
- }
- if (!flag) {
- while (c.bankerWanted()) {
- sleep(2);
- c.bankerDeal();
- cout << endl;
- c.printBanker();
- cout << endl;
- c.printPlayer();
- }
- }
- c.result();
- } while (c.replay());
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/210520149643.html
来源: http://www.codesnippet.cn/detail/210520149643.html