INT3110: Phân tích thiết kế hướng đối tượng
Bài tập lớn #4

Trò chơi Oẳn-Tù-Tì - Phiên bản đầu tiên

Trong bài tập này, bạn sẽ thêm một "thuật toán thông minh" cho trò chơi Oẳn tù tì đã làm trong bài #3. Khi một người chơi trò chơi, lựa chọn của con người không thực sự ngẫu nhiên. (Giả sử rằng người chơi không chọn bằng cách thả xúc xắc). Nếu trong một ván, máy tính ghi lại chuỗi N lần uyn cuối cùng kèm theo lựa chọn của người chơi, nó có thể phát hiện ra đặc điểm (pattern) và từ đó cố đoán tiếp theo người sẽ ra cái gì. Ví dụ, với N=3, máy tính ghi lại được chuỗi uyn như sau (không theo thứ tự gì, lựa chọn của người được gạch chân):

SRP, PRS, RPR, PSR, SRP, SPS, PSS

Giả sử cặp cuối cùng là SR. Máy tính có thể đoán được rằng rất có khả năng người sẽ ra lá (Paper), vì các cụm SRP xuất hiện đến 2 lần trong tập mẫu nhỏ này. Do đó, máy tính sẽ chọn kéo (Scissors) để thắng được nước đi dự đoán của người trong lần uyn tiếp theo.

Các ván càng dài, các chuỗi nước đi mà máy tính ghi lại càng nhiều, người chơi càng khó thắng. Đây là một ví dụ rất thô sơ về Học máy (machine learning), một nhánh của ngành Trí tuệ nhân tạo.

Với bài tập này, mỗi lần khởi động lại ứng dụng, bạn có thể khởi tạo một bản lưu trữ mới cho các chuỗi nước đi. Hoặc bạn có thể lưu lại tại một file trên đĩa để "kinh nghiệm" của chương trình trò chơi được tích lũy dần với những ván mới.

Cài đặt

Như trong bài tập 3, khi chạy chương trình, số lần uyn trong mỗi trận được cho bởi một tham số dòng lệnh. Một tham số khác quy định máy tính sẽ chơi theo thuật toán ngẫu nhiên hay thuật toán thông minh.

Trước khi in ra nước đi của máy tính, chương trình cần in ra xem máy tính đã đoán người sẽ đi nước nào.

Hãy áp dụng các nguyên tắc thiết kế hướng đối tượng đã học để thiết kế cách ứng dụng lưu lại các chuỗi nước đi và cách chương trình tra cứu các chuỗi để đoán nước đi tiếp theo của người.

Cập nhật Đặc tả chức năng và đặc tả thiết kế

Khi làm bài tập này, các bạn có lẽ sẽ muốn sửa đặc tả chức năng và đặc tả thiết kế đã viết ở các bài tập trước. Khi sửa, hãy sửa thẳng vào bản cũ (do Git quản lý phiên bản), Git sẽ lưu lại lịch sử các thay đổi của bạn.

Nộp bài

Mã nguồn và tài liệu đặt tại repository có tên ooad_asg đã dùng cho các bài tập trước. Các thành viên trong nhóm nên cùng tham gia. Đánh giá đóng góp sẽ dựa trên các commit của từng thành viên trong nhóm.