C语言 计算24是流行的扑克游戏。 方法,思路也行。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 计算24是流行的扑克游戏。 方法,思路也行。相关的知识,希望对你有一定的参考价值。
其方法是:任意取出4张牌,A J Q K 算1(不含大小王牌),其它牌按点数计算,花色不计。为了表示方便,10记做:X。
程序设计的目标是通过加、减、乘、除和括号最终算出24。设计一个程序,输入4个字符(1~9,A,J,Q,K,X),中间以空格分隔。则要求程序列出所有可能计算结果为24的方案。输出的具体要求如下:
每个方占案一行。
各行中均不能包含空格或制表符等格式控制。
方案不能重复(加法乘法交换律等算同一方案)。
如多个方案逻辑重复,则选择输出其中字典序最小的那个方案。
行间顺序可以任意。
所有非数字字符大写。
算式中不能含有不必要的括号,例如:((X*2)+4)*K,应改为:(4+2*X)*K
10用X代替。
乘法用符号“*”表示,除法用符号“/”表示。
J,Q,K,A算不同的元素,运算不视为重复,如:3*8*K/J 与 3*8*J/K 不同。
注意:
计算中局部可以为分数,结果为整数24即可。
不允许把减号作为负号使用。即不可以:-A+5*5*
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
double a[4]; //操作数
string s[4]; //四个数
void DFS(int step)
if (!step)
if (fabs(a[0]-24) < 1E-5)
cout<<s[0]<<'\n';
for (int i=0;i<=step;++i)
for (int j=i;++j<=step;)
double p=a[i],q=a[j];
string tp=s[i],tq=s[j];
a[j]=a[step];s[j]=s[step];
a[i]=p+q;s[i]='('+tp+'+'+tq+')';DFS(step-1);
a[i]=p-q;s[i]='('+tp+'-'+tq+')';DFS(step-1);
a[i]=q-p;s[i]='('+tq+'-'+tp+')';DFS(step-1);
a[i]=p*q;s[i]='('+tp+'*'+tq+')';DFS(step-1);
if (fabs(q)>=1E-5)
a[i]=p/q;s[i]='('+tp+'/'+tq+')';DFS(step-1);
if (fabs(p) >= 1E-5)
a[i]=q/p;s[i]='('+tq+'/'+tp+')';DFS(step-1);
a[i]=p;a[j]=q;
s[i]=tp;s[j]=tq;
int main()
char str[2];
cin>>s[0]>>s[1]>>s[2]>>s[3];
a[0]=atof(s[0].c_str());
a[1]=atof(s[1].c_str());
a[2]=atof(s[2].c_str());
a[3]=atof(s[3].c_str());
DFS(3);
经测试可以运行。 参考技术B 这个程序可不短,不是在这里就能完成的,你想要留个信箱,我发给你,里边还有一个计算器功能,能计算括号。追问
631078610@qq.com 谢谢
追答已经发过出了,注意查收,不好意思,这几天没有看到你的留言,以为你不要了呢,希望没有耽误你使用。我的I游戏只有13张牌,有兴趣,你可以自己加。你注意看debug版本吧,release版本里没有次方的作用,计算的功能用的也不是类,而是以前在别的地方编的函数。现在为了方便使用,我已经把这些函数做成了类。所有的源代码都发过去了,你慢慢看吧。我用的是C++,编的,当然如果你想用C语言,稍微修一下就行,把类改成普通函数很容易。如果你不会,可以再联系
本回答被提问者采纳如何以编程方式计算扑克赔率?
【中文标题】如何以编程方式计算扑克赔率?【英文标题】:How do I programmatically calculate Poker Odds? 【发布时间】:2010-09-16 16:09:39 【问题描述】:我正在尝试编写一个简单的游戏/实用程序来计算扑克赔率。我知道有很多 resources 谈论这样做的公式,但我想我在将其转换为代码时遇到了麻烦。特别是,我对德州扑克很感兴趣......
我知道有几种不同的方法,一种是您可以根据您看到的牌来计算您抽到手牌的几率。另一种方法是计算你赢得某手牌的几率。第二种方法似乎要复杂得多,因为您必须输入更多数据(有多少玩家等)
我不是要求你为我写它,但在正确的方向上进行一些轻推会有所帮助:-)
【问题讨论】:
一旦你得到它,你会加入计算底池赔率,因此它归结为跟注/弃牌情况的二元决定吗? 不是一个答案,让它成为评论/推动 - 可以在此处找到 Objective-C(主要是 C)和 Java 中的开源评估器:specialk-coding.blogspot.com/2010/04/…(文章末尾的链接到谷歌项目)。 【参考方案1】:这里有一些文章链接,可以作为起点:Poker Logic in C# 和 Fast, Texas Holdem Hand Evaluation and Analysis
“这段代码 sn-p 将让您使用 C# 和 .NET 以困难的方式计算扑克概率。”
这个Wikipedia article about Poker Probabilities 和这个优秀的statistical tutorial 给出了理论基础。
使用 Objective-C、Java、C/C++ 或 Python 编写的完整项目示例可在 SpecialKEval 找到。进一步的链接和阅读可以在其中找到。
【讨论】:
【参考方案2】:蒙特卡洛模拟是计算扑克牌赔率的常用方法。网络上实现这种模拟德州扑克的例子很多。
http://www.codeproject.com/KB/game/MoreTexasHoldemAnalysis1.aspx
【讨论】:
我已经构建了一个手牌评估器和扑克模拟器,并且我也使用了 montecarlo 进行模拟。我没有尝试用数学方法计算每种不同底牌组合的获胜几率,但我想这将是一项非常困难的任务。【参考方案3】:看看pokersource 如果你有相当强的 C 能力。恐怕这并不简单,但是您正在寻找的某些东西很复杂。如果输入格式正确(也不容易),使用该库的 poker-eval 程序可能会做很多你想做的事情。 this one 或 this 等网站也使用此库 AFAIK。
不过,情况可能更糟,您可能想要计算一些棘手的东西,例如 Omaha Hi-lo...
【讨论】:
【参考方案4】:Pokersource 和统计文章是不错的建议。但这确实最好通过蒙特卡洛模拟来完成,这是一种解决此类难题的有用、简单且强大的方法。
Omaha Hi-lo 和德州扑克一样好用
【讨论】:
【参考方案5】:德州扑克游戏评估器的完整源代码可在此处找到:
http://www.advancedmcode.org/poker-predictor.html
它是为 matlab 构建的,GUI id m 编码但计算引擎是 c++。
它允许计算赔率和概率。在我的 2.4Ghz 笔记本电脑上,它可以在 0.3 秒内处理 100000 个 10 名玩家的游戏计算。
精确的实时计算机:-)
【讨论】:
这相当快,但不是那么快 - 公共领域中有评估员可以给出准确的答案(即没有抽样),至少快 10 倍。【参考方案6】:也请看这里:
http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html
蒙特卡洛模拟通常比好的精确评估器慢。
【讨论】:
以上是关于C语言 计算24是流行的扑克游戏。 方法,思路也行。的主要内容,如果未能解决你的问题,请参考以下文章