C++实现德州扑克游戏(和电脑一起玩)_c++麻州扑克-程序员宅基地

技术标签: c++  游戏  

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

#include<string>
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 <string>
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 <string>
#include <cstdlib>
#include <ctime>
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);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/returnadsss/article/details/120634984

智能推荐

c# 调用非托管代码_c# 声明kernel32 函数-程序员宅基地

文章浏览阅读956次,点赞3次,收藏5次。编程过程中,一般c#调用非托管的代码有两种方式:1.直接调用从DLL中导出的函数。2.调用COM对象上的接口方法。首先说明第1种方式,基本步骤如下:1.使用关键字static,extern声明需要导出的函数。2.把DllImport 属性附加到函数上。3.掌握常用的数据类型传递的对应关系。4.如果需要,为函数的参数和返回值指定自定义数据封送处理信息,这将重写.net framework默认的封送处理。简单举例如下:托管函数原型:DWORD GetShortPathName(LPCTST_c# 声明kernel32 函数

高频交易及化资策与区_hudson river trading-程序员宅基地

文章浏览阅读406次。转 高频交易及量化投资的策略与误区一、高频交易公司和量化投资公司的区别一般来说,高频交易公司和量化投资公司既有联系,又有区别。在美国,人们常说的高频交易公司一般都是自营交易公司,这些公司主要有Getco、Tower Research、Hudson River Trading、SIG、Virtu Financial、Jump Trading、RGM Advisor、Chopper Tradi..._hudson river trading

C语言文件操作相关的函数_c语言与文件处理有关的函数-程序员宅基地

文章浏览阅读865次。文件的打开和关闭文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件 的关系。ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。FILE * fopen ( const char * filename, const char * mode ); int fcl..._c语言与文件处理有关的函数

java 无法读取文件_java 读取文件,无法显示文件内容,如何解决? 谢谢。-程序员宅基地

文章浏览阅读1.1k次。从来没见过进行文件读取写入时,在写入中需要随机数的,你读取文件就是从一个地方获取输入流,然后将这个输入流写到别的地方,根本不要随机数。给你一个示例://copyafiletoanotherfilebyusingFileReader/FileWriterimportjava.io.*;publicclassTFileRead{publicstaticvoidmain(S..._java复制文件文件没有内容显示

vue引入原生高德地图_前端引入原生地图-程序员宅基地

文章浏览阅读556次,点赞2次,收藏3次。由于工作上的需要,今天捣鼓了半天高德地图。如果定制化开发需求不太高的话,可以用vue-amap,这个我就不多说了,详细就看官网 https://elemefe.github.io/vue-amap/#/zh-cn/introduction/install然而我们公司需要英文版的高德,我看vue-amap中好像没有这方面的配置,而且还有一些其他的定制化开发需求,然后就只用原生的高德。其实原生的引入也不复杂,但是有几个坑要填一下。1. index.html注意,引入的高德js一定要放在头部而_前端引入原生地图

ViewGroup重写大法 (一)-程序员宅基地

文章浏览阅读104次。本文介绍ViewGroup重写,我们所熟知的LinearLayout,RelativeLayout,FrameLayout等等,所有的容器类都是ViewGroup的子类,ViewGroup又继承View。我们在熟练应用这些现成的系统布局的时候可能有时候就不能满足我们自己的需求了,这是我们就要自己重写一个容器来实现效果。ViewGroup重写可以达到各种效果,下面写一个简单的重写一个Vi..._viewgroup 重写

随便推点

台式计算机有没有无线连接模块,台式机能不能连接wifi_台式机怎么连接wifi-程序员宅基地

文章浏览阅读1.2k次。2016-12-30 09:54:26你好!很高兴为你解答,先将无线路由器接通电源,然后插上网线,将另一端插到你电脑上,等网络通了之后,你在IE浏览器上输入:192.168.1.1(这是一般无线路由器的IP,如果有特殊...2016-12-16 11:44:30手机系统问题,可能系统出现了问题,导致连接上了WiFi却无法上网。重启一下路由器试试,或者将路由器恢复一下出厂设置,然后重新拨号上网,并根..._计算机无线模块怎么看

OpenGLES编程思想-程序员宅基地

文章浏览阅读4.8k次。最近在看gles的reference,想多了解一下gles的底层,gles是opengl在khronos在嵌入式设备上的图形硬件的软件访问接口,很多东西和opengl似曾相似,但是和opengl又有很大的不同,最新的标准是gles3.2,标准文档非常长,如果不是写引擎没必要对每个接口烂熟于心,但是为了能够了解他,我对他的编程思想做个总结,最重要的是理解gles的设计思路,然后在使用的时候也必将容易找到相关接口。所以本文基本不会列出gles的每个接口,不会记录讲解每个接口,而是希望能够通过总结gles的设计思_gles

linux命令行去掉滴滴声_linux一直叮叮叮-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏2次。在CentOS中,我们常用Tab键进行命令补全,但是系统总是提示滴滴声,让人很烦躁。 即使把音频设备关掉,或者虚拟机的音频设备也关掉,还是有这个声音。 如果不喜欢这个声音,可以通过修改配置去掉它。用vi 编辑 /etc/inputrc 文件,在vi的命令模式下,用键盘方向键进行定位, 找到“#set bell-style none”,用X 删除语句前方的#号,就可以了。“: wq_linux一直叮叮叮

Java从零开始 第10.5讲 面向对象的习题课_编写一个测试类booktest,创建几个book对象,并打印它们的字符串表示,同时判断-程序员宅基地

文章浏览阅读197次。面向对象的习题课类的定义员工类Employee求和类Sum类与对象书籍类BookBook类的测试类BookTest异常能扩容的MyList类剪刀石头布转载请注明出处在这一讲中我会给出一些关于面向对象部分的习题,同样希望在不看答案的情况下自己编写,即使看过了答案,也要能够在不看答案的情况下写出来。类的定义员工类Employee定义在同一个公司工作的Employee类,要求其中含有属性:员工的名字,员工的年龄,员工的爱好,员工的公司名(注意当公司更名时,所有员工的公司名都需要更名),工作地点默认为中国(_编写一个测试类booktest,创建几个book对象,并打印它们的字符串表示,同时判断

Spark伪分布安装(依赖Hadoop)_下载spark的hadoop依赖-程序员宅基地

文章浏览阅读6.7k次,点赞7次,收藏14次。一、伪分布安装Spark安装环境:Ubuntu 14.04 LTS 64位+Hadoop2.7.2+Spark2.0.0+jdk1.7.0_761、安装jdk1.7(1)下载jdk-7u76-linux-x64.tar.gz;(2)解压jdk-7u76-linux-x64.tar.gz,并将其移动到/opt/java/jdk路径下(自建);命令:tar -zxvf jdk-_下载spark的hadoop依赖

TCP/IP 是用于因特网 (Internet) 的通信协议_广泛应用在internet中的tcp/ip的网络管理主要使用的是 ____协议。 (填空题)-程序员宅基地

文章浏览阅读6.7k次。计算机通信协议计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述。什么是 TCP/IP?TCP/IP 是供已连接因特网的计算机进行通信的通信协议。TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准..._广泛应用在internet中的tcp/ip的网络管理主要使用的是 ____协议。 (填空题)