2009-05-08 21 views
14

Kiddo của tôi có bài tập về nhà để viết Blackjack trong Java. Tôi đã giúp anh ta một chút nhưng phần lớn anh ấy đã làm tất cả bản thân và nó thực sự chơi khá tốt. Anh ta thậm chí còn gặp lỗi tôi không thấy trong cách tính giá trị tay. Tuy nhiên, có một điều mà anh ta chưa giải quyết và mọi giải pháp tôi có thể nghĩ là thực sự phức tạp và vượt xa những gì anh ta có thể dễ dàng viết mã với các kỹ năng Java thô sơ của anh ấy.Có cách nào thanh lịch để đối phó với Ace trong Blackjack không?

Ace. Trong thực tế, không chỉ một Ace, có bốn trong số họ và bạn có thể có thể có được tất cả bốn người trong số họ trong một bàn tay duy nhất. Làm thế nào để bạn đối phó thanh lịch với tính toán giá trị của một bàn tay của thẻ khi có một hoặc nhiều Aces, mỗi trong số đó có thể được đánh giá tại một hoặc mười một. Tôi cảm thấy như có một thuật toán duyên dáng cho nó, nhưng tôi không thấy nó. Tất nhiên, một phần của nó chỉ có thể là tôi mệt mỏi, nhưng có lẽ bạn có thể giúp đỡ.

Trả lời

24

Chỉ cần đối xử với nhau như ace 11. Sau đó, trong khi giá trị là hơn 21, trừ đi 10 từ tổng số của bạn cho mỗi ace trong tay của bạn.

+1

Đẹp và thanh lịch, ngoài việc phải xem nhiều hơn một lần ở thẻ. +1 –

+3

Bạn không nhất thiết phải xem nhiều hơn một lần. Chỉ cần giữ một số aces lần đầu tiên bạn nhìn. –

+9

Tuyệt vời như thế nào câu trả lời sai được bình chọn lên đến đỉnh. Khi các câu trả lời chính xác tiếp theo đã ghi nhận, chỉ có một ace được tính là 11, vì vậy sẽ hiệu quả hơn khi đếm mọi ace là 1, sau đó, nếu bạn tìm thấy ace, và tổng số <12, thêm 10. Không cần theo dõi bao nhiêu aces, và chỉ cần thêm một cần thêm. Nếu bạn đã thêm 10, bạn có thể đặt cờ "mềm" nếu bạn cần theo dõi xem tổng số có cứng hay mềm không. –

-1

Vấn đề là nó không được xác định: bạn có thể đếm (như tôi hiểu các quy tắc) một Ace là 1 hoặc 11. Nhưng bạn biết bạn sẽ không đếm nó là 11 mỗi lần, bởi vì bạn sẽ phá sản.

Giải pháp duy nhất tôi nghĩ là để tính toán cân bằng tỷ số cho mỗi giá trị có thể có của các ace nơi tổng < = 21.

3

Bất kể mỗi ace nào được tính vào tổng giá trị là 11, thì khi tổng số tiền vượt quá 21 trừ 10, nhưng bạn phải chắc chắn rằng bạn đếm số lần bạn trừ 10 và bao nhiêu lần bạn thêm 11 (một ace),

thêm 11> = trừ 10-phải luôn luôn được hài lòng

alorithm dụ:

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

Bạn sẽ chỉ sử dụng 1 ace cho 11 điểm. Vì vậy, tính toán tất cả nhưng ace cuối cùng là 1 và nếu có 10 hoặc ít hơn điểm, ace cuối cùng đếm như 10

+1

Hãy tưởng tượng một người chơi bắt đầu bằng ace-2. Họ nhấn get và ace, nhấn một lần nữa nhận được và ace, nhấn một lần nữa nhận được và ace. Ngay cả với một boong duy nhất họ đã có bốn! Với một đôi giày đa điểm nó có thể tồi tệ hơn. Giữ một số lượng và chiết khấu khi cần thiết ... – dmckee

4

Chỉ 1 Ace bao giờ đếm như 11.

Vì vậy, một phương pháp khác để điều trị mỗi Ace như 11 sẽ xử lý mọi Ace như sau: 1. Sau đó, thêm 10 vào tổng giá trị (được thực hiện bất kể Ace trên tay) và giữ nó trong một biến "cao" riêng biệt (giá trị + 10). Cũng tạo ra một boolean của ~ ace: true nếu (any) ace xuất hiện.

Và vì vậy khi kiểm tra điểm số với đại lý; kiểm tra nếu tay của người chơi có (bất kỳ) Ace, trong trường hợp bạn (có thể) sử dụng giá trị "cao", nếu không (không có Ace) sử dụng giá trị "thấp".

Bằng cách đó King + 9 + Ace (ví dụ xấu có thể) sẽ là ~ thấp: 20 & cao: 30 & ace: true - Với thông tin đó, bạn có thể kiểm tra xem 30 - 10 sẽ "giành chiến thắng trong trò chơi" hay không. Vì vậy, King + 5 + 5 (thấp: 20 cao: 30 ace: false) sẽ không sử dụng giá trị cao 30.

Tôi đang sử dụng phương pháp này để tôi biết khi nào hiển thị alt. Điểm số Ace trên màn hình; như 3/13 (Ace + 2), sử dụng cùng ace: true | false boolean tôi đã có. Đây chắc chắn là câu trả lời giống như câu trả lời đầu tiên, nhưng điều này có ý nghĩa hơn với tôi :)

2

Giống như câu trả lời của elundmark ...

Bạn có nhiều khả năng có phương pháp đánh giá giá trị tay blackjack. Luôn luôn giá trị aces tại một thời điểm. Nếu một bàn tay có chứa ace, tính toán một giá trị cứng (tất cả các aces là những người, 10) và một giá trị mềm (tất cả những người aces).

Nếu giá trị cứng không phải là một bức tượng bán thân, hãy trả về giá trị cứng. Nếu giá trị cứng là một bức tượng bán thân, hãy trả về giá trị mềm.

ví dụ 1
2, A, A
giá trị cứng 2 + 1 + 1 + 10 = 14
giá trị mềm = 2 + 1 + 1 = 4

giá trị cứng < 21, vì vậy trở cứng giá trị (value tay là 14)

dụ 2
2, A, A, 8
giá trị cứng = 2 + 1 + 1 + 8 + 10 = 22 (phá sản)
giá trị mềm = 2 + 1 + 1 + 8 = 12

giá trị cứng> 21, vì vậy trở lại giá trị mềm (giá trị tay là 12)

suy nghĩ truyền thống về các quy tắc và cách trò chơi được chơi, đó là giá trị của một Ace có điều kiện và có thể có hai giá trị, 1 hoặc 11. Khái niệm này khó thực hiện. Nó dễ dàng hơn nhiều trên một lập trình viên để đếm tất cả Aces như là một giá trị của một và có điều kiện thêm 10 điểm vào giá trị tay. Bằng cách đó, việc xếp hạng hoặc Giá trị của Thẻ của bạn có thể vẫn cứng nhắc và dễ hiểu. Tôi đã thử nghiệm với điều này trước khi bằng cách trả về một tập hợp các giá trị và một vài phương pháp khác. Đó là một nỗi đau, và không đáng để chỉ có một hạng Ace.

Nếu bạn muốn hiển thị alt trên màn hình như 2/12, thay vì trả về số nguyên, chỉ cần trả về đối tượng "BlackjackValue" chứa đối tượng Integer và String mà bạn tạo trong phương pháp đánh giá tay của bạn giá trị.

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; 
Các vấn đề liên quan