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

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

0 0 27

Người đăng: Semi Dev

Theo Viblo Asia

Những dữ liệu trạng thái mà chúng ta cần quản lý trong phần model bao gồm các tập giá trị thể hiện các bước đi của UserComputer, và các ô trống còn lại trên bảng. Thêm vào đó, một loại dữ liệu trạng thái khác cũng rất cần thiết là Match_Status thể hiện trạng thái hiện tại của ván cờ là đang tiếp tục hay đã kết thúc với kết quả nào đó.

App_State

Để lưu trữ các tập giá trị thể hiện các bước đi đã thực hiện của UserComputer, và các ô trống còn lại trên bảng thì phù hợp nhất có lẽ là cấu trúc Set như đã biết trong Sub-Series về JavaScript. Bởi chúng ta sẽ có thể đảm bảo rằng ít nhất thì các giá trị trong mỗi Set sẽ không bị lặp lại và là duy nhất.

So với C thì thư viện tiêu chuẩn của Ada rộng hơn khá nhiều và có thêm các cấu trúc dữ liệu phổ biến trong chủ đề DSA, chỉ thiếu duy nhất Stack. Hiển nhiên với một vế with .. use thì chúng ta sẽ có thể sử dụng Set thay cho các Array tự định nghĩa để giải quyết tình huống.

Tuy nhiên, mục đích của mình khi tạo project này là luyện tập một chút về khả năng tự định nghĩa kiểu dữ liệu và sử dụng các công cụ tạo ràng buộc như subtypecontract; Vì vậy nên...

package App_Model is subtype Digit is Integer range 0 .. 9; type Digit_Array is array (1 .. 9) of Digit; type Status is (PLAYING, DRAW, USER_WIN, COMPUTER_WIN); type State is record Common_Set : Digit_Array; User_Set : Digit_Array; Computer_Set : Digit_Array; Match_Status : Status; end record;
end App_Model;

Chúng ta đang có định nghĩa trọng tâm là type State với các thành phần bao gồm:

  • Common_Set - Các ô trống còn lại trên bảng
  • User_Set - Các ô mà User đã đánh dấu
  • Computer_Set - Các ô mà Computer đã đánh dấu
  • Match_Status - Trạng thái hiện tại của ván cờ

Quy ước được sử dụng ở đây là các tập dữ liệu *_Set sẽ lưu các giá trị số học có ý nghĩa là 1 .. 9 biểu thị cho các ô trên bảng Tic-Tac-Toe. Và giá trị 0 được sử dụng làm giá trị vô nghĩa và không biểu thị cho ô nào trên bảng. Như vậy khởi điểm mỗi ván cờ chúng ta sẽ có Common_Set chứa đầy đủ các giá trị 1 .. 9, còn User_SetComputer_Set sẽ chứa các giá trị 0.

Kiểu trạng thái type Status thể hiện các trạng thái của ván cờ được liệt kê với tuần tự là: Đang Tiếp Diễn.. Kết Quả Hòa.. Người Dùng Thằng.. và Máy Tính thắng.

Init_App_State;

Khi khai báo một biến cục bộ App_State : State thì về căn bản là biến này đã được phân bổ một vùng bộ nhớ dành cho record với các trường dữ liệu chưa được khởi tạo giá trị có nghĩa. Vì vậy nên giống với thao tác Get_User_Symbol;, ở đây thao tác Init_App_State; như dự kiến lúc đầu có thể được định nghĩa với cú pháp sử dụng là procedure hoặc function:

-- procedure
Init (App_State); -- function
App_State := App_Model.Init;

Bạn có thể chọn phương thức phù hợp với phong cách tư duy của bạn. Còn ở đây thì mình chọn procedure để phù hợp với tinh thần của Sub-Series này.

package App_Model is -- subtype Digit is ... -- type State is ... procedure Init (App_State : out State);
end App_Model;
package body App_Model is procedure Init (App_State : out State) is -- local begin App_State := ( Common_Set => (1, 2, 3, 4, 5, 6, 7, 8, 9) , User_Set => (others => 0) , Computer_Set => (others => 0) , Match_Status => PLAYING ) ; -- App_State end Init; end App_Model;

Trong code sử dụng tại Main, chúng ta sẽ tạm thời thêm lệnh in thử App_State để kiểm tra hoạt động của Init (App_State);.

with Ada.Text_IO; use Ada.Text_IO;
with App_Model; use App_Model;
with Console_IO; use Console_IO; procedure Main is User_Symbol : Symbol; App_State : State;
begin Put_Symbol_Menu; Get (User_Symbol); Init (App_State); Put_Line (State'Image (App_State)); -- loop -- 3. Put_Number_Board -- 4. Get_User_Move -- 5. Update_Move_Sets -- 6. Update_Match_Status -- -- 7. Put_Number_Board -- 8. Get_Computer_Move -- 9. Update_Move_Sets -- 10. Update_Match_Status -- -- exit when App_State.Match_Status /= PLAYING; -- end loop
end Main;
Choose your Symbol ... 1. Letter 'X' 2. Letter 'O'
Your choice: 1
You've chosen: X (COMMON_SET => [ 1, 2, 3, 4, 5, 6, 7, 8, 9], USER_SET => [ 0, 0, 0, 0, 0, 0, 0, 0, 0], COMPUTER_SET => [ 0, 0, 0, 0, 0, 0, 0, 0, 0], MATCH_STATUS => PLAYING)

(chưa đăng tải) [Procedural Programming + Ada] Bài 19 - 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