على هذه الصفحة
منهجيتي لتحليل لعبة الفيديو بوكر
أحد الأسئلة التي تُطرح عليّ بين الحين والآخر هو كيف أجعل برنامج فيديو بوكر الخاص بي يُقيّم جدول الدفع في أقل من دقيقة. ستحاول هذه الصفحة الإجابة على هذا السؤال.
استخدم برنامجي الأصلي أسلوب القوة الغاشمة لتكرار جميع أوراق البداية البالغ عددها 2,598,960 ورقة، ثم لعب جميع الطرق الـ 32 الممكنة للتخلص من الأوراق، بما في ذلك تكرار جميع أوراق الاستبدال البالغ عددها 1,533,939 ورقة عند التخلص من الأوراق الخمس. كان ذلك حوالي عام 1998. على جهاز الكمبيوتر الخاص بي آنذاك، توقعتُ أن الأمر سيستغرق أكثر من عام لإكماله. أما اليوم، فسيستغرق برنامج كهذا شهرًا تقريبًا. مع ذلك، باستخدام اختصارين، يمكنك تقليص الوقت من شهر تقريبًا إلى ثلاث ثوانٍ تقريبًا. إليك كيفية القيام بذلك.
لاختصار وقت اللعب إلى بضعة أيام، يمكنك تجنب تحليل الأيدي المتشابهة في التوزيع. على سبيل المثال، إذا كانت اليد المبدئية أربعة آسات وملك، فلن يُحدث أي فرق في نوع الملك. سيوفر عليك تحديد نوع عشوائي للملك وضرب النتيجة في أربعة بعض الوقت. وباستخدام نفس المنطق، يمكن تقليل عدد أنواع الأيدي المبدئية المختلفة من 2,598,960 إلى 134,459. توضح الجداول التالية طرق ترتيب الأنواع، والأوزان المرتبطة بها، لكل فئة من الأيدي حسب الرتبة.
خمسة سينجلتوناستخدم حلقة التكرار لاختيار 5 رتب مختلفة من أصل 13. لكل مجموعة رتب، اضبط الأصناف (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، يُعيّن الصف الأول كل رتبة مفردة بصنف 1. هناك أربع أصناف محتملة، لذا بدلًا من تكرارها أربع مرات، افعلها مرة واحدة واضرب النتائج في الأوزان 4.
خمس رتب فريدة
| غناء. 1 | غناء 2 | غناء 3 | غناء. 4 | يغني.5 | الوزن|
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 4 |
| 2 | 1 | 1 | 1 | 1 | 12 |
| 1 | 2 | 1 | 1 | 1 | 12 |
| 1 | 1 | 2 | 1 | 1 | 12 |
| 1 | 1 | 1 | 2 | 1 | 12 |
| 1 | 1 | 1 | 1 | 2 | 12 |
| 2 | 2 | 1 | 1 | 1 | 12 |
| 2 | 1 | 2 | 1 | 1 | 12 |
| 2 | 1 | 1 | 2 | 1 | 12 |
| 2 | 1 | 1 | 1 | 2 | 12 |
| 1 | 2 | 2 | 1 | 1 | 12 |
| 1 | 2 | 1 | 2 | 1 | 12 |
| 1 | 2 | 1 | 1 | 2 | 12 |
| 1 | 1 | 2 | 2 | 1 | 12 |
| 1 | 1 | 2 | 1 | 2 | 12 |
| 1 | 1 | 1 | 2 | 2 | 12 |
| 2 | 3 | 1 | 1 | 1 | 24 |
| 2 | 1 | 3 | 1 | 1 | 24 |
| 2 | 1 | 1 | 3 | 1 | 24 |
| 2 | 1 | 1 | 1 | 3 | 24 |
| 1 | 2 | 3 | 1 | 1 | 24 |
| 1 | 2 | 1 | 3 | 1 | 24 |
| 1 | 2 | 1 | 1 | 3 | 24 |
| 1 | 1 | 2 | 3 | 1 | 24 |
| 1 | 1 | 2 | 1 | 3 | 24 |
| 1 | 1 | 1 | 2 | 3 | 24 |
| 1 | 1 | 2 | 2 | 3 | 24 |
| 1 | 2 | 1 | 2 | 3 | 24 |
| 1 | 2 | 2 | 1 | 3 | 24 |
| 1 | 1 | 2 | 3 | 2 | 24 |
| 1 | 2 | 1 | 3 | 2 | 24 |
| 1 | 2 | 2 | 3 | 1 | 24 |
| 1 | 1 | 3 | 2 | 2 | 24 |
| 1 | 2 | 3 | 1 | 2 | 24 |
| 1 | 2 | 3 | 2 | 1 | 24 |
| 1 | 3 | 1 | 2 | 2 | 24 |
| 1 | 3 | 2 | 1 | 2 | 24 |
| 1 | 3 | 2 | 2 | 1 | 24 |
| 3 | 1 | 1 | 2 | 2 | 24 |
| 3 | 1 | 2 | 1 | 2 | 24 |
| 3 | 1 | 2 | 2 | 1 | 24 |
| 4 | 4 | 1 | 2 | 3 | 24 |
| 4 | 1 | 4 | 2 | 3 | 24 |
| 4 | 2 | 3 | 4 | 1 | 24 |
| 4 | 1 | 2 | 3 | 4 | 24 |
| 1 | 4 | 4 | 2 | 3 | 24 |
| 1 | 4 | 2 | 4 | 3 | 24 |
| 1 | 4 | 2 | 3 | 4 | 24 |
| 2 | 3 | 4 | 4 | 1 | 24 |
| 2 | 3 | 4 | 1 | 4 | 24 |
| 1 | 2 | 3 | 4 | 4 | 24 |
زوج
استخدم 13×combin(12,3)=2,860 طريقة ممكنة لاختيار رتبة للزوج، وثلاث رتب من أصل 12 متبقية للعناصر الفردية الثلاثة. لكل مجموعة من الرتب، اضبط الأصناف (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، الصف الأول يُعيّن أصناف الزوج إلى 1 و2، وجميع أصناف العناصر الفردية إلى 1. هناك 6 طرق لاختيار أصناف الزوج، وطريقتان لاختيار صنف للعناصر الفردية يساوي صنفًا واحدًا من أصناف الزوج، بوزن 6×2=12.
زوج
| الزوج 1 | الزوج 2 | غناء. 1 | غناء 2 | غناء 3 | وزن |
|---|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 1 | 12 |
| 1 | 2 | 1 | 1 | 2 | 12 |
| 1 | 2 | 1 | 2 | 1 | 12 |
| 1 | 2 | 2 | 1 | 1 | 12 |
| 1 | 2 | 1 | 1 | 3 | 24 |
| 1 | 2 | 1 | 3 | 1 | 24 |
| 1 | 2 | 3 | 1 | 1 | 24 |
| 1 | 2 | 1 | 3 | 3 | 24 |
| 1 | 2 | 3 | 1 | 3 | 24 |
| 1 | 2 | 3 | 3 | 1 | 24 |
| 1 | 2 | 3 | 3 | 3 | 12 |
| 1 | 2 | 1 | 2 | 3 | 24 |
| 1 | 2 | 1 | 3 | 2 | 24 |
| 1 | 2 | 3 | 1 | 2 | 24 |
| 1 | 2 | 3 | 4 | 4 | 12 |
| 1 | 2 | 4 | 3 | 4 | 12 |
| 1 | 2 | 4 | 4 | 3 | 12 |
| 1 | 2 | 1 | 3 | 4 | 24 |
| 1 | 2 | 3 | 1 | 4 | 24 |
| 1 | 2 | 3 | 4 | 1 | 24 |
زوجان
استخدم الدالة combin(13,2)×11=858 لاختيار رتبتين من أصل 13 للزوجين، ورتبة واحدة من أصل 11 متبقية للفرد. لكل مجموعة من الرتب، اضبط البدل (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، يُعيّن الصف الأول بدل الزوج الأول إلى 1 و2، وبدل الزوج الثاني إلى 3 و4، وبدلة الفرد إلى 1. هناك 6 طرق لاختيار البدل للزوج الأول. يحتوي الزوج الثاني على البدلتين الأخريين، لذا يوجد 1 واحد فقط لاختيارهما. يمكن أن يحتوي الفرد على أي بدلتين من الزوج الأول، لذا هناك احتمالان. وبالتالي، يكون الوزن في الصف الأول 6×1×2=12.
زوجان
| الزوج 1 البطاقة 1 | الزوج 1 البطاقة رقم 2 | الزوج 2 البطاقة 1 | الزوج 2 البطاقة رقم 2 | غناء. 1 | وزن |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 1 | 12 |
| 1 | 2 | 3 | 4 | 3 | 12 |
| 1 | 2 | 1 | 3 | 1 | 24 |
| 1 | 2 | 1 | 3 | 2 | 24 |
| 1 | 2 | 1 | 3 | 3 | 24 |
| 1 | 2 | 1 | 3 | 4 | 24 |
| 1 | 2 | 1 | 2 | 1 | 12 |
| 1 | 2 | 1 | 2 | 3 | 12 |
ثلاثة من نفس النوع
كرر جميع الطرق الممكنة 13×combin(12,2)=858 لاختيار رتبة واحدة من أصل 13 للثلاثي المتماثل و66 طريقة لاختيار اثنين من السينغتون من الرتب الـ 12 الأخرى. لكل مجموعة من الرتب، اضبط البذلات (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، يضبط الصف الأول بذلات الثلاثي المتماثل على 1 و2 و3، وبذلات الفرديتين تساوي بذلتين من البذلات الثلاث الممثلة في الثلاثي المتماثل. يوجد combin(4,3)=4 طرق لاختيار 3 من أصل 4 بذلات للثلاثي المتماثل، و3 طرق لاختيار بذلة من هذه البذلات الثلاث للفرد الأول، وطريقتان لاختيار بذلة للفرد الثاني. وبالتالي، يكون وزن الصف الأول 4×3×2=24.
ثلاثة من نفس النوع
| 3 أنواع البطاقة 1 | 3 أنواع البطاقة رقم 2 | 3 أنواع البطاقة رقم 3 | غناء. 1 | غناء 2 | وزن |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 1 | 2 | 24 |
| 1 | 2 | 3 | 1 | 4 | 12 |
| 1 | 2 | 3 | 4 | 1 | 12 |
| 1 | 2 | 3 | 1 | 1 | 12 |
| 1 | 2 | 3 | 4 | 4 | 4 |
منزل كامل
استخدم 13×12=156 طريقة ممكنة لاختيار رتبة واحدة من بين 13 للثلاثي المتماثل، و12 طريقة لاختيار رتبة للزوج. لكل مجموعة من الرتب، اضبط الألوان (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، في الصف الأول، ألوان الزوج هي 1 و2، وألوان الثلاثة المتماثلة هي 1 و2 و3. هناك 6 طرق لاختيار ألوان الزوج. في الثلاثي المتماثل، تستخدم الألوان الزوجية، بالإضافة إلى أحد اللونين الآخرين. وبالتالي، يكون وزن الصف الأول هو 6×2×2=12.
منزل كامل
| زوج البطاقة 1 | زوج البطاقة رقم 2 | 3 أنواع البطاقة 1 | 3 أنواع البطاقة رقم 2 | 3 أنواع البطاقة رقم 3 | وزن |
|---|---|---|---|---|---|
| 1 | 2 | 1 | 2 | 3 | 12 |
| 1 | 4 | 1 | 2 | 3 | 12 |
أربعة من نفس النوع
استخدم 13×12=156 طريقة ممكنة لاختيار رتبة واحدة من بين 13 للبطاقات الرباعية المتشابهة، و12 طريقة لاختيار رتبة للبطاقة المفردة. لكل مجموعة من الرتب، اضبط الأصناف (المرقمة من 1 إلى 4) والأوزان كما يلي. على سبيل المثال، في الصف الأول، رتب الأصناف الأربعة المتشابهة على 1، 2، 3، و4، ورتب الأصناف المفردة على 1. هناك طريقة واحدة فقط لاختيار 4 أصناف من بين 4 للبطاقات الثلاثية المتشابهة، و4 طرق لاختيار صنف من بين 4 للبطاقة المفردة. وبالتالي، يكون وزن الصف الأول هو 1×4×2=4.
أربعة من نفس النوع
| 4 نوع البطاقة 1 | 4 نوع البطاقة رقم 2 | 4 نوع البطاقة رقم 3 | 4 نوع البطاقة رقم 4 | غناء. 1 | وزن |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 1 | 4 |
ستُخفّض الخطوة السابقة وقت الحساب بنسبة 95%، لكنها ستستغرق عدة ساعات إذا كررت عملية التكرار عبر 1,533,939 تركيبة ممكنة من بطاقات الاستبدال. يكمن سرّ برنامج مدته ثلاث ثوانٍ في عدم تكرار عملية التكرار عند خطوة السحب. إليك كيفية القيام بذلك:
- قم بتهيئة المصفوفات التالية:
- المصفوفة 1: الحجم 2,598,960
- المصفوفة 2: الحجم 270,725 × 16
- المصفوفة 3: الحجم 22100 × 16
- المصفوفة 4: الحجم 1326 × 16
- المصفوفة 5: الحجم 52 × 16
- المصفوفة 6: الحجم 16
- كرر جميع التركيبات الـ ٢,٥٩٨,٩٦٠ لخمس بطاقات من أصل ٥٢. لا تستخدم اختصار اليد الـ ١٣٤,٤٥٩ في هذه المرحلة. لكل يد في التوزيع، اتبع ما يلي:
- قم بتقييمه حسب قيمته في البوكر.
- ضع النتيجة في المصفوفة ٠. ضع اليد الأولى في العنصر ٠ من المصفوفة، وزدها بمقدار ١ لكل يد.
- بالنسبة لكل طريقة من الطرق الخمس لاختيار 4 من 5 بطاقات في الصفقة، قم بترجمة البطاقات الأربع إلى رقم فهرس من 0 إلى 270,724 (سأشرح كيفية القيام بذلك لاحقًا)، وقم بزيادة عنصر [رقم الفهرس][نتيجة اليد] في array1 بمقدار 1.
- بالنسبة لكل طريقة من الطرق العشر لاختيار 3 من أصل 5 بطاقات في الصفقة، قم بترجمة البطاقات الثلاث إلى رقم فهرس من 0 إلى 22099، وقم بزيادة عنصر [رقم الفهرس][نتيجة اليد] في array2 بمقدار 1.
- بالنسبة لكل طريقة من الطرق العشر لاختيار 2 من 5 بطاقات في الصفقة، قم بترجمة البطاقتين إلى رقم فهرس من 0 إلى 1,325، وقم بزيادة عنصر [رقم الفهرس][نتيجة اليد] في المصفوفة 3 بمقدار 1.
- لكل طريقة من الطرق الخمس لاختيار بطاقة واحدة من بين 5 بطاقات في الصفقة، قم بترجمة البطاقة إلى رقم فهرس من 0 إلى 51، وقم بزيادة عنصر [رقم الفهرس][نتيجة اليد] في المصفوفة 4 بمقدار 1.
- زيادة عنصر [النتيجة اليدوية] في المصفوفة 5 بمقدار 1.
- بعد ذلك، قم بالمرور على 134,459 فئة من الأيدي الموضحة أعلاه.
- لتحديد قيمة الاحتفاظ بكل البطاقات الخمس، قم بترجمة البطاقات الخمس إلى رقم فهرس، وابحث عن قيمة البوكر lin array0.
- لتحديد قيمة الاحتفاظ بأي أربع بطاقات، قم بترجمة البطاقات الأربع إلى رقم فهرس، وابحث عن النتائج المحتملة على السحب في العنصر المقابل من المصفوفة 1. ومع ذلك، سيتضمن هذا الحصول على البطاقة التي تخلصت منها عند التوزيع. لذا يجب عليك طرح واحد من العنصر في المصفوفة المرتبط بقيمة البوكر للاحتفاظ بجميع البطاقات الخمس. على سبيل المثال، إذا كنت تحمل J♣ وQ♣ وK♣ وA♣ وتخلصت من 2♥، فستكون هناك طريقة واحدة للحصول على رويال، و8 طرق للحصول على فلوش، و3 طرق للحصول على ستريت، و12 طريقة للحصول على زوج من الولد أو أفضل، و23 طريقة للحصول على يد خاسرة. ومع ذلك، ستقول المصفوفة 1 أن هناك 24 طريقة للحصول على يد خاسرة، بما في ذلك الحصول على 2♥ عند السحب. لذا تحتاج إلى طرح نتيجة الاحتفاظ بكل شيء من النتائج المحتملة للطرق الخمس للاحتفاظ بأربع بطاقات.
- تأكد من فهمك لمنطق الخطوة السابقة، لأننا ننتقل بها إلى المستوى التالي. بالنسبة لعشر طرق لحمل أي ثلاث بطاقات، ستبحث عن النتائج المحتملة في المصفوفة ٢. ثم اطرح النتائج المحتملة من المصفوفة ١ للبطاقات الثلاث التي تحملها، ولكل بطاقة تتخلص منها. على سبيل المثال، بالنسبة لقيمة الاحتفاظ بـ ٢♣ ٢♥ ٢♠ والتخلص من ٤♥ وJ♠، ابدأ بالقيم في المصفوفة ٢ لـ ٢♣ ٢♥ ٢&سبيدز، ثم اطرح قيم ٢♣ ٢♥ ٢♠ ٤♥ و٢♣ ٢♥ ٢♠ J♠. ومع ذلك، سيؤدي هذا إلى طرح مضاعف لحمل جميع البطاقات الخمس. لذا، عليك إضافة ما تحصل عليه من حمل جميع البطاقات الخمس.
- بنفس المنطق، لحمل أي بطاقتين ابدأ بالقيم الموجودة في المصفوفة 3، واطرح مجموعات البطاقات المناسبة من المصفوفة 2، وأضف مجموعات البطاقات المناسبة من المصفوفة 1، واطرح مرة أخرى العنصر لحمل كل شيء من المصفوفة 0.
- للاحتفاظ ببطاقة واحدة، ابدأ بالقيم المرتبطة من المصفوفة 4، واطرح القيم المناسبة من المصفوفة 3، وأضف القيم المناسبة من المصفوفة 2، واطرح القيم المناسبة من المصفوفة 1، وأضف القيمة المناسبة من المصفوفة 0.
- للتخلص من كل شيء ابدأ بالقيم الموجودة في array5، ثم اطرح القيم المناسبة من array4، وأضف القيم المناسبة من array3، واطرح القيم المناسبة من array2، وأضف القيم المناسبة من array1، واطرح القيمة المناسبة من array0.
- يجب أن يكون لديك الآن عدد مجموعات النتائج المحتملة لجميع طرق اللعب الـ 32. حدد القيمة المتوقعة لكل منها. للعبة التي تُعطي أكبر قيمة متوقعة، أضف النتائج المحتملة لتلك اللعبة إلى مصفوفة النتائج المحتملة الإجمالية للعبة. تذكر أن تضرب الناتج في الوزن المرتبط باليد عند التوزيع.
- بعد مراجعة جميع أنواع الأيدي الأولية البالغ عددها 134,459، يجب أن يكون لديك عدد الطرق التي يمكنك من خلالها الحصول على كل يد في السحب. استخدم هذه المصفوفة لتحديد العائد الإجمالي للعبة.
فيما يلي أربعة برامج فرعية لترجمة من 2 إلى 5 بطاقات (مرقمة من 0 إلى 51) وإرجاع قيمة الفهرس.
int HandIndex2(int c1, int c2){ int r; r=combin_array[52][2]-combin_array[52-c1][2]; r+=combin_array[51-c1][1]-combin_array[52-c2][1]; return r;}int HandIndex3(int c1, int c2, int c3){ int r; r=combin_array[52][3]-combin_array[52-c1][3]; r+=combin_array[51-c1][2]-combin_array[52-c2][2]; r+=combin_array[51-c2][1]-combin_array[52-c3][1]; العودة r؛}int HandIndex4 (int c1، int c2، int c3، int c4) { int r؛ r = مصفوفة مترابطة [52] [4] - مصفوفة مترابطة [52-c1] [4]؛ r + = مصفوفة مترابطة [51-c1] [3] - مصفوفة مترابطة [52-c2] [3]؛ r + = مصفوفة مترابطة [51-c2] [2] - مصفوفة مترابطة [52-c3] [2]؛ r + = مصفوفة مترابطة [51-c3] [1] - مصفوفة مترابطة [52-c4] [1]؛ العودة r؛}int HandIndex5 (int CardIndex[]) { int r؛ r = مصفوفة مترابطة [52] [5] - مصفوفة مترابطة [52-CardIndex[0] [5]؛ r+=combin_array[51-CardIndex[0]][4]-combin_array[52-CardIndex[1]][4]; r+=combin_array[51-CardIndex[1]][3]-combin_array[52-CardIndex[2]][3]; r+=combin_array[51-CardIndex[2]][2]-combin_array[52-CardIndex[3]][2]; r+=combin_array[51-CardIndex[3]][1]-combin_array[52-CardIndex[4]][1]; return r;}الروابط
يوضح هذا الموقع كيف قام المؤلف بتسريع محلل الفيديو بوكر الخاص به من عام إلى سبع ثوانٍ.
يحتوي موقع VP Genius على صفحة مميزة حول برمجة فيديو البوكر.