- vừa được xem lúc

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

0 0 26

Người đăng: Semi Dev

Theo Viblo Asia

Như vậy là để Computer có thể cân bằng kết quả ván cờ thì chúng ta cần bổ sung thêm logic chặn bước đi tạo cơ hội kép của User. Trong trường hợp này thì procedure mới sẽ có mức độ ưu tiên thấp hơn so với Get_Prioritized;. Vì vậy nên ở code sử dụng tại Get (Computer_Move, App_State);, chúng ta sẽ đặt procedure mới bổ sung ở giữa Get_Prioritized;Block_Direct_Winning;.

with Ada.Text_IO; use Ada.Text_IO; package body AI_Mockup is procedure Get ( Computer_Move : out Digit ; App_State : in State ) is begin Get_Prioritized (Computer_Move, App_State); Block_Double_Threat (Computer_Move, App_State); Block_Direct_Winning (Computer_Move, App_State); -- Put_Line ("Computer move:" & Digit'Image (Computer_Move)); end Get; -- Get_Prior... end AI_Mockup;

Và để định nghĩa cho Computer về bước đi tạo cơ hội kép của User thì chúng ta vẫn sẽ thực hiện thao tác lặp để tạo ra các trạng thái tiên đoán của User_SetCommon_Set, sau đó dựa trên trạng thái tiên đoán này lại tiếp tục tính toán số lượng bước đi thắng cuộc ở lượt tiếp theo nữa.

Nếu như số lượng bước đi thắng cuộc ở lượt sau cùng nhiều hơn 1 thì có nghĩa là bước đi tiên đoán trước đó là một bước đi tạo Double_Threat, và chúng ta cần gán giá trị của bước đi tiên đoán này cho Computer_Move để chặn lại.

with Ada.Text_IO; use Ada.Text_IO; package body AI_Mockup is -- ... procedure Block_Double_Threat ( Computer_Move : in out Digit ; App_State : in State ) is -- local Foreseen_App_State : State; Foreseen_User_Move : Digit; begin for Index in App_State.Common_Set'Range loop Foreseen_User_Move := App_State.Common_Set (Index); if Foreseen_User_Move /= 0 then Copy (Foreseen_App_State, App_State); Update_User_Set (Foreseen_App_State, Foreseen_User_Move); if Count_Threat (Foreseen_App_State) > 1 then Computer_Move := Foreseen_User_Move; end if; end if; end loop; end Block_Double_Threat; function Count_Threat (App_State : State) return Integer is -- local Foreseen_User_Set : Digit_Array; Counter : Integer := 0; begin for Index in App_State.Common_Set'Range loop Foreseen_User_Set (1 .. 9) := App_State.User_Set; Foreseen_User_Set (Index) := App_State.Common_Set (Index); if Found_Winning (Foreseen_User_Set) then Counter := Counter + 1; end if; end loop; -- return Counter; end Count_Threat; end AI_Mockup;

Cuối cùng là chúng ta cần đảm bảo các procedure đều được khai báo đầy đủ trong tệp cấu hình của package AI_Mockup.

with App_Model; use App_Model; package AI_Mockup is procedure Get (Computer_Move : out Digit; App_State : in State); procedure Get_Prioritized (Computer_Move : out Digit; App_State : in State); procedure Block_Direct_Winning (Computer_Move : in out Digit; App_State : in State); procedure Block_Double_Threat (Computer_Move : in out Digit; App_State : in State); function Count_Threat (App_State : State) return Integer; end AI_Mockup;

Để xem Computer đã có thể cân bằng được kết quả ván cờ trong tình huống trước đó hay chưa.

Choose your Symbol ... 1. Letter 'X' 2. Letter 'O'
Your choice: 1
You've chosen: X + - - + - - + - - +
| 2 | 9 | 4 |
+ - - + - - + - - +
| 7 | 5 | 3 |
+ - - + - - + - - +
| 6 | 1 | 8 |
+ - - + - - + - - +
Your move: 6 PLAYING ...
+ - - + - - + - - +
| 2 | 9 | 4 |
+ - - + - - + - - +
| 7 | 5 | 3 |
+ - - + - - + - - +
| X | 1 | 8 |
+ - - + - - + - - +
Computer move: 5 PLAYING ...
+ - - + - - + - - +
| 2 | 9 | 4 |
+ - - + - - + - - +
| 7 | O | 3 |
+ - - + - - + - - +
| X | 1 | 8 |
+ - - + - - + - - +
Your move: 4 PLAYING ...
+ - - + - - + - - + + - - + - - + - - +
| 2 | 9 | X | => | | | X |
+ - - + - - + - - + + - - + - - + - - +
| 7 | O | 3 | => | | O | |
+ - - + - - + - - + + - - + - - + - - +
| X | 1 | 8 | => | X | | |
+ - - + - - + - - + + - - + - - + - - +
Computer move: ... PLAYING ...
+ - - + - - + - - +
| | | X |
+ - - + - - + - - +
| | O | |
+ - - + - - + - - +
| X | | O |
+ - - + - - + - - +

Oh... Như vậy là ở đây khi User: X chọn trước góc phía dưới bên trái và góc phía trên bên phải thì các góc còn lại vẫn đang để trống và đều là bước đi có thể tạo Double_Threat. Nếu vậy cho dù Computer có chặn bước đi nào thì cũng đều chưa thể cân bằng được kết quả ván cờ. Có lẽ là chúng ta vẫn cần bổ sung thêm một logic xử lý nữa có mức độ ưu tiên cao hơn so với Block_Double_Threat;.

[Functional Programming + Haskell] Bài 25 - Console Tic-Tac-Toe App (tiếp theo)

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 67

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 47

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 41

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 75

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 280

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 50