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

Tram Ho

Để bổ sung logic ưu tiên chặn bước di chuyển thắng cuộc cho Computer thì chúng ta có thể tư duy ở cấp độ Imperative đó là sử dụng cấu trúc lệnh rẽ nhánh để lựa chọn giữa bước đi chặn USER_WIN và bước đi ưu tiên các ô tiềm năng trên bàn cờ; Hoặc cũng có thể quan sát Computer_Move từ cấp độ Procedural và thực hiện ghi đè bước đi chăn USER_WIN sau khi đã chọn ra một bước đi bằng logic ưu tiên ban đầu.

Tuy nhiên dù là chọn phương thức viết code nào thì chúng ta cũng sẽ cần phải tách logic lựa chọn bước đi về các procedure phụ hỗ trợ cho Get (Computer_Move, App_State);.

Ở đây mình sẽ chọn logic code ghi đè trạng thái của Computer_Move bởi các procedure có mức độ ưu tiên cao hơn và code sử dụng các procedure hỗ trợ tại Get (Computer_Move, App_State); trông sẽ như thế này.

Tức là đầu tiên Get_Prioritized; sẽ thực hiện logic chọn ô có nhiều tiềm năng nhất trên bàn cờ mà chúng ta đã có trước đó. Sau đó, Block_Direct_Winning; sẽ tiếp tục ghi đè Computer_Move nếu nhìn thấy một bước đi thắng cuộc của User ở lượt tiếp theo để ưu tiên việc chặn bước đi đó.

Logic xử lý chặn bước đi thắng cuộc của User ở đây chỉ đơn giản là chúng ta lặp qua các ô trống còn lại trên bàn cờ và lần lượt sử dụng từng giá trị này để tạo ra các trạng thái tiên đoán Foreseen User_Set; Sau đó kiểm tra các trạng thái tiên đoán của User_Set ở lượt đi tiếp theo để tìm ra trường hợp của bước đi thắng cuộc và sử dụng luôn bước đi đó cho Computer_Move để chặn lại.

Lưu ý nhỏ ở đây là phần tham số kết quả Computer_Move của Block_Direct_Winning; thì chúng ta cần sử dụng thêm từ khóa in so với Get_Prioritized; Lý do là vì từ khóa out sẽ không cho phép code bên trong procedure thực hiện thao tác đọc giá trị của Computer_Move trước khi code ở đây thực hiện một thao tác gán giá trị vào tham số này.

Như vậy là trong trường hợp chúng ta không tạo ra bước di chuyển kép thì Computer đã có thể giữ cân bằng kết quả ván cờ. Tuy nhiên, chúng ta vẫn cần phải thử chạy lại phần mềm để kiểm tra trường hợp User có khả năng tạo ra bước đi kép để xem Computer đang chọn thế nào.

Như vậy là ở bước di chuyển sau khi đã lấy các góc đối diện nhau thì Computer chưa thể nhìn ra bước đi thắng cuộc ở dạng Double_Threat. Lý do là bởi vì thao tác kiểm tra bước đi thắng cuộc của chúng ta vẫn đang dừng ở logic kiểm tra đường thẳng hoàn chỉnh nối các cạnh đối diện của bàn cờ.

[Procedural Programming + Ada] Bài 24 – Console Tic-Tac-Toe App (tiếp theo)

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo