Xây dựng hệ thống chơi game Tá lả phỏm online (garagames)

Tớ sắp làm (trong nhóm) một cái game chơi bài, trò chơi nổi tiếng và rất phổ biến tại Việt Nam – Tá Lả – Phỏm. Nếu các bạn muốn biết kỹ năng, những gì diễn ra trong đầu tớ, … hay đơn giản là cũng muốn tham gia, muốn học làm một thứ tương tự như thế này, thì hãy theo dõi bài này nhé.

UPDATE: Hệ thống (đã cải tiến và nâng cấp về performance, scale) đang chạy trên http://www.vn-zoom.com , hoạt động ổn định. Chúng tôi cũng sẵn lòng cung cấp các game này như là dịch vụ (SaaS) để cùng hợp tác triển khai trên hệ thống thứ 3, cùng tối thiểu hoá chi phí đầu tư và tăng hiệu quả kinh doanh.

UPDATE: Dịch vụ chơi game này đang được Minh Viet JSC cung cấp (giám đốc Dũng Nguyễn – Googler)

CREDIT: Rất cảm ơn góp ý của @hoangxu, @gachien, @dungla, @tridm, @lehuongA2, @hoahongxam trong quá trình xây dựng tài liệu

Mô tả về trò chơi

Tớ dùng ngôn ngữ đời thường bình dân để mô tả, các bạn có viết doc cho doanh nghiệp, khách hàng nhớ đổi giọng văn nhé. Cách mô tả ở đây là dựng user story, hướng tới các bạn lập trình viên, để các bạn có thể dễ dàng biến mô tả này thành tổ chức dữ liệu và module business cho chương trình

Luật chơi Tá Lả thông dụng – quy ước, thuật ngữ

Quân = Cây: chỉ 1 lá bài
Số: chữ, số in trên lá bài, chỉ độ to của lá bài (A là nhỏ nhất < 2 <3 … < Q < K là to nhất)
Chất: màu, kiểu lá bài: rô cơ bích tép (nhép) (RCBT)
Bài (để chơi): luôn luôn có 9 cây (mỗi Người luôn có 9 cây trên bài và cả các cây đã ăn)

Hội chơi: một nhóm người chơi liên tục các ván tạo thành Hội. Hội tan rã (kết thúc) khi có 1 Người nghỉ.

Ván: một ván có tối đa 4 người chơi là Người1, Người2, Người3, Người4
NgườiN: N là số từ 1 đến 4, người bất kỳ trong ván chơi đều có Người Trước và Người Sau. Người cầm Bài để chơi.

Bắt đầu Ván: khi bắt đầu chơi, hệ thống sẽ Chia bài cho các người chơi.

  • Các quân bài khi chia được phân phối ngẫu nhiên. Các quân còn lại (Nọc) cũng được sắp xếp ngẫu nhiên.
  • Vị trí Người chơi 1 2 3 4 cũng được sắp xếp ngẫu nhiên. (hoặc vào trước ngồi trước)
  • Nếu Ù, có option để cho chọn có random lại chỗ ngồi không
  • Khi bắt đầu ván đầu tiên, Random để chọn người Đánh đầu tiên. Người này sẽ được (hệ thống) tự động lấy thêm Cây đầu từ Nọc

Nọc: phần bài còn lại ngay sau khi chia xong, đặt ở giữa bàn.

Cạ: 2 Quân cùng số (số bằng nhau, VD cùng là 2, cùng là Q) hoặc 2 Quân cùng Chất có Số cách nhau 1 hoặc 2 đơn vị
Phỏm: (Note: Phỏm cũng đc coi là cạ, vì vẫn thoả mãn điều kiện của Cạ): gồm 3 Cây trở lên. Các Cây này cần thoả mãn tính chất: liên tiếp Số cùng Chất, hoặc các cây có cùng Số

Lượt: Ván tá lả chơi theo lượt, lần lượt từng người chơi (Từ Người1 đến NgườiN, sau NgườiN là Người1). Mỗi khi đến Lượt (có Lượt), Người chơi phải làm hai việc: Lấy bài và Đánh bài. Lấy bài là quyết định Ăn cây Rác của Người Trước hoặc bốc một Cây từ Nọc lên. Đánh bài là Đánh, hoặc Ù. Lượt đổi luân phiên Ngược chiều kim đồng hồ.
Đánh: một Người khi đến lượt chơi, luôn luôn phải đánh Cây Rác (Người Sau có thể Ăn). Không được đánh cây đã Ăn. (Note: Đánh cây trong Cạ, trong Phỏm đều được) (Note: Móm vẫn phải đánh)

Cây Rác: Khi đến lượt, sau khi Lấy Bài (Người chơi sẽ có 10 Cây), Người chơi phải Đánh ra một Cây Rác (để bài luôn có 9 Cây)
Cây Đã Ăn: Người chơi ăn Cây Rác của Người Trước thì Cây đó sẽ trở thành Cây Đã Ăn của Người Chơi (đang có Lượt). Cây Đã Ăn phải luôn lật cho tất cả Người chơi trong Ván được biết.
Bốc: lấy một Cây từ Nọc khi đến Lượt
Chốt: khi Người chơi có Lượt mà Người Sau đã có 3 Cây Rác thì lần Đánh này gọi là Chốt.
Ăn: một Người khi đến lượt chơi, có thể ăn của Người Trước, chỉ được Ăn nếu cây đó Ăn vào Cạ –> trở thành Phỏm. Mỗi Phỏm chỉ được Ăn vào 1 Cây. (VD: có Cạ 2R3R, có thể ăn 1R, 4R. Sau khi ăn 1R, không được ăn 4R nữa. Nếu có cạ 2R3R 5R6R, có thể ăn 1R và 4R, trường hợp này không tính là Ăn 2 lần vào Phỏm vì 4R ăn vào Phỏm 5R6R chứ không phải ăn nối vào 1R2R3R).

Tạm thời không cho phép ăn khống. (hoặc bố trí đây là ràng buộc Option)
Chú ý với các phỏm dọc, thì số nhỏ nhất là A, số lớn nhất là K. (VD chỉ có thể có Phỏm 1 2 3, J Q K, không cho phép Q K A)

Chuyển: khi có người Ăn, Cây Rác trên cùng (vì mỗi Người có thể có nhiều Cây Rác) được chuyển Ngược chiều kim đồng hồ 1 mức.
Tái: sau khi Chuyển, Người nào có Cây Rác giảm xuống từ 4 -> 3 thì Người đó lại được có Lượt tiếp (Ăn/Bốc và Đánh tiếp)
(Note: Móm vẫn được Tái).

Ăn Chốt: Người chơi Ăn Cây Rác của Người Trước khi mà mình đã có sẵn 3 Cây Rác

Kết thúc ván: khi một Người đến Lượt mà đã có 3 Cây Rác, sau khi Ăn/Bốc, họ phải thực hiện các hành động theo thứ tự sau:

  • Hạ (nếu có Phỏm)
  • Gửi (nếu có thể)
  • Đánh (bắt buộc phải đánh, Móm cũng phải đánh)
  • Ngồi đợi với phần bài còn lại để tính điểm (nếu ván kết thúc bằng tính điểm)

Hạ: Khi Người nào đã có 3 Cây Rác, đánh Cây Rác thứ 4 thì phải Hạ, trình tất cả các Phỏm của mình ra, thực hiện các lần Gửi. giữ lại các Cây còn lại để tính điểm. Thứ tự hạ trước sau có liên quan đến thắng thua. Nếu tổng số điểm bằng nhau, Người nào Hạ trước sẽ thắng. (Note: một Người có thể Hạ nhiều lần, do họ có thể được Tái)

Gửi: khi Hạ, nếu Người chơi có Phỏm để hạ thì sẽ được Gửi. Người chơi đưa các cây trên bài mình vào các Phỏm của Người đã Hạ trước sao cho Phỏm đó vẫn đảm bảo tính chất Phỏm sau khi Gửi.
Móm: khi Hạ, nếu không có Phỏm, Người chơi sẽ bị Móm. Móm không được Gửi.
Ù: Bất kỳ lúc nào khi 9 Cây trên Bài có thể sắp xếp thành các Phỏm mà không còn thừa cây nào thì Người chơi có thể Ù. Thời điểm Ù khi nào do Người chơi quyết định. Khi Ù, Ván kết thúc ngay lập tức.
Khi Hạ, sau khi trình hết Phỏm ra, Người chơi có thể Gửi đến mức không còn Cây nào (Tính điểm = 0) thì cũng là Ù. Ván chơi kết thúc lập tức.

Ù Khan: Ngay sau khi chia xong bài, nếu Người chơi không có bất kỳ Phỏm hay Cạ nào thì tính là Ù Khan, quyền lợi giống như Ù.

Ù Tròn: Người chơi khi đến lượt có 10 Cây trên bài, đều có thể ghép thành Phỏm cả –> được gấp đôi Ù

Đền: Một Người chơi phải chịu phạt thay các Người khác. Có nhiều tình huống dẫn đến phải đền:

  • Do ngốc: Nếu Người chơi nào bị ăn 3 Cây Rác (dẫn đến Người Sau được Ù) thì phải chịu thay các Người chơi (không Ù) còn lại phần phạt khi Ù.
  • Đền do Tái vòng: khi người được Tái lại Ù, người ăn chốt cuối cùng phải chi trả phí Ù (chi 15Chip) hộ hai người còn lại.
  • Đền do Ăn láo: Ăn 2 cây vào một Phỏm, Ăn không thành Phỏm (nếu gỡ bỏ ràng buộc khi Ăn sẽ xảy ra trường hợp này)
  • Đền do gửi: không áp dụng (VD: Người1 hạ 1R2R3R, Người2 hạ, rồi gửi con 4R vào, Người3 Hạ, rồi gửi 5R vào, Ù –> Người2 bị đền –> do tạo điều kiện cho Người sau Ù)

Hoặc trong quá trình hạ, người nào ăn cây thứ 4 của người trước đó và khi một trong những người hạ sau Ù

Tính Điểm: Sau khi các phỏm đã hạ hết xuống và gửi đi thì các Cây trên tay sẽ sử dụng để tính điểm bằng cách cộng lại số điểm của từng Cây (A=1, J=11, Q=12, K=13). Nếu bài nào có số điểm thấp nhất thì thắng. Trường hợp đồng điểm thì tính theo thứ tự Hạ, Hạ trước thì thắng.
Trường hợp tất cả cùng Móm, người nào Móm trước thì thắng.

Luật tính thưởng phạt

Đơn vị cơ bản cho một ván là Chip. Một Chip có thể đổi thành x Coin (tuỳ theo nhóm chơi quyết định).
Các thưởng phạt được tính theo quy tắc sau:

  • Ván kết thúc bằng Tính Điểm: Người nhất được lấy tất cả thưởng của các Người còn lại. Người nhì nộp 1Chip, ba nộp 2Chip, bét nộp 3Chip.
  • Móm phải nộp 4Chip.
  • Khi Ù, mỗi Người còn lại nộp cho Người Ù 5Chip (tổng cộng Người Ù ăn 15Chip)
  • Ù Khan, cũng như Ù
  • Ù Tròn, gấp đôi Ù
  • Người bị Ăn Chốt nộp 4Chip cho Người Ăn
  • Người nào ăn khống trong Lượt, khi đến cuối mà không có Phỏm cho Cây Đã Ăn ấy sẽ đền 5Chip cho mỗi Người còn lại (mất tổng cộng 15Chip).

Business

  • Hệ thống hỗ trợ chơi theo luật Phỏm Hà Nội
  • Hệ thống có API cho các client giao tiếp tự do (client có thể là wap, web, mobile app)
  • Không có chế độ cho máy chơi (do hạn chế thời gian nên không cài đặt AI cho máy được)
  • Luật nộp Gà: Option. Khi bị Ăn, Người bị Ăn nộp 1 Chip vào Gà.
  • Khi Ù (Ù, Ù Tròn, Ù Khan): Người Ù được nhận toàn bộ số Chip trong Gà.
  • Luật được thiết kế để không phá hỏng tính đúng của Ván bài, tuy nhiên không ràng buộc quá chặt –>Người chơi có thể mắc sai sót (dẫn đến phải Đền) như vậy mới hấp dẫn và hay, giống thực tế
  • Một số luật bổ sung nhưng không phổ biến, sẽ được xem xét để cài đặt sau hoặc để dạng luật option của Ván.

.

Design

Do thời gian thực hiện dự án quá ngắn, nên phải theo phương pháp phát triển dự án Agile. Phần design sẽ được giảm thiểu tài liệu.

Hạn chế cài đặt các luật Option

.

Code

PHP
lock/sync
RESTful API
Flash
JavaMobile