[Kata] Bowling

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

4 comments on “[Kata] Bowling

  1. Có một vài điều chưa rõ ràng ở đây đó là:

    -Nhập 1 dãy số điểm các lượt ném đúng quy tắc là của một người hay của nhiều người thi đấu với nhau?

    -Mỗi 1 ván bowling có 10 lượt ném và Mỗi người chơi có hai lần ném để làm đổ hết 10 pin => Tổng số lần ném của 1 người chơi hết (10) lượt (không tính lượt thêm) là: 10×2 = 20???(đúng/sai)

    -Nếu người chơi bỏ cuộc giữa chừng ví dụ ném 5 lượt rồi không ném nữa thì có tính điểm không?

    -Cách tính điểm Strikes và Spares chỉ tính ở lượt ném thứ 1 hay lượt nào cũng được tính??

    -3 lượt ném thêm của lần ném thứ 10 có tính Strike và Spare không?

    =>Cần phải làm sáng tỏ điểm nà[email protected]@(nhập thế nào,hiển thị ra sao+mô tả chương trình hoạt động chi tiết thế nào?)
    =>Nếu không chỉ rõ ràng suy ra chương trình sẽ do trí tưởng tượng của lập trình viên +hiểu quy tắc bowling đến đâu và thiết kế hoạt động theo ý của LTV???

    -Vấn đề này yêu cầu lập trình theo quy tắc nào không?hay tự do thoải mái???

    Theo em hiểu thì: Tạo 1 chương trình tính điểm bowling có một chỗ để nhập dãy điểm ví dụ nhập 3 lần ném của 1 người chơi là:(10,2);(5,5);(3,10)…
    Sau đó chương trình sẽ cho ra tổng điểm của người đó[email protected]@

    • – Về luật chơi khá là rõ ràng đấy chứ? Bạn đọc kỹ lại xem.
      – Về bài tập thì đơn giản với đầu vào là kết quả của các lượt chơi (có thể là chuỗi như trong ví dụ trên) và đầu ra là tổng điểm.
      – Về lập trình, mình không nên bị bó buộc trong những quy tắc bởi như vậy sẽ ngăn cản sự sáng tạo.

    • Chương trình nhập vào các chuỗi XXXXXXXXXXXX , hay 9-9-9-9-9-9… hay 5/5/5/5 như VD ở trên kia kìa.
      Chứ nhập như bạn nêu VD thì dễ quá cần gì giải thuật.

    • Câu hỏi rất hay mỗi tội mình không để ý để trả lời kịp thời @[email protected]
      —————–
      Trước tiên bạn xem thử vài clip chơi bowling cho nó trực quan sinh động
      Ai chưa chơi bowling bao giờ thì xem thử ^^

      Trung Tuyến Nguyễn Xem giải đấu bowling thế giới để giải trí ?

      —————
      Chơi thử game luôn cho nó thích
      Trung Tuyến Nguyễn Hoặc chơi thử 1 game, kết hợp đọc luật tính điểm bowling xem thử luật có đúng không 😀
      http://www.mediafire.com/?l1o70n54znlupjg
      Pass giải nén: minigames.vnsharing.net
      —————
      Xem silde giải thích ngắn gọn
      Trung Tuyến Nguyễn http://www.slideshare.net/die4top/coco-dojo-3bowlingkata

Leave a Reply

Your email address will not be published. Required fields are marked *