على هذه الصفحة
برمجة كود فيديو بوكر - الجزء الثاني
مقدمة
هذا الفيديو هو الثاني من سلسلة من ثلاثة أجزاء حول برمجة فيديو بوكر. في الجزء الأول، قمتُ ببناء المحرك الأساسي، والذي يبدو أنه يستغرق 13.7 ساعة تشغيل. في هذا الفيديو، أضفتُ اختصارات لتقليص وقت التشغيل إلى حوالي 42 دقيقة.
فيما يلي الكود الذي تم تطويره في الفيديو.
#تضمين <iostream>
#تضمين <time.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);
رسم باطل (int c1، int c2، int c3، int c4، int c5، int الوزن)؛
int score(بطاقة الصفقة[]);
int score_array[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, 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، 473، 7095، 7095، 163185، 7095، 163185، 163185، 7669695 }؛
__int64 tot_combinations[52]؛
int tot_weight = 0؛
ثابت char* اسم اليد_المصفوفة[] = {
"خسارة"، "جاك أو أفضل"، "زوجان"، "ثلاثة من نفس النوع"، "ستريت"، "فلاش"، "فول هاوس"، "أربعة من نفس النوع"، "ستريت فلش"، "رويال فلش"، "المجموع"
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، count، score_deal_array[52]، sc؛
توزيع البطاقات[5]؛
لـ (i = 0؛ i <= 51؛ i++)
{
مجموعة الأوراق[i].r = (int)(i / 4)؛
سطح السفينة[i].س = i % 4؛
score_deal_array[i] = 0؛
tot_combinations[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 << اسم_اليد_المصفوفة[i] << "\t" << النتيجة_الصفقة_[i] << "\n";
}
صفقة باطلة
{
/* int i، c1، c2، c3، c4، c5؛
int count = 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);
}
}
}
// ثلاثة من نفس النوع
بالنسبة إلى (r1 = 0؛ r1 <= 12؛ r1++) // ثلاثة من نفس النوع
{
بالنسبة إلى (r2 = 0؛ r2 <= 11؛ r2++) // أول مفرد
{
بالنسبة إلى (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);
}
}
}
}
// زوجان
بالنسبة إلى (r1 = 0؛ r1 <= 12؛ r1++) // مفرد
{
بالنسبة إلى (r2 = 0؛ r2 <= 11؛ r2++) // الزوج 1
{
بالنسبة إلى (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);
}
}
}
}
// زوج واحد
بالنسبة إلى (r1 = 0؛ r1 <= 12؛ r1++) // زوج
{
std::cerr << "زوج واحد\t" << r1 << "\n";
بالنسبة إلى (r2 = 0؛ r2 <= 10؛ r2++) // مفرد 1
{
بالنسبة إلى (r3 = r2 + 1؛ r3 <= 11؛ r3++) // مفرد 2
{
من أجل (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", اسم_اليد_المصفوفة[i]، مصفوفة_الفوز[i]، مجموع_التركيبات[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 = Rank3 * 4 + Suit3;
c4 = الرتبة 4 * 4 + البدلة 4؛
c5 = الرتبة 5 * 4 + البدلة 5؛
إجمالي الوزن += الوزن؛
ارسم(c1، c2، c3، c4، c5، الوزن)؛
}
رسم باطل (int c1، int c2، int c3، int c4، int c5، int الوزن)
{
int i، j، d1، d2، d3، d4، d5، index، sc، draw_score_array[32][10]؛
int count = 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 = score_array[العدد]؛
المؤشر = 0؛
إذا ((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؛
رسم_مصفوفة_النقاط[الفهرس][sc]++;
العد++؛
}
}
}
}
}
ضعف الطاقة؛
ضعف الحد الأقصى للتغير = 0؛
int best_play = 0؛
لـ (i = 0؛ i <= 31؛ i++)
{
القيمة = 0.0؛
لـ (j = 0؛ j <= 9؛ j++)
ev += draw_score_array[i][j] * win_array[j]؛
ev /= draw_combinations_array[i];
إذا (ev > max_ev)
{
الحد الأقصى للقيمة = القيمة؛
أفضل_لعب = i؛
}
}
لـ (j = 0؛ j <= 9؛ j++)
{
tot_combinations[j] += weight*draw_score_array[best_play][j] * weighting_array[best_play];
}
}
int score(بطاقة الصفقة[])
{
مستقيم، مسطح؛
إذا ((deal[0].s == deal[1].s) && (deal[0].s == deal[2].s) && (deal[0].s == deal[3].s) && (deal[0].s == deal[4].s))
تدفق = 1؛
آخر
تدفق = 0؛
إذا ((deal[0].r != deal[1].r) && (deal[1].r != deal[2].r) && (deal[2].r != deal[3].r) && (deal[3].r != deal[4].r))
{
إذا ((deal[0].r + 4) == deal[4].r)
مستقيم = 1؛
وإلا إذا ((deal[4].r == 12) && (deal[3].r == 3)) // عجلة
مستقيم = 1؛
آخر
مستقيم = 0؛
}
آخر
مستقيم = 0؛
إذا ((مستقيم == 1) و(مسح == 1))
{
إذا (deal[0].r == 8)
العودة 9؛
آخر
العودة 8؛
}
وإلا إذا (المسح == 1)
العودة 5؛
وإلا إذا (مستقيم == 1)
العودة 4؛
وإلا إذا ((deal[0].r == deal[3].r) || (deal[1].r == deal[4].r))
العودة 7؛
وإلا إذا ((deal[0].r == deal[2].r) && (deal[3].r == deal[4].r))
العودة 6؛
وإلا إذا ((deal[0].r == deal[1].r) && (deal[2].r == deal[4].r))
العودة 6؛
وإلا إذا ((deal[0].r == deal[2].r) || (deal[1].r == deal[3].r) || (deal[2].r == deal[4].r))
العودة 3؛
وإلا إذا ((deal[0].r == deal[1].r) && (deal[2].r == deal[3].r))
العودة 2؛
وإلا إذا ((deal[0].r == deal[1].r) && (deal[3].r == deal[4].r))
العودة 2؛
وإلا إذا ((deal[1].r == deal[2].r) && (deal[3].r == deal[4].r))
العودة 2؛
وإلا إذا ((deal[0].r == deal[1].r) && (deal[0].r >= 9))
العودة 1؛
وإلا إذا ((deal[1].r == deal[2].r) && (deal[1].r >= 9))
العودة 1؛
وإلا إذا ((deal[2].r == deal[3].r) && (deal[2].r >= 9))
العودة 1؛
وإلا إذا ((deal[3].r == deal[4].r) && (deal[3].r >= 9))
العودة 1؛
آخر
العودة 0؛
}