Mô tả vấn đề:
Viết một chương trình để tính điểm của 1 ván bowling dựa trên đầu vào là 1 dãy số điểm các lượt ném đúng quy tắc. Một số điều mà chương trình sẽ không làm:

  • Không kiểm tra tính hợp lệ của điểm số.
  • Không kiểm tra tính hợp lệ của số lượt ném và số lần ném (roll).
  • Không tính điểm sau từng lượt ném (chỉ tính tổng điểm cuối cùng sau khi ném đủ 10 lượt).

Tuỳ thuộc vào mỗi dojo khác nhau mà chương trình có thể hoàn thiện hoặc không, nhưng chúng tôi không kiểm tra ba điều trên nhằm giúp cho bài kata “sáng sủa” hơn, tập trung vào bài toán chính cần giải quyết. Nếu bạn muốn viết một trò chơi bowling thật thì bạn sẽ phải thực hiện các bước kiểm tra ở trên.

Quy tắc tính điểm của bowling có thể nói ngắn gọn như sau:

  • Mỗi 1 ván bowling có 10 lượt ném (người chơi bowling gọi là frame).
  • Mỗi frame, người chơi có hai lần ném để làm đổ hết 10 pin.
  • Nếu sau hai lần ném (của 1 frame) mà người chơi không ném đổ được hết 10 pin, điểm số cho frame đó là tổng số pin đã bị ném đổ.
  • Nếu sau hai lần ném (của 1 frame), người chơi ném đổ hết 10 pin, frame này được gọi là “spare” và điểm cho 1 frame spare được tính bằng 10 cộng thêm số pin mà bạn ném đổ ở lần ném tiếp theo (Ví dụ ở frame thứ 1 bạn đạt spare, frame thứ hai bạn ném lần 1 đổ 3 pin, lần 2 đổ 5 pin, điểm số của frame 1 (spare) sẽ bằng: 10 +3 , và tổng điểm của frame 1 và frame 2 sẽ là: (10+3) + (3+5).
  • Nếu sau lần ném đầu tiên (của 1 frame), người chơi ném đổ hết 10 pin, frame đó được gọi là strike, điểm số của của frame strike được tính bằng 10 cộng thêm số pin mà người chơi ném đổ ở 2 lần ném tiếp theo (Ví dụ ở frame thứ 1 bạn đạt strike, frame thứ hai bạn ném lần 1 đổ 3 pin, lần 2 đổ 5 pin, điểm số của frame 1( strike) sẽ bằng: 10 +3 +5 , và tổng điểm của frame 1 và frame 2 sẽ là: (10+3 +5) + (3+5).
  • Lượt ném thứ 10 thì hơi khác hơn 1 chút. Nếu bạn đạt strike hoặc spare ở lượt ném thứ 10 thì bạn sẽ được ném thêm ( bạn được ném tối đa 3 lần trong lượt ném thứ 10). Ví dụ nếu ngày lần ném đầu tiên của frame thứ 10 bạn đạt strike thì bạn sẽ được ném tiếp hai lần, nếu bạn đạt spare thì bạn sẽ được ném thêm 1 lần nữa. ( Tối đa điểm bạn có thể có trong frame 10 là (10+10+10) với 3 lần ném strike ).
  • Bạn có thể xem thêm về luật trò bowling tại : www.topendsports.com/sport/tenpin/scoring.htm

Gợi ý:

Điều khiến trò bowling thú vị đó là strike and spare. Khi chúng ta đạt được một frame strike hoặc spare, chúng ta không thể biết điểm của frame đó ngay, chúng ta phải chờ 1 hoặc 2 lần ném (1/2 or 1 frame) để biết được điểm thưởng thêm là bao nhiêu.

Một số test case mẫu:

( Dấu “X” là strike, “/” là spare, “-” là miss: không ném đổ pin nào).

  • “XXXXXXXXXXXX” (12 lần ném: 12 strikes) = 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 + 10+10+10 = 300
  • “9-9-9-9-9-9-9-9-9-9-” (20 lần ném: 10 cặp: 9 và miss) = 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 = 90
  • “5/5/5/5/5/5/5/5/5/5/5” (21 lần ném: 10 cặp: 5 rồi spare, lần ném cuối ném đổ 5 pin) = 10+5 + 10+5 + 10+5 + 10+5 + 10+5 + 10+5 + 10+5 + 10+5 + 10+5 + 10+5 = 150

Bình luận từ những người đã giỏi bài kata này

Bạn hãy viết vài suy nghĩ của bạn về những điều bạn học được từ kata này. Bạn không phải đưa ra code bạn đã viết ra – Tôi nghĩ giải pháp (code bạn đã viết được) thì không thú vị bằng con đường mà bạn đã đi để tìm ra giải pháp đó và những lối rẽ mà bạn đã rẽ. Vì vậy, mọi người có thể nói thẳng vào vấn đề chính của bài kata và cách giải quyết chúng, ý tưởng thiết kế nào đã bị bỏ đi, và thứ tự các test case được thực hiện.

  • Một điểm thú vị cần chú ý đó là nếu không đếm số frame (bằng bất cứ cách nào) thì sẽ rất khó để xác định frame nào là frame cuối (giả dụ có một lần ném thêm như trong test case ở trên). Cập nhật: Sau khi thử nhiều cách, gồm cả cách viết một ma trận logic về những khả năng có thể của frame cuối cùng, Tôi vẫn không chắc chắn là có thể xác định được lần ném bonus mà không đếm số frame. RudyXDesjardinsKataBowlingByAndreasLarsson

Nguồn: CodingDojo.Org

Người dịch: Nguyễn Trung Tuyến, Nguyễn Tuấn Anh