2009-05-08 12 views
14

मेरे किड्डो में जावा में ब्लैकजैक लिखने के लिए होमवर्क असाइनमेंट था। मैंने उसे थोड़ी मदद की लेकिन अधिकांश भाग के लिए उसने खुद को यह किया और यह वास्तव में बहुत अच्छी तरह से खेलता है। उसने एक त्रुटि भी पकड़ी जिसे मैंने नहीं देखा कि यह हाथ मूल्यों की गणना कैसे कर रहा था। हालांकि, एक झगड़ा है जिसे उसने निपटाया नहीं है और हर समाधान जिसे मैं सोच सकता हूं वह वास्तव में जटिल है और वह अपने अभी भी प्राथमिक जावा कौशल के साथ आसानी से कोड करने में सक्षम होने के तरीके से परे है।क्या ब्लैकजैक में ऐस से निपटने का एक शानदार तरीका है?

ऐस। असल में, सिर्फ एक ऐस नहीं, उनमें से चार हैं और आप संभवतः उन सभी चारों को एक ही हाथ में प्राप्त कर सकते हैं। एक या अधिक एसेस होने पर कार्ड के हाथों के मूल्य की गणना करने के साथ आप सुंदर तरीके से कैसे निपटते हैं, जिनमें से प्रत्येक का मूल्य एक या ग्यारह में किया जा सकता है। मुझे लगता है कि इसके लिए एक सुंदर एल्गोरिदम होना चाहिए, लेकिन मैं इसे नहीं देख रहा हूं। बेशक, इसका हिस्सा यह हो सकता है कि मैं थक गया हूं, लेकिन शायद आप मदद कर सकते हैं।

उत्तर

24

बस 11. के रूप में प्रत्येक इक्के इलाज के प्रत्येक संभव मूल्य के लिए स्कोर की गणना करने के बाद थोड़ी देर के मूल्य 21 से अधिक है, से 10 घटाना है आपके हाथ में प्रत्येक ऐस के लिए आपका कुल।

+1

कार्ड पर एक से अधिक बार देखने के अलावा अच्छा और सुरुचिपूर्ण। +1 –

+3

आपको जरूरी नहीं कि एक से अधिक बार देखना पड़े। पहली बार जब आप देखते हैं तो एसेस की गिनती रखें। –

+9

आश्चर्यजनक है कि गलत जवाब शीर्ष पर कैसे मतदान किया जाता है। जैसा कि बाद के सही उत्तरों ने ध्यान दिया है, केवल एक ऐस को 11 के रूप में गिना जाता है, इसलिए प्रत्येक एसी को केवल 1 के रूप में गिनने के लिए यह अधिक कुशल होता है, फिर, यदि आपको कोई ऐस मिलती है, और कुल <12, 10 जोड़ें। कितने एसेस का ट्रैक रखें, और केवल एक अतिरिक्त जोड़ की आवश्यकता है। यदि आपने 10 जोड़ दिया है, तो आप एक "मुलायम" ध्वज सेट कर सकते हैं यदि आपको ट्रैक करना है कि कुल हार्ड या नरम है या नहीं। –

-1

समस्या यह है कि यह निर्धारित नहीं है: आप एक एसी को 1 या 11 के रूप में गिन सकते हैं (लेकिन आप जानते हैं कि आप इसे हर बार 11 के रूप में गिनने वाले नहीं हैं, क्योंकि आप बस्ट।

एकमात्र समाधान मुझे लगता है कि इक्का जहां योग < = 21.

3

इससे कोई फर्क नहीं पड़ता कि प्रत्येक एसी को 11 के रूप में योग मूल्य पर गिना जाना चाहिए, फिर जब कुल योग 21 से अधिक घटाकर 10 से घटा है, लेकिन बात यह है कि आपको यह सुनिश्चित करना होगा कि आप कितनी बार घटाते हैं 10 और कितनी बार आप 11 (एक इक्का), जोड़ने

जोड़ने 11> = घटाना 10 - हमेशा संतुष्ट होना चाहिए

alorithm उदाहरण:

int sum=0; 
int ace=0; 
int subtract=0; 
while(!busted or !stay) 
{ 
    Hitme(value); 
    if(value=11)ace++; 
    sum+=value; 
    if(sum>21) 
    { 
     if(ace>=1) 
     { 
     if(ace>=subtract) 
     { 
      sum-=10 
      subtract++; 
     } 
     else 
     { 
      busted; 
     } 
     } 
     else 
     { 
      busted; 
     } 
    } 
    else 
    { 
    hit or stay; 
    //of course if sum== 21 then force stay 

    } 
} 
7

आप 11 अंकों के लिए कभी भी 1 एसी का उपयोग करेंगे। तो 1 के रूप में सभी लेकिन पिछले इक्का की गणना और यदि 10 या उससे कम अंक हैं, पिछले इक्का से 10 के रूप में

+1

एसी -2 के साथ शुरू होने वाले एक खिलाड़ी की कल्पना करो। वे गेट और ऐस हिट करते हैं, फिर से इकट्ठा हो जाते हैं और फिर से हिट करते हैं, फिर से हिट करते हैं। यहां तक ​​कि एक डेक के साथ भी चार मिल गए हैं! एक मल्टीडेक जूता के साथ यह और भी खराब हो सकता है। आवश्यकता के रूप में एक गिनती और छूट रखें ... – dmckee

4

केवल 1 ऐस हमेशा की तरह 11

तो, प्रत्येक ऐस के रूप में इलाज के लिए एक वैकल्पिक पद्धति में गिना जाता है मायने रखता है 11 प्रत्येक ऐस को 1. के रूप में इलाज करना होगा, फिर कुल मूल्य में 10 जोड़ें (हाथ पर ऐस के बावजूद) और इसे एक अलग "उच्च" चर (मान + 10) में रखें। इसके अलावा ~ एसी का बूलियन बनाएं: सच है अगर (कोई भी) ऐस आता है।

और इसलिए डीलर के खिलाफ स्कोर की जांच करते समय; जांचें कि क्या खिलाड़ियों के हाथ में (कोई भी) ऐस है, जिस स्थिति में आप "उच्च" मान का उपयोग कर सकते हैं, अन्यथा (कोई ऐस) "कम" मान का उपयोग नहीं करता है।

इस तरह राजा + 9 + ऐस (शायद खराब उदाहरण) ~ कम होगा: 20 & उच्च: 30 & ऐस: सत्य - उस जानकारी के साथ आप जांच सकते हैं कि 30 - 10 "गेम जीतेंगे"। तो, किंग +5 + 5 (कम: 20 उच्च: 30 ऐस: झूठा) इसका उच्च मूल्य 30 का उपयोग नहीं करेगा।

मैं इस विधि का उपयोग कर रहा हूं इसलिए मुझे पता है कि एक alt दिखाने के लिए। ऐस स्कोर ऑनस्क्रीन; 3/13 (ऐस + 2) की तरह, एक ही ऐस का उपयोग करके: सच | झूठी बूलियन मेरे पास पहले से है। यह निश्चित रूप से पहले जैसा ही जवाब है, लेकिन यह मुझे अधिक समझ में आता है :)

2

elundmark के उत्तर के समान ...

आपको शायद एक ऐसी विधि मिल गई है जो ब्लैकजैक हैंड वैल्यू का मूल्यांकन करे। एक बिंदु पर हमेशा इक्के मान लें। यदि हाथ में एक इक्का होता है, तो हार्ड मान की गणना करें (सभी एसेस हैं, +10) और एक नरम मान (सभी एसेस वाले)।

यदि हार्ड मान एक बस्ट नहीं है, तो हार्ड मान वापस करें। यदि हार्ड वैल्यू एक बस्ट है, तो नरम मान वापस करें।

उदाहरण 1
2, ए, ए
कठिन मूल्य 2 + 1 + 1 + 10 = 14
नरम मूल्य = 2 + 1 + 1 = 4

कठिन मूल्य < 21, इतनी मेहनत से वापसी मूल्य

उदाहरण 2 (हाथ मूल्य 14 है)
2, ए, ए, 8
कठिन मूल्य = 2 + 1 + 1 + 8 + 10 = 22 (बस्ट)
नरम मूल्य = 2 + 1 + 1 + 8 = 12

कठिन मूल्य> 21, इसलिए मुलायम मान (हाथ मूल्य है 12)

नियमों और जिस तरह से खेल खेला जाता है, के बारे में पारंपरिक सोच है कि एक ऐस के मूल्य सशर्त है और दो मान हो सकते हैं है, 1 या 11. इस अवधारणा को लागू करना मुश्किल है। एक प्रोग्रामर पर सभी एसेस को एक के मूल्य के रूप में गिनने और सशर्त रूप से हाथ के मूल्य में 10 अंक जोड़ने के लिए यह बहुत आसान है। इस तरह आपके कार्ड की रैंक या मूल्य कार्यान्वयन कठोर और सीधा रह सकता है। मैंने मूल्यों और कुछ अन्य विधियों के संग्रह को वापस कर इस से पहले प्रयोग किया है। यह एक दर्द है, और सिर्फ एक ऐस रैंक के लिए इसके लायक नहीं है।

यदि आप एक इंटीजर लौटने की बजाय स्क्रीन पर 2/12 की तरह एक alt दिखाना चाहते हैं, तो बस एक "ब्लैकजैक वैल्यू" ऑब्जेक्ट लौटाएं जिसमें एक इंटीजर और स्ट्रिंग ऑब्जेक्ट होता है जिसे आप अपने हाथ का मूल्यांकन करने वाली विधि में बनाते हैं मूल्य।

0
short aces_count = 0; 
short non_aces_sum = 0; 
short global_sum = 0; 

foreach card in _card:{ 
    if(card.value != 11){ // assuming ace value is 11 
     if(card.value > 10) 
      non_aces_sum += 10; 
     else 
      non_aces_sum += card.value 
    }else 
     aces_count += 1; 
} 

short aces_sum = 0; 
if(aces_count > 0) aces_sum = 11; 

for(int i=0 ; i < aces_count - 1; i++){ // - 1 cuz already asigned first ace 
    aces_sum += 1; // 2x aces == 22 so max 1 ace has value 11 
} 
if(aces_sum + non_aces_sum > 21) 
    aces_sum = aces_count; // no need for an 11 value ace, so all are 1 

global_sum = non_aces_sum + aces_sum; 
संबंधित मुद्दे

 संबंधित मुद्दे