وظيفة لتحديد ما إذا كانت اليد لعبة البوكر هو مستقيم ؟

StackOverflow https://stackoverflow.com/questions/530208

  •  22-08-2019
  •  | 
  •  

سؤال

عن الواجب أعطيت بطاقة فئة من الأنواع السردية على رتبة تناسب.أنا اللازمة للمقارنة بين أيدي البوكر (كل ناحية هو ArrayList 5 بطاقات) و تقرر الفائز.

على isStraight() وظيفة يزعجني لأنه يجب أن نبدأ من جديد في العد بعد الآس.على سبيل المثال ،

ملكة, ملك, ACE, اثنين, ثلاثة

لا يزال يعتبر على التوالي.ما هي أفضل طريقة أن رمز هذا وظيفة ؟

هنا هو رتبة/دعوى نوع المذكورة رمز ، إذا كان ذلك يساعد.

public enum Rank
{
    TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9),
    TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);

    private final int points;

    private Rank(int points)
    {
        this.points = points;
    }

    public int points()
    {
        return this.points;
    }
}

public enum Suit
{
    DIAMONDS, CLUBS, HEARTS, SPADES;
}
هل كانت مفيدة؟

المحلول

وكنت أدرك أن وفقا لقواعد أي لعبة البوكر لقد لعبت من أي وقت مضى أو سمعت عن مباشرة لا يمكن التفاف أليس كذلك؟ الآس يمكن أن تكون منخفضة [A، 2،3،4،5] أو عالية [10، J، Q، K، A] ولكن لا يمكن أن التفاف. وفقا لتلك القواعد (ليس لك) لقد نفذت شيئا من هذا القبيل من قبل. في الأساس قمت بفرز مجموعة والسير عليه، والتأكد من بطاقة الحالية أعلى واحد من السابق. في التكرار الأول، إذا كان الآس، فإنك تحقق صراحة [A، 2،3،4،5]. إذا كان يمكنك العودة الحقيقي وإذا لم يكن لك تواصل مع المنطق العادي على التوالي. وينبغي أن تحدد لك في الاتجاه الصحيح.

نصائح أخرى

لطيفة نهج لحل أيدي البوكر في العام لتعيين كل بطاقة قليلا القيمة مع بعض ((رتبة 2)*2) مجموعة بت وكذلك بت (بدلة+28) مجموعة (حتى 2=1, 3=4, 4=16, الخ.تصل إلى=0x1000000).ثم يضاف معا جميع البطاقات (دعوة تلك النتيجة 'مجموع'.حساب V1=(مجموع & 0x2AAAAAA)>>1, V0=(مجموع & 0x1555555) ، V2=V1 & V0.أيضا أو معا قيم خمس بطاقات ، وحساب V3=OrValue & 0xF0000000;

  1. الزوج, V1 كل مجموعة بت V0 عدة أجزاء ، V2 سوف يكون صفر.
  2. عن زوج اثنين ، V1 سوف يكون اثنين بت تعيين V2 سوف تساوي صفر.
  3. ثلاثة من نوع, V1 كل مجموعة بت و V2 سوف تساوي V1.
  4. على التوالي, V0 إما أن 0x1000055 أو آخر قوة من يومين متعددة من 0x155.
  5. بالنسبة دافق ، V2 سوف يكون بالضبط واحدة مجموعة بت.
  6. كامل البيت V1 سوف يكون اثنين بت مجموعة, V2 سوف يكون غير الصفر.
  7. أربعة من نوع ، سواء V1 سوف تكون مرتين v0, مع وجود واحد من مجموعة بت أو V0 سوف يكون بالضبط اثنين بت تعيين V1 سوف يكون صفر.
  8. عن تدفق على التوالي, شروط مستقيم دافق سيتم الوفاء بها.

هذه الاختبارات المطلوبة للحصول على هذا النهج ينبغي أن تكون قابلة للتنفيذ بسرعة مع الحد الأدنى من المتفرعة.

هل يمكن كتابة خوارزمية نزوة إلى العودة الحقيقية على الرغم من عدد البطاقات الممكنة ولكن إذا كنت أدرك أن هناك فقط 10 مجموعات صالحة على يد فرزها، هل يمكن أن مجرد إلقاء نظرة على هذه:

2-6, 3-7, 4-8, 5-9, 6-T, 7-J, 8-Q, 9-K, T-A, (2-5,A)

ومنذ هناك فقط 5 بطاقات فيكم القائمة، هل يمكن ترتيب هذا الأمر وتحديد الفرق بين 2 بطاقات متتالية. إذا كان يحتوي على الآس، تحتاج إلى النظر على أنها بطاقة منخفضة جدا. إذا كان كل الاختلافات هي 1 (أو -1، اعتمادا على ترتيب)، لديك مباشرة الخاص بك.

ويهمني القول بأن بالنظر إلى أن تعريف RANK، أن المستقيمة يمكن أن تبدأ فقط بحد اقصى ACE.points () - 4

وحتى إذا كنت فرز يدك وأدنى مراتب هو> ACE.points () - 4 ثم لا يمكن أن يكون لها مباشرة، وإلا كنت مجرد تكرار على اليد أن نرى أن كل بطاقة هي RANK السابقة + 1.

إذا ACE يمكن أن تكون مرتفعة أو منخفضة ثم انتقل مع ما أجاب SHS.

ومع حلقة الداخلية انها تافهة جدا، فإن التحدي يكمن في أن تفعل ذلك دون وجود حلقة داخلية ...

وأيضا، فإنه يعتمد على إذا كنت فهمت معلمك أو يساء فهمها المدرس (أو تحريف) على قواعد اللعبة.

وأنا أعتقد أن يميل إلى مجرد خلق مجموعة [2..14] ووضع البطاقات في الموقع الذي يتوافق مع رتبهم. إذا كنت أصاب مكررة، انها ليست على التوالي، وعند الانتهاء، يجب أن يكون 8 مسافات في صف واحد. إذا كان لديك أقل من 8 مسافات في صف واحد، انها ليست مباشرة.

وجميع الحلول الأخرى لا أستطيع الخروج مع تتطلب الحلقة الداخلية - والحلقات الداخلية هي واحدة من تلك الأشياء البرمجة قذرة تحتاج إلى تجنب كلما يمكنك إذا كنت تريد الذهاب ليكون من أي وقت مضى مبرمج محترم

وتحرير: أيضا، إذا كنت أسيء فهمها المعلم وحالة التفاف الوحيدة هي "10، ي، ف، ك، و" (كما هو الحال في قواعد حقيقية)، ثم تحتاج إلى اختبار إضافي أنه إذا كان كل من 2، 13 و14 وردت، كما انها فشل (ملفوف 2-حزب العدالة والتنمية).

و(قام مرة أخرى لاستبدال 1 لايس مع 14 بعد إعادة قراءة السؤال)

وأنا لا أميل استخدام ثوابت التعداد من ذلك بكثير، لكنني أفضل اسمه ولكن سوف أفترض الذهاب من "ACE" إلى "14" تافهة

وأنا كسول جدا لكتابة التعليمات البرمجية جافا الحقيقي (بجانب لديك فعلا لتقوم بأداء واجبك ^^)

check if the list has 5 cards
convert card names to a card number list named array
sort the list array
for i=1 to 4
if not (array[i] + 1) % 13 == (array[i+1]) % 13
then it is not a straight

ويسمى المشغل٪ مودولو جدا (15 13٪) == 2 يمكنني استخدام هذا المشغل كلما واجهت التحدي "التفاف على"

وتحرير: بعد إعادة قراءة سؤالك لي الحل لا يمكن أن تعمل من خارج منطقة الجزاء. يجب إعادة ترتيب التعداد بحيث الثاني == 0

وأوصي باستخدام ناقلات بت لتمثيل البطاقات. هذا يتجنب الحاجة إلى فرز. يمكنك إضافة الآس مرتين (مرة واحدة 1 في أحيان أخرى كملك) أو يمكنك حالة خاصة الوضع بدءا التحقق إذا تم تعيين بت الآس قبل التحقق إذا تم تعيين 2). يمكنك بناء كبير جدول البحث إذا المسائل السرعة. هذا النهج تنظيف على موازين للعثور على بقية اليدين (الإحمرار، 2 زوج والمنازل الكاملة، والرحلات، وهلم جرا). كما أنه يجعل من السهل معرفة ما اذا كان مستقيم معين هو أعلى من الآخر. وتوسعها نظيفة إلى 7 بطاقة مقيم

في رمز زائف يبدو شيئا من هذا القبيل لحالة عامة جدا (هل يمكن أن يكون أي عدد من البطاقات. وترجع مباشرة أول)

 long cardBitMask
 for each card in hand
   setBit in cardBitMask

 hearts = mask(cardBitMask)
 diamonds = mask(cardBitMask)
 clubs = mask(cardBitMask)
 spades = mask(cardBitMask)

 // find straight
 uniqueCards = hearts|diamonds|clubs|spades
 int cardsInaRow = 0
 if uniqueCards&AceCardMask:
    cardsInaRow = 1
 for card = 2...King
   if uniqueCards&(1<<card)
      cardsInARow++
   else 
      if cardsInARow == 5
         break
      cardsInARow = 0
 if cardsInARow==5:
     return true
 return false

وإضافة كافة الصفوف من أجل قائمة، مرتين. ثم، للتحقق مما إذا يد هي على التوالي، وفرز اليد حسب الرتبة وثم معرفة ما اذا كان من ناحية هي قائمة فرعية من تلك القائمة.

ويمكن أن تكتب فئة يحول كل بطاقة إلى قيمة بطاقة معينة

وجوكر = 11 الملكة = 12 الملك = 13 الآس = 0 أو 14

وسيجعل من الأسهل كثيرا التعامل مع بطاقة وتبحث عن يد ممكنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top