Console Tic-Tac-Toe App (tiếp theo)

Tram Ho

Trong số các thủ tục được gọi ở lượt di chuyển của Computer thì chúng ta chỉ còn Get_Computer_Move;Update_Computer_Set; là các thủ tục mới. Tuy nhiên Update_Computer_Set; có logic tương đồng với Update_User_Set; vì vậy nên ở đây mình sẽ chỉ đặt code ví dụ và chúng ta sẽ chuyển qua nói về Get_Computer_Move; luôn.

Update_Computer_Set;

Khai báo Update_Computer_Set gắn kèm các contract để đảm bảo các *_Set sau thao tác cập nhật vẫn chứa nội dung bổ trợ lẫn nhau và không có ô cờ nào bị lặp.

Xóa tại Common_Set và thêm mới tại Computer_Set.

Get_Computer_Move;

Ở đây chúng ta cần xác định mục tiêu xây dựng cho code xử lý logic tính toán và tạo bước đi cho Computer. Hiển nhiên nếu chúng ta muốn tạo ra một logic tính toán linh động và tự nhiên gần giống với phương thức suy nghĩ của con người thì code triển khai sẽ cần thêm nhiều thao tác bổ trợ. Còn nếu chúng ta chỉ đặt ra mục tiêu là một logic tính toán để có được kết quả hòa và không cần thêm các yếu tố khác như chọn bước đi ngẫu nhiên thì code triển khai cũng không quá phức tạp.

Lựa chọn của mỗi người có lẽ sẽ khác nhau, tuy nhiên điểm chung vẫn là chúng ta sẽ xuất phát với các trường hợp tư duy logic đơn giản và phát triển dần để mở rộng các trường hợp cần xử lý trong code. Và để thuận tiện cho việc mở rộng logic tính toán hỗ trợ cho Get_Computer_Move; khi cần thiết thì chúng ta sẽ tạo thêm một package riêng cho procedure này và các sub-program hỗ trợ xoay quanh đó tên là AI_Mockup.

Trường hợp đơn giản nhất là các bước đi ở thế cân bằng ở thời điểm mở đầu ván cờ, chúng ta thường sẽ ưu tiên chọn các ô cờ quan trọng và có nhiều đường thẳng đi qua nhất. Như vậy giải pháp đơn giản là chúng ta có thể tạo ra một mảng liệt kê đầy đủ các ô trên bàn cờ nhưng được sắp xếp theo mức độ quan trọng gảm dần. Sau đó lặp qua mảng này và lấy ra từng phần tử để so sánh và kiểm tra sự có mặt trong Common_Set để chọn bước di chuyển hợp lệ.

Lúc này ở code sử dụng tại Main khi chúng ta nhúng thêm package AI_Mockup bằng lệnh use thì đã có sự trùng lặp về chữ ký signature của procedure Get (out Digit, in State);. Do đó nên chúng ta sẽ phải sửa lại lệnh gọi tên thủ tục Get ở lượt di chuyển của User thành dạng tham chiếu từ tên package để trình biên dịch có thể xác định được chính xác định nghĩa của mỗi procedure mà chúng ta sử dụng.

Bây giờ thì chúng ta đã có thể bỏ comment cấu trúc vòng lặp để đánh cờ với Computer cho đến khi ván cờ kết thúc. Để duy trì logic đơn giản ở thời điểm khởi đầu thì mình đã đặt tạm một vòng lặp dạng do .. while. Tuy nhiên logic dừng vòng lặp mà chúng ta cần ở đây lại yêu cầu sự linh động nhiều hơn một chút. Chúng ta sẽ cần kiểm tra ngay sau mỗi bước di chuyển của User hoặc Computer để đưa quyết định tiếp tục hoặc dừng vòng lặp dựa trên trạng thái của ván cờ Match_Status.

Như vậy là với logic đơn thuần là ưu tiên chọn các ô cờ có nhiều tiềm năng thì Computer vẫn còn vài bước đi nữa mới chạm tới các ô cờ ít tiềm năng. Và nếu User chọn một đường thẳng đi qua tâm bàn cờ thì kết quả của ván cờ sẽ mất quân bình, do chúng ta chưa tạo logic để ưu tiên việc chặn bước đi kết thúc đường thẳng Winning_Move.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo