在这一页
编写视频扑克代码——第 2 部分
简介
本视频是视频扑克编程系列三部曲的第二部。在第一部中,我构建了基础引擎,运行时间预计为 13.7 小时。在本视频中,我添加了一些快捷方式,将运行时间缩短至 42 分钟左右。
以下是视频中开发的代码。
#include <iostream>
#包括<时间.h>
结构卡
{
int r;
int s;
};
无效设置(无效);
无效交易(无效);
void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int suit1, int suit2, int suit3, int suit4, int suit5, int weight);
void draw(int c1, int c2, int c3, int c4, int c5, int weight);
int 分数(发牌[]);
int 分数数组[2598960];
卡片组[52];
int draw_combinations_array[] = { 1533939, 178365, 178365, 16215, 178365, 16215, 16215, 1081, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 16215, 1081, 1081, 47, 1081, 47, 47, 1 };
int weighting_array[] = { 5, 43, 43, 473, 43, 473, 473, 7095, 43, 473, 473, 7095, 473, 7095, 7095, 163185, 43, 473, 473, 7095, 473, 7095, 7095, 163185, 473, 7095, 7095, 163185, 7095, 163185, 163185, 7669695 };
__int64 tot_combinations[52];
int 总重量 = 0;
const char* hand_name_array[] = {
"输","J 或更好","两对","三条","顺子","同花","葫芦","四条","同花顺","皇家同花顺","总数" };
int win_array[] = { 0,1,2,3,4,6,9,25,50,800 };
int main()
{
time_t 开始时间,结束时间;
开始时间 = 时间(NULL);
设置();
交易();
结束时间 = 时间(NULL);
printf("总秒数=\t%i\n", (int)endtime - (int)begtime);
}
无效设置(无效)
{
int i,c1,c2,c3,c4,c5,计数,score_deal_array[52],sc;
发牌[5];
对于(i = 0;i <= 51;i++)
{
甲板[i].r = (int)(i / 4);
甲板[i]。s = i % 4;
得分交易数组[i] = 0;
总组合数[i] = 0;
}
计数=0;
对于(c1 = 0;c1 <= 47;c1++)
{
交易[0] = 甲板[c1];
对于(c2 = c1 + 1;c2 <= 48;c2++)
{
交易[1] = 甲板[c2];
对于(c3 = c2 + 1;c3 <= 49;c3++)
{
交易[2] = 甲板[c3];
对于(c4 = c3 + 1;c4 <= 50;c4++)
{
交易[3] = 甲板[c4];
对于(c5 = c4 + 1;c5 <= 51;c5 ++)
{
交易[4] = 牌组[c5];
sc = 分数(交易);
分数数组[计数] = sc;
得分交易数组[sc]++;
计数++;
}
}
}
}
}
// std::cerr << "count =\t" << count << "\n";
// 对于 (i = 0; i <= 9; i++)
// std::cerr << hand_name_array[i] << "\t" << score_deal_array[i] << "\n";
}
无效交易(无效)
{
/* int i,c1,c2,c3,c4,c5;
int 计数 = 0;
对于(c1 = 0;c1 <= 47;c1++)
{
对于(c2 = c1 + 1;c2 <= 48;c2++)
{
对于(c3 = c2 + 1;c3 <= 49;c3++)
{
对于(c4 = c3 + 1;c4 <= 50;c4++)
{
对于(c5 = c4 + 1;c5 <= 51;c5 ++)
{
绘制(c1,c2,c3,c4,c5);
计数++;
如果((计数%1000)==0)
std::cerr << count << "\n";
}
}
}
}
} */
int i,r1,r2,r3,r4,r5;
// 四条
对于(r1 = 0;r1 <= 12;r1++)
{
对于(r2 = 0;r2 <= 12;r2++)
{
如果(r1!=r2)
{
预绘制(r1, r1, r1, r1, r2, 0, 1, 2, 3, 0, 4);
}
}
}
// 客满
对于(r1 = 0;r1 <= 12;r1++)
{
对于(r2 = 0;r2 <= 12;r2++)
{
如果(r1!= r2)
{
预绘制(r1, r1, r1, r2, r2, 0, 1, 2, 0, 1, 12);
预绘制(r1, r1, r1, r2, r2, 0, 1, 2, 0, 3, 12);
}
}
}
// 三张相同的牌
for (r1 = 0; r1 <= 12; r1++) // 三张相同的牌
{
for (r2 = 0; r2 <= 11; r2++) // 第一个单例
{
for (r3 = r2 + 1; r3 <= 12; r3++) // 第二个单例
{
如果((r1!= r2)&&(r1!= r3))
{
预绘制(r1, r1, r1, r2, r3, 0, 1, 2, 0, 0, 12);
预绘制(r1, r1, r1, r2, r3, 0, 1, 2, 3, 3, 4);
预绘制(r1, r1, r1, r2, r3, 0, 1, 2, 0, 1, 24);
预绘制(r1, r1, r1, r2, r3, 0, 1, 2, 0, 3, 12);
预绘制(r1, r1, r1, r2, r3, 0, 1, 2, 3, 0, 12);
}
}
}
}
// 两对
for (r1 = 0; r1 <= 12; r1++) // 单例
{
for (r2 = 0; r2 <= 11; r2++) // 对 1
{
for (r3 = r2 + 1; r3 <= 12; r3++) // 对 2
{
如果((r1!= r2)&&(r1!= r3))
{
预绘制(r1, r2, r2, r3, r3, 0, 0, 1, 0, 1, 12);
预绘制(r1, r2, r2, r3, r3, 2, 0, 1, 0, 1, 12);
预绘制(r1, r2, r2, r3, r3, 0, 0, 1, 2, 3, 12);
预绘制(r1, r2, r2, r3, r3, 2, 0, 1, 2, 3, 12);
预绘制(r1, r2, r2, r3, r3, 0, 0, 1, 0, 2, 24);
预绘制(r1, r2, r2, r3, r3, 1, 0, 1, 0, 2, 24);
预绘制(r1, r2, r2, r3, r3, 2, 0, 1, 0, 2, 24);
预绘制(r1, r2, r2, r3, r3, 3, 0, 1, 0, 2, 24);
}
}
}
}
// 一对
for (r1 = 0; r1 <= 12; r1++) // 对
{
std::cerr << "一对\t" << r1 << "\n";
for (r2 = 0; r2 <= 10; r2++) // 单例 1
{
for (r3 = r2 + 1; r3 <= 11; r3++)// 单例 2
{
for (r4 = r3 + 1; r4 <= 12; r4++) // 单例 3
{
如果 ((r1 != r2) && (r1 != r3) && (r1 != r4))
{
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 0, 0, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 2, 2, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 0, 1, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 1, 0, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 1, 0, 0, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 2, 3, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 3, 2, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 3, 2, 2, 12);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 0, 2, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 2, 0, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 0, 0, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 2, 2, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 0, 2, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 2, 0, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 1, 2, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 2, 1, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 0, 1, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 0, 2, 3, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 0, 3, 24);
预绘制(r1, r1, r2, r3, r4, 0, 1, 2, 3, 0, 24);
}
}
}
}
}
// 五个单例
对于(r1 = 0;r1 <= 8;r1++)
{
std::cerr << "五个单例\t" << r1 << "\n";
对于(r2 = r1 + 1;r2 <= 9;r2 ++)
{
对于 (r3 = r2 + 1; r3 <= 10; r3++)
{
对于(r4 = r3 + 1;r4 <= 11;r4++)
{
对于(r5 = r4 + 1;r5 <= 12;r5 ++)
{
预绘制(r1, r2, r3, r4, r5, 0, 0, 0, 0, 0, 4);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 0, 1, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 0, 0, 1, 12);
预绘制(r1, r2、r3、r4、r5、0、0、0、1、1、12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 0, 1, 12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 1, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 0, 1, 12);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 1, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 1, 1, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 0, 1, 12);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 1, 0, 12);
预绘制(r1, r2, r3, r4, r5, 1, 0, 1, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 1, 1, 0, 0, 0, 12);
预绘制(r1, r2, r3, r4, r5, 0, 0, 0, 1, 2, 24);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 0, 2, 24);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 2, 0, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 0, 2, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 2, 0, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 2, 0, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 0, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 2, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 2, 0, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 0, 0, 0, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 1, 2, 2, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 2, 1, 2, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 2, 2, 1, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 1, 2, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 2, 1, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 2, 2, 1, 24);
预绘制(r1, r2, r3, r4, r5, 1, 1, 0, 2, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 0, 1, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 0, 2, 1, 24);
预绘制(r1, r2, r3, r4, r5, 1, 1, 2, 0, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 1, 0, 2, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 2, 0, 1, 24);
预绘制(r1, r2, r3, r4, r5, 1, 1, 2, 2, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 1, 2, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 2, 1, 0, 24);
预绘制(r1, r2, r3, r4, r5, 0, 0, 1, 2, 3, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 0, 2, 3, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 2, 0, 3, 24);
预绘制(r1, r2, r3, r4, r5, 0, 1, 2, 3, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 0, 2, 3, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 2, 0, 3, 24);
预绘制(r1, r2, r3, r4, r5, 1, 0, 2, 3, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 0, 0, 3, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 0, 3, 0, 24);
预绘制(r1, r2, r3, r4, r5, 1, 2, 3, 0, 0, 24);
}
}
}
}
}
printf("总重量=\t%i\n", tot_weight);
对于(i = 9;i >= 0;i--)
printf("%s\t%i\t%I64i\n", hand_name_array[i], win_array[i], tot_combinations[i]);
}
void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int suit1, int suit2, int suit3, int suit4, int suit5, int weight)
{
int c1,c2,c3,c4,c5;
c1 = 等级1 * 4 + 花色1;
c2 = 等级2 * 4 + 花色2;
c3 = 等级3 * 4 + 套装3;
c4 = 等级4 * 4 + 花色4;
c5 = 等级5 * 4 + 花色5;
总重量 += 重量;
绘制(c1,c2,c3,c4,c5,重量);
}
void draw(int c1, int c2, int c3, int c4, int c5, int weight)
{
int i,j,d1,d2,d3,d4,d5,索引,sc,draw_score_array[32][10];
int 计数 = 0;
对于(i = 0;i <= 31;i++)
{
对于(j = 0;j <= 9;j++)
draw_score_array[i][j] = 0;
}
对于(d1 = 0;d1 <= 47;d1++)
{
对于(d2 = d1 + 1;d2 <= 48;d2++)
{
对于 (d3 = d2 + 1; d3 <= 49; d3++)
{
对于(d4 = d3 + 1;d4 <= 50;d4++)
{
对于(d5 = d4 + 1;d5 <= 51;d5++)
{
sc = 分数数组[计数];
索引=0;
if ((d1 == c1) || (d2 == c1) || (d3 == c1) || (d4 == c1) || (d5 == c1))
索引 += 16;
如果((d1 == c2)||(d2 == c2)||(d3 == c2)||(d4 == c2)||(d5 == c2))
索引+=8;
如果((d1 == c3)||(d2 == c3)||(d3 == c3)||(d4 == c3)||(d5 == c3))
索引+=4;
如果((d1 == c4)||(d2 == c4)||(d3 == c4)||(d4 == c4)||(d5 == c4))
索引 += 2;
如果((d1 == c5)||(d2 == c5)||(d3 == c5)|| (d4 == c5)||(d5 == c5))
索引+=1;
draw_score_array[索引][sc]++;
计数++;
}
}
}
}
}
双倍 ev;
双倍max_ev = 0;
int best_play = 0;
对于(i = 0;i <= 31;i++)
{
ev = 0.0;
对于(j = 0;j <= 9;j++)
ev += draw_score_array[i][j] * win_array[j];
ev /= draw_combinations_array[i];
如果(ev>max_ev)
{
最大有效值 = 有效值;
最佳发挥=我;
}
}
对于(j = 0;j <= 9;j++)
{
tot_combinations[j] += weight*draw_score_array[best_play][j] * weighting_array[best_play];
}
}
int 分数(发牌[])
{
int 顺子,同花;
如果((交易[0].s == 交易[1].s)&&(交易[0].s == 交易[2].s)&&(交易[0].s == 交易[3].s)&&(交易[0].s == 交易[4].s))
冲洗=1;
别的
冲洗=0;
如果((交易[0].r!=交易[1].r)&&(交易[1].r!=交易[2].r)&&(交易[2].r!=交易[3].r)&&(交易[3].r!=交易[4].r))
{
如果((交易[0].r + 4)==交易[4].r)
直=1;
else if ((deal[4].r == 12) && (deal[3].r == 3)) // 轮子
直=1;
别的
直=0;
}
别的
直=0;
if ((顺子 == 1) && (同花 == 1))
{
如果(交易[0].r == 8)
返回 9;
别的
返回 8;
}
否则,如果(刷新==1)
返回 5;
否则,如果(直==1)
返回 4;
否则,如果((交易[0].r == 交易[3].r)||(交易[1].r == 交易[4].r))
返回 7;
否则,如果((交易[0].r == 交易[2].r)&&(交易[3].r == 交易[4].r))
返回 6;
否则,如果((交易[0].r == 交易[1].r)&&(交易[2].r == 交易[4].r))
返回 6;
否则,如果((交易[0].r == 交易[2].r)||(交易[1].r == 交易[3].r)||(交易[2].r == 交易[4].r))
返回 3;
否则,如果((交易[0].r == 交易[1].r)&&(交易[2].r == 交易[3].r))
返回 2;
否则,如果((交易[0].r == 交易[1].r)&&(交易[3].r == 交易[4].r))
返回 2;
否则,如果((交易[1].r == 交易[2].r)&&(交易[3].r == 交易[4].r))
返回 2;
否则,如果((交易[0].r == 交易[1].r)&&(交易[0].r >= 9))
返回 1;
否则,如果((交易[1].r == 交易[2].r)&&(交易[1].r >= 9))
返回 1;
否则,如果((交易[2].r == 交易[3].r)&&(交易[2].r >= 9))
返回 1;
否则,如果((交易[3].r == 交易[4].r)&&(交易[3].r >= 9))
返回 1;
别的
返回 0;
}