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

[Procedural Programming + Ada] Bài 27 - Console Tic-Tac-Toe App (kết thúc)

0 0 14

Người đăng: Semi Dev

Theo Viblo Asia

Và đây là code hoàn thiện của Redirect_User_Concern; giúp bổ sung logic điều hướng bước đi tiếp theo mà User phải tạm dừng ý định tạo Double_Threat để ngăn chặn Computer thắng sớm hơn. Bây giờ chúng ta đã có thể bỏ đi các dòng Put_Line in ra số lượng Count_Double_Threats và các tập giá trị tiên đoán.

with Ada.Text_IO; use Ada.Text_IO; package body AI_Mockup is procedure Redirect_User_Concern ( Computer_Move : in out Digit ; App_State : in State ) is -- local Foreseen_User_Moves : Digit_Array; -- Foreseen_Computer_Moves : Digit_Array; Foreseen_App_State : State; Computer_After_Next_Move: Digit := 0; begin if Count_Double_Threats (App_State) > 1 then Foreseen_User_Moves := (others => 0); Get_Double_Threats (Foreseen_User_Moves, App_State); -- Foreseen_Computer_Moves := (others => 0); Get_Direct_Chance_Inits (Foreseen_Computer_Moves, App_State); -- for Index in Foreseen_Computer_Moves'Range loop if Foreseen_Computer_Moves (Index) /= 0 then Copy (Foreseen_App_State, App_State); Update_Computer_Set (Foreseen_App_State, Foreseen_Computer_Moves (Index)); Get_Direct_Chance (Computer_After_Next_Move, Foreseen_App_State); -- if not Found (Computer_After_Next_Move, Foreseen_User_Moves) then Computer_Move := Foreseen_Computer_Moves (Index); end if; end if; end loop; end if; end Redirect_User_Concern; end AI_Mockup;

Bạn có thể chạy thử các trường hợp trước đó để kiểm tra hoạt động của logic mới bổ sung cho AI_Mockup.Get (Computer_Move, App_State);. Trên máy tính mình đang sử dụng thì kết quả khá ổn và chỉ hơi thiếu tự nhiên một chút bởi vì chúng ta chưa chia các tập kết quả tiềm năng ra để thực hiện lựa chọn ngẫu nhiên các bước đi có thể thực hiện. Tuy nhiên điều đó sẽ yêu cầu việc tái cấu trúc lại code kha khá thời gian và bạn nên cân nhắc sau khi đã đảm bảo rằng kết quả chạy thử hoàn toàn ổn.

Source Code : GitHub.IO

Mặc dù vẫn còn những tính năng khác nữa mà mình chưa tìm hiểu hết về ngôn ngữ Ada và môi trường phát triển của GNAT, tuy nhiên đây đã là điểm phù hợp để kết thúc Sub-Series này với mục đích chính là tìm hiểu về Procedural Programming trong môi trường phát triển được thiết kế đặc trưng cho mô hình lập trình này.

Cụ thể là trước khi chúng ta chuyển qua Sub-Series Functional Programming đã dự định trước đó thì mình muốn gạch đầu dòng lại một vài đặc trưng trong khía cạnh tư duy Procedural đã nghiệm thu được:

  1. Luôn phân biệt rất rõ các loại sub-program theo mục đích sử dụng. Các thủ tục procedure được sử dụng để tạo ra hiệu ứng biên side-effect có ảnh hưởng tới các dữ liệu trạng thái của môi trường bên ngoài. Các hàm function được sử dụng để hỗ trợ các thao tác tính toán cục bộ và sẽ không bao giờ tạo ra hiệu ứng biên side-effect như các procedure.
  2. Các thủ tục procedure được sử dụng chủ đạo và các hàm function chỉ mang tính tiện ích bổ trợ. Các procedure sẽ đóng vai trò điều khiển logic hoạt động chính của chương trình. Các function tiện ích được dùng để giảm thiểu số lượng biến cục bộ local cho các procedure và ở những vị trí yêu cầu cú pháp sử dụng ở dạng biểu thức trả về giá trị, ví dụ như các contract.
  3. Trọng tâm của một chương trình là các dữ liệu trạng thái State sẽ được tạo ra và lưu cố định ở vị trí nào đó mang tính chất toàn cục global hoặc nếu lưu cục bộ thì sẽ là biến local của các procedure quan trọng góp phần điều khiển logic xử lý chính của chương trình.
  4. Địa chỉ tham chiếu tới các bộ dữ liệu trạng thái State sẽ được chia sẻ giữa các sub-program, và các procedure sẽ đóng vai trò là các hành động khách quan xung quanh để lần lượt tạo ra các sự thay đổi trên State. Để dễ hình dung hơn thì các State sẽ đóng vai trò là các Cơ Sở Dữ Liệu Mini trong thời gian chương trình vận hành và sẽ được cập nhật thay đổi nội dung nhiều lần.
  5. Các yếu tố ràng buộc contract sẽ giúp ích rất nhiều cho các sub-program; Ví dụ như các chế độ hoạt động của các tham số in, out, in out sẽ giúp thông báo lỗi nếu như chúng ta viết code triển khai logic không phù hợp; Và các kiểu contract tự định nghĩa khác có thể được gắn liền với các sub-program để đảm bảo tính hợp lệ của dữ liệu input/output.

Và bây giờ thì chúng ta sẽ chuyển sang mô hình lập trình tiếp theo trong nhóm các mô hình lập trình phổ biến. Hy vọng là bạn vẫn còn nhớ các cú pháp của Elm và nền móng tư duy căn bản của Declarative. Nếu bạn đã quên thì hãy dành một chút thời gian đọc lướt qua các bài viết trước đó của Sub-Series [Declarative Programming + Elm]; Bởi vì ngôn ngữ mà chúng ta sẽ tìm hiểu và làm ví dụ cho Sub-Series tiếp theo có thể được xem là phiên bản đầy đủ hơn của Elm về các tính năng được hỗ trợ ở cấp độ cú pháp của ngôn ngữ.

(chưa đăng tải) [Functional Programming + Haskell] Bài 1 - Giới Thiệu Ngôn Ngữ Haskell

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