栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

C++实现德州扑克游戏(和电脑一起玩)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现德州扑克游戏(和电脑一起玩)

事先声明,本人坚决反对赌博,对众多程序员助纣为虐,远赴东南亚等地编写赌博网站的行为也很反感,更有甚者,使用python进行黑客行为,非法爬虫,真正实现了“C++从入门到入土”,“python从入门到入狱”.今年,已经有法规规定杜绝上架一切德州扑克游戏,本人最近想看看C++语法,就写个小程序练练手,只有简单的人机功能,参考了《轻松学会C++》部分代码,但核心部分全是本人创作,代码只供交流学习用,严禁一切非法用途。其他代码和程序在本人博客的资源里,和以前一样,有一些不影响大局的小bug,比如全局变量和局部变量等等,本人无意修复。
eval.cpp

#include
using 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

#include 
using 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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302645.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号