事先声明,本人坚决反对赌博,对众多程序员助纣为虐,远赴东南亚等地编写赌博网站的行为也很反感,更有甚者,使用python进行黑客行为,非法爬虫,真正实现了“C++从入门到入土”,“python从入门到入狱”.今年,已经有法规规定杜绝上架一切德州扑克游戏,本人最近想看看C++语法,就写个小程序练练手,只有简单的人机功能,参考了《轻松学会C++》部分代码,但核心部分全是本人创作,代码只供交流学习用,严禁一切非法用途。其他代码和程序在本人博客的资源里,和以前一样,有一些不影响大局的小bug,比如全局变量和局部变量等等,本人无意修复。
eval.cpp
#includeusing namespace std; class eval { public: eval(Card* pCards); double rank_hand(); private: int rankCounts[13]; //int type; //int max; int suitCounts[4]; int has_reps(int n); bool is_straight(); bool verify_straight(int n); bool is_flush(); bool is_two_pair(); }; eval::eval(Card* pCards) { for (int i = 0;i < 13;++i) { rankCounts[i] = 0; } for (int i = 0;i < 4;++i) { suitCounts[i] = 0; } for (int i = 0;i < 5;++i) { int r = pCards[i].rank; int s = pCards[i].suit; ++rankCounts[r]; ++suitCounts[s]; } } double eval::rank_hand() { double score,first, second,third,fourth,fifth=0; if (is_straight() && is_flush()) { for (int i = 12;i >= 0;i--) { if (rankCounts[i]!= 0) { first = i *1.0/ 20; score = 10 + first; break; } } cout << "同花顺" << endl; } //这里仅仅考虑一副牌的情况,所以4条只需考虑4张牌的点数 else if (has_reps(4)) { for (int i = 0;i < 13;++i) { if (rankCounts[i] == 4) { first = i *1.0/ 20; score = 9 + first; break; } } cout << "四条" << endl; } //同上,只考虑3条的点数 else if (has_reps(3) && has_reps(2)) { for (int i = 0;i < 13;++i) { if (rankCounts[i] == 3) { first = i *1.0/ 20; score = 8 + first; break; } } cout<<"葫芦"; } else if (is_flush()) { for (int i = 12;i >= 0;i--) { if (rankCounts[i] != 0) { first = i *1.0/ 20; for (int j = i - 1;j >= 0;j--) { if (rankCounts[j] != 0) { second = j *1.0/ 400; for (int k = j - 1;k >= 0;k--) { if (rankCounts[k] != 0) { third = k*1.0 / 8000; for (int l = k - 1;l >= 0;l--) { if (rankCounts[k] != 0) { fourth = l *1.0/ 160000; for (int m = l - 1;m >= 0;m--) { fifth = m*1.0 / 3200000; } } } } } } } } } cout<<"同花"; score = 7 + first+second+third+fourth+fifth; } else if (is_straight()) { for (int i = 12;i >= 0;i--) { if (rankCounts[i] != 0) { first = i*1.0 / 20; break; } } cout<<"顺子"; score = 6 + first; } else if (has_reps(3)) { for (int i = 0;i < 13;++i) { if (rankCounts[i] == 3) { first = i *1.0/ 20; break; } } cout<< "三条"; score = 5 + first; } else if (is_two_pair()) { for (int i = 12;i >=0;--i) { if (rankCounts[i] == 2) { first = i *1.0/ 20; for (int j = i - 1;j >= 0;--j) { if (rankCounts[j] == 2) { second = j *1.0/ 400; for (int k = 12;k >= 0;--k) { if (rankCounts[k] == 1) { third = k *1.0/ 8000; } } } } } } cout<<"两对"; score = 4 + first+second+third; } else if (has_reps(2)) { for (int i = 12;i >= 0;--i) { if (rankCounts[i] == 2) { first = i*1.0 / 20; for (int j = 12;j >= 0;--j) { if (rankCounts[j] != 0) { second = j*1.0 / 400; for (int k = j - 1;k >= 0;--k) { if (rankCounts[k] != 0) { third = k*1.0 / 8000; for (int l = k - 1;l >= 0;--l) { if (rankCounts[l] != 0) { fourth = l*1.0 / 160000; } } } } } } } } cout<<"一对"; score = 3+ first+second+third+fourth; } else { for (int i = 12;i >= 0;i--) { if (rankCounts[i] != 0) { first = i*1.0 / 20; for (int j = i - 1;j >= 0;j--) { if (rankCounts[j] != 0) { second = j*1.0 / 400; for (int k = j - 1;k >= 0;k--) { if (rankCounts[k] != 0) { third = k*1.0 / 8000; for (int l = k - 1;l >= 0;l--) { if (rankCounts[l] != 0) { fourth = l *1.0/ 160000; for (int m = l - 1;m >= 0;m--) { if (rankCounts[m] != 0) { fifth = m * 1.0 / 3200000; score = 2.0 + first + second + third + fourth; } } } } } } } } } } cout<<"高牌"; } return score; } int eval::has_reps(int n) { for (int i = 0;i < 13;++i) { if (rankCounts[i] == n) { return true; } } return false; } bool eval::is_straight() { for (int i = 0;i <= 8;++i) { if (rankCounts[i] == 1) { return verify_straight(i); } } return false; } bool eval::verify_straight(int n) { for (int i = n + 1;i < n + 5;++i) { if (rankCounts[i] != 1) { return false; } } return true; } bool eval::is_flush() { for (int i = 0;i < 4;++i) { if (suitCounts[i] == 5) { return true; } } return false; } bool eval::is_two_pair() { int n = 0; for (int i = 0;i < 13;++i) { if (rankCounts[i] == 2) { ++n; } } return n == 2; }
card.cpp
#includeusing namespace std; class Card { public: Card() {} Card(int r, int s) { rank = r;suit = s; } int rank; int suit; string display(); }; string Card::display() { static const string aRanks[] = { "2","3","4","5","6","7","8","9","10","J","Q","K","A" }; static const string aSuits[] = { "梅花","方块","红桃","黑桃" }; return aSuits[suit] + aRanks[rank] + "."; }
deck.cpp
#include#include #include using namespace std; class Deck { public: int iCard; Deck(); Card deal_a_card(); private: int cards[52]; void shuffle(); }; Deck::Deck() { srand(time(NULL)); for (int i = 0;i < 52;++i) { cards[i] = i; } shuffle(); } void Deck::shuffle() { iCard = 0; for (int i = 51;i > 0;--i) { int j = rand() % (i + 1); int temp = cards[i]; cards[i] = cards[j]; cards[j] = temp; } } Card Deck::deal_a_card() { if (iCard > 42) { cout << endl << "牌不够了,正在重新洗牌..." << endl; shuffle(); } int r = cards[iCard] % 13; int s = cards[iCard++] / 13; return Card(r, s); }



