BÁO CÁO THỰC TẬP TÌM HIỂU VỀ SILVERLIGHT và ỨNG DỤNG LẬP TRÌNHTRÌNH GAME cờ CARO trường kinh doanh và công nghệ Hà Nội

22 64 0
BÁO CÁO THỰC TẬP TÌM HIỂU VỀ SILVERLIGHT và ỨNG DỤNG LẬP TRÌNHTRÌNH GAME cờ CARO trường kinh doanh và công nghệ Hà Nội

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BÁO CÁO THỰC TẬP ĐỀ TÀI TÌM HIỂU VỀ SILVERLIGHT VÀ ỨNG DỤNG LẬP TRÌNH GAME CỜ CARO TRƯỜNG ĐẠI HỌC KINH DOANH VÀ CÔNG NGHỆ HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN HUBT LUẬN VĂN TỐT NGHIỆP. Bài báo cáo đẩy đủ cấu trúc của trường.

1 TRƯỜNG ĐẠI HỌC KINH DOANH VÀ CÔNG NGHỆ HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN *** BÁO CÁO THỰC TẬP ĐỀ TÀI: TÌM HIỂU VỀ SILVERLIGHT VÀ ỨNG DỤNG LẬP TRÌNH GAME CỜ CARO Sinh viên: Mã sinh viên: Lớp: Hà Nội, 2022 LỜI NÓI ĐẦU Lý chọn đề tài Tìm hiểu cơng nghệ hành trang tốt để chuẩn bị kiến thức cho em sau trường Silverlight công nghệ kết hợp nhiều công nghệ vào tảng phát triển, cho phép lựa chọn nhiều cơng cụ ngơn ngữ lập trình thích hợp để giải toán Silverlight đời giải vấn đề thường gặp ứng dụng web khả tương thích với trình duyệt hệ điều hành Silverlight cung cấp mơ hình lập trình lập trình mềm dẻo đồng Ứng dụng tạo giao diện thân thiện, hiệu ứng đẹp cho phần mềm trang web Hiện cờ caro trò chơi phổ biến giới học đường Từ nhu cầu giải trí đó, có nhiều hãng sản xuất trị chơi caro máy tính, giúp cho việc chơi cờ caro dễ dàng hơn, bạn đánh cờ với máy mà không cần người bạn thực Trên mục đích muốn đem trị chơi cờ caro đến với người, làm cho việc chơi cờ trở nên dễ dàng hơn, hỗ trợ cho bạn chơi với bạn bè, nhóm em chọn đề tài là: “Tìm hiểu silverlight lập trình game cờ caro” Đối tượng nghiên cứu  Công nghệ Silverlight, xaml  Chương trình chơi game caro  Công cụ xây dựng phần mềm: Visual Studio 2010, Microsoft Expression Blend 3 Giới hạn phạm vi nghiên cứu Tìm hiểu cơng nghệ Silverlight lập trình game caro Mục đích nghiên cứu  Xây dựng tài liệu giúp tìm hiểu cơng nghệ Silverlight  Xây dựng chương trình chơi game caro có sử dụng công nghệ Silverlight Nhiệm vụ nghiên cứu  Tìm hiểu cơng nghệ Silverlight ngơn ngữ XAML  Tìm hiều kiến thức cơng nghệ Silverlight để áp dụng vào xây dựng chương trình game caro Phương pháp nghiên cứu  Tìm hiểu hết tổng hợp kiến thức chung Silverlight, sau sâu vào kiến thức cụ thể để xây dựng giao diện ứng dụng cờ caro  Nghiên cứu công cụ Microsoft Expression Blend để dựa vào thiết kế giao diện cho trang web ứng dụng Ý nghĩa lý luận thực tiễn đề tài  Qua việc tìm hiểu giúp em biết thêm kiến thức cơng nghệ với nhiều tính trội so với cơng nghệ có Microsoft  Cơng nghệ Silverlight cho ta nhìn tổng quan thiết kế giao diện đẹp bóng bảy mà khơng địi hỏi phải sử dụng q nhiều cơng nghệ lúc tạo được, điều tạo nên sức mạnh Silverlight 4 Chương GIỚI THIỆU ĐỀ TÀI THỰC TẬP 1.1 Silverlight gì? a) Lý đời Silverlight • Các ứng dụng viết cho web thường gặp vấn đề khả tương thích với trình duyệt hệ điều hành • Các cơng nghệ plug-in web trước không cho phép truyền tải liệu hình ảnh chất lượng cao 720p HDTV b) Silverlight gì? • Silverlight dạng plug-in dựa cơng nghệ Microsoft Net • Nó độc lập với đa tảng đa trình duyệt • Nó cho phép phát triển ứng dụng đa phương tiện đặc biệt ứng dụng web • Silverlight cung cấp mơ hình lập trình lập trình mềm dẻo đồng nhất, hỗ trợ Ajax, Python, Ruby ngơn ngữ lập trình Net Visual basic, C# 1.1.1 Đặc điểm Silverlight kết hợp nhiều cơng nghệ vào tảng phát triển, cho phép bạn lựa chọn nhiều công cụ ngôn ngữ lập trình thích hợp để giải tốn bạn Silverlight cung cấp tính sau: Sự kết hợp WPF XAML Mở rộng cho ngơn ngữ kịch Sự tích hợp với ứng dụng có Sử dụng mơ hình ngơn ngữ lập trình tảng Net Framework công cụ để kết hợp Hỗ trợ mạng Hỗ trợ ngơn ngữ tích hợp truy vấn (LINQ) 1.1.2 Kiến trúc thành phần Về Silverlight tảng thống nhiều thành phần khác Dưới bảng thành phần silverlight Dưới hình ảnh mơ tả thành phần kiến trúc Silverlight với thành phần dịch vụ liên quan khác Core Presentation Components: (các thành phần chính) Các lập trình viên tương tác với thành phần tảng trình bày sở cách sử dụng XAML để đặc tả XAML yếu tố quan trọng việc tương tác Net Framwork kiểu trình bày Layout, ngồi lập trình viên sử dụng chế quản lý code bên để thao tác với lớp trình bày Net Frame work for Silverlight: 1.1.3 Mơ hình lập trình  Javascript API  Managed API 1.1.4 Cơng nghệ công cụ liên quan Silverlight Microsoft Expression Blend: Sử dụng cơng cụ bạn bạn tạo thay đổi cách xắp xếp trình bày Layer ứng dụng cách thao tác đến canvas control XAML, làm việc với chức đồ họa, Lập trình với ngơn ngữ Javascript Visual Studio 2008: Visual Studio cung cấp công cụ hiệu cho việc phát triển ứng dụng có hỗ trợ thao tác code bên tron Tất phiên có Visual Studio có khả hỗ trợ Silverlight,Tuy nhiên phiên cịn hỗ trợ tính đặc biệt bao gồm khả IntelliSense, debugging template cho việc tạo ứng dụng Silverlight ASP.NET AJAX: Bao gồm tập Control, Service, thư viện cần thiết cho việc tạo tương tác với ứng dụng web Microsoft ASP.NET 3.5 Extensions Preview: Công nghệ cung cấp chức thêm để việc tăng cường ứng dụng ASP.NET AJAX Nó bao gồm control sử dụng hữu ích cho việc xây dựng ứng dụng tảng silverlight phần ứng dụng ASP.NET: - ASP.NET MediaPlayer Server Control - ASP.NET Silverlight Server Control Internet servers: Bao gồm IIS (Microsoft Internet Information Services), Apache Web server Microsoft Windows Communication Foundation (WCF) services 1.2 Layout silverlight Khi xây dựng ứng dụng Silverlight, điều cần quan tâm việc bố trí giao diện đồ họa để developer tận dụng sức mạnh đồ họa Silverlight, trước hết cần phải biết đối tượng dành cho việc xếp, thiết kế thành phần UI Silverlight cung cấp cho ta kiểu bố trí khác là: Canvas, StackPanel Grid 1.2.1.Canvas Định nghĩa khu vực mà bạn vị trí đối tượng thành phần cách sử dụng tọa độ tham chiếu Bạn sử dụng lồng Canvas với thành phần bên Canvas phải UIElement Trong nhiều trường hợp Cancas đóng vài trị đối tượng để chứa đựng đối tượng khác khơng có thuộc tính hiển thị Canvas đối tượng layout cho phép định vị đối tượng dựa vào giá trị tọa độ tuyệt đối, thông qua thuộc tính sử dụng dạng Attached Property Canvas.Top Canvas.Left Trong trình gõ đoạn code Visual Studio để thử nghiệm, bạn gõ đến Canvas., công nghệ IntelliSense menu pop-up cho thấy thuộc tính dạng AttachedProperty Canvas Khi đó, bạn thấy thuộc tính ZIndex Tính chất thuộc tính giải vấn đề đối tượng Canvas che phủ lên (overlap) Nếu đối tượng có ZIndex khơng định nghĩa ZIndex đối tượng khai báo sau đè lên Tuy nhiên, đối tượng có giá trị thuộc tính ZIndex khác nhau, ZIndex đối tượng lớn giúp đối tượng ưu tiên xuất phía Ví dụ minh họa: hình chữ nhật cách trái 20pixel cách 53pixel Hình 2.1: sử dụng thẻ canvas 1.2.2 StackPanel - Sắp xếp thành phần bên thành dịng hiển thị theo hai kiểu ngang dọc - StackPanel hay dùng muốn xếp phần tồn trang - Gía trị mặc định gán cho thuộc tính Orientation chiều dọc(Vertical) giá trị mặc định xét cho hai thuộc tính HorizontalAlignment VerticalAlignment Stretch - Ví dụ: StackPanel xếp nút theo chiều ngang 10 Hình 2.2: StackPanel 11 Chương NỘI DUNG CÔNG VIỆC VÀ KIẾN THỨC THỰC HIỆN TRONG THỜI GIAN THỰC TẬP 2.1 Giới thiệu sơ lược trò chơi caro Cờ caro loại trò chơi phổ biến luật chơi đơn giản khơng địi hỏi nhiều cơng cụ chơi, bạn cần tờ giấy có kẻ bút đủ.Chính trị chơi lại phổ biến giới học sinh sinh viên Cờ caro trò chơi đối kháng người Gồm người chơi, đối thủ tìm cách dành chiến thắng trước đối thủ số hữu hạn nước đi, nước đuợc tạo dựa từ trạng thái trận đấu Nếu sau số giới hạn nước đi, chưa dành chiến thắng xem hồ Ngồi ra, thơng tin trận đấu hoàn toàn biết đuợc đối thủ Trị chơi có luật chơi đơn giản sau: đối thủ lượt chọn trống cịn lại bàn cờ (kẻ sẵn ô lưới ) cho tạo thành n liên tiếp để chiến thắng Nếu n = có tên khác Tic Tac Toe, trò chơi kết thúc có người đạt liền hàng ngang, hàng dọc đường chéo Nếu chơi kín bàn cờ khơng có đạt liền trị chơi kết thúc hồ Trị chơi cờ caro có nguồn gốc từ lâu, trò chơi mang tính quốc tế Ở nước khác trị chơi mang tên khác gắn với luật chơi đơn giản Ví dụ như: Nhật trị chơi có tên Gomoku, Gobang (Go tiếng Nhật có nghĩa 5, Gomoku có nghĩa điểm), Anh trị chơi có tên Connect 12 2.2 Giới thiệu sơ lược đề tài Xây dưng chương trình phục vụ chơi cờ caro với chức sau:  Chức Single Player: Chơi với máy tính, có phân mức độ dễ khó cho người chơi  Chức Multi Player: Chơi đa người dùng, chơi online: Chương trình hỗ trợ cho người mạng LAN để chơi 13 Chương KẾT QUẢ 3.1 Giải thuật chương trình Đây chương trình trị chơi mang tính trí tuệ nên phần giải thuật chương trình phần quan trọng Đánh giá chương trình trị chơi cờ hay hay khơng thơng qua giải thuật chương trình.Trong phần này, ta trình bày chi tiết giải thuật chương trình chơi cờ caro Giải thuật có phần chính:  Giải thuật xác định thắng thua cho ván cờ, giải thuật áp dụng cho chơi người chơi với máy nên dùng chung  Giải thuật tìm nước máy chơi với máy 3.1.1 Giải thuật xác định thắng thua cho ván cờ Giải thuật dựa chương trình caro cổ điển với luật chơi xác định người thắng người có liên tiếp nằm hàng ngang, hàng dọc đường chéo 3.1.2 Giải thuật tìm nước cho máy tính 3.1.2.1 Sơ lược giải thuật Trong trị chơi Caro, sau nước cờ, đối thủ chọn từ ô trống để Do đó, sau nước số trống cịn lại giảm Như vậy, việc tìm nước cho trạng thái có sẵn việc tìm kiếm trống cịn lại Đồng thời, khơng gian tìm kiếm thu hẹp theo số nước tạo Như vậy, để chọn nước từ trạng thái bàn cờ có sẵn, ta phải tìm kiếm nước Khơng gian chọn nước từ trạng thái ban đầu hữu hạn, không gian tìm kiếm nước dẫn đến chiến thắng 14 hữu hạn Nhưng rõ ràng số lượng phần tử hai không gian đuợc so sánh giống hạt cát sa mạc Do ta khơng thể vét khơng gian tìm kiếm nước mà ta phải giới hạn khơng gian tìm kiếm Một khơng gian tìm kiếm thực theo dạng đa phân bình thường Cấu trúc liệu định nghĩa, lúc đuợc gọi tìm kiếm, trị chơi, nút mức thể lựa chọn nước có sẵn Nếu số nút mức nhiều, tức có nhiều khả chọn lựa nước từ trạng thái trước, độ phân nhánhcủa lớn Dựa vào trị chơi định nghĩa trên, việc tìm kiếm nước chọn nút ( mức 1) cho nước tốt, đánh giá, theo thơng thường chơi, nước tốt hay không phụ thuộc vào khả dành chiến thắng cao hay thấp sau nước Do đó, muốn chọn nước tốt dựa vào cờ chưa đủ, mà phải biết thông tin cờ sau chọn nước để Ví dụ chơi trị Carơ, ta chọn nước vào để chận đuờng hở hai đầu đối thủ ta biết khơng nuớc thua nửa nước tiếp theo, tức trạng thái thua chưa biết đuợc sau chọn ô khác để xuất phát trạng thái Khái niệm độ sâu cung nảy sinh từ đây, đơn giản độ sâu khả "nhìn thấy trước" nước tốt sau loạt nước xuất phát từ , ví dụ từ trạng thái này, ta nhận biết đuợc sau thắng (tức bên con), độ sâu tính toán ta >= 6, Như vậy, Max depth thể khả trình độ người chơi cờ, ta chơi hay giá trị lớn Khi viết chương trình cho máy tính chơi cờ, tức máy tính phải tự tìm nước đưa vào trạng thái bàn cờ bất kì, khơng gian tìm kiếm q lớn (coi vơ hạn) nên giới hạn cho máy tính tìm kiếm đến độ sâu mà thơi , độ sâu tìm kiếm lớn thể 15 khả chương trình, cố gắng nâng cao giá trị cách cài đặt thêm tri thức cờ cho (Heuristic, Knowledge ) 3.1.2.2 Thuật tốn tìm kiếm trò chơi Một chiến lược thường người lẫn máy dùng phân tích cờ sau số nước hai bên Sau "nhìn xa" xem bàn cờ có khả biến đổi sau số nước, ta đánh giá độ xấu tốt cờ nhận Tiếp theo, ta chọn nước dẫn tới cờ tốt số có cân nhắc đến cách hai bên Với máy, cờ đánh giá tốt cờ nhờ so sánh điểm lượng giá trả lại Chúng ta có khả xét trước số hữu hạn nước (ví dụ đại kiện tướng chơi cờ vua xét trước 8-10 nước đi, người thường 2-4 nước đi) Rõ ràng xét sâu chơi giỏi Nhưng khơng thể thực điều với độ sâu lớn số nút độ sâu trở nên lớn khủng khiếp khơng đủ thời gian để phân tích Nếu dừng độ sâu hợp lý phân tích hồn thành việc tính tốn thời gian hạn định Thủ tục minimax Giả sử có phân tích cờ áp dụng tất luật, phương pháp đánh cờ khác vào cờ chuyển đổi chúng thành số đại diện (cho điểm cờ) Mặt khác, ta giả sử số dương áp dụng cho cờ đấu thủ (được gọi người chơi cực đại - maximizer), âm áp dụng cho đấu thủ bên (được gọi người chơi cực tiểu - minimizer) Q trình tính tốn cho điểm cờ gọi lượng giá tĩnh (static evaluation) Hàm thực việc tính tốn gọi lượng giá tĩnh, giá trị nhận gọi điểm lượng giá tĩnh Cả hai đấu thủ cố gắng để đạt điểm tuyệt đối lớn 16 Người chơi cực đại tìm nước dẫn đến điểm trở nên lớn (hay cao được) hay điểm đối thủ bớt âm (nhỏ giá trị tuyệt đối) Còn đấu thủ anh ta, người chơi cực tiểu, lại sức phản kháng lại, để dẫn tới điểm âm âm hay điểm dương đối thủ nhỏ Nói chung giải thuật minimax dành cho game đối kháng(2 người chơi) bao gồm phần: • Hàm phát sinh nước • Hàm đánh giá • Hàm tìm kiếm  Thuật tốn Minimax - Nếu đạt đến giới hạn tìm kiếm (đến tầng tìm kiếm), tính giá trị tĩnh cờ ứng với người chơi Ghi nhớ kết - Nếu mức xét người chơi cực tiểu, áp dụng thủ tục Minimax cho Ghi nhớ kết nhỏ - Nếu mức xét người chơi cực đại, áp dụng thủ tục Minimax cho - Ghi nhớ kết lớn  Viết chương trình cho thuật toán Minimax Bây giờ, ta thử dựa vào phát biểu để viết chương trình cho thuật tốn ngôn ngữ tựa Pascal Đây hàm có tên Minimax loại đệ qui Trước hết, để hàm biết đạt đến giới hạn tìm kiếm chưa, ta cần cung cấp cho tham số độ sâu tìm kiếm depth (để biết phải tìm đến đâu), đồng thời ta phải cho biết cờ pos để từ biết cách tính tiếp Giá trị trả hàm điểm cờ (bàn cờ) pos Mỗi Minimax gọi, gần đến giới hạn tìm kiếm, ta gọi hàm với độ sâu độ sâu cũ trừ Đạt đến độ sâu giới hạn 17 depth = Khi đạt độ sâu ta gọi hàm lượng giá Eval để đánh giá chất lượng cờ pos (thực điều thuật toán) Ở trên, Minimax gọi với độ sâu giảm Đó độ sâu cờ Các cờ pos' cờ tạo từ pos cách nước hợp lệ m Do ta phải có lệnh thực quân để đến cờ Để biết từ cờ pos nước nào, ta dùng thủ tục Gen có tham số cờ cha pos Thủ tục cất cờ pos' vào nhớ (dạng danh sách) Việc ta lấy cờ áp dụng tiếp thủ tục Minimax cho để tính điểm value Theo phát biểu thuật toán, ta thấy điều khác cách chọn kết tốt best phụ thuộc vào người chơi người chơi cực đại hay cực tiểu Cuối thuật tốn trả điểm tốt đạt Thơng thường tiện (và gần thực) ta coi hai người chơi (hai bên) có cách đánh giá cờ Có điều cờ tốt với người phải đánh giá tồi với người ngược lại Trong máy tính cách thể tốt ta cho điểm cờ có thêm dấu âm dương: dấu âm dành cho người chơi cực đại dấu âm cho người chơi cực tiểu Với người chơi cực đại mong muốn điểm dương tốt, người chơi cực tiểu lại mong muốn điểm âm tốt Do để dễ xử lí ta tuỳ theo mức người chơi mà đổi dấu giá trị đánh giá cờ pos Chú ý rằng, thay đổi độ sâu chuyển sang đối phương nên phải đổi dấu Cũng dùng hàm lượng giá nên đến lượt người chơi cực đại cực tiểu có nhìn cờ Điều dẫn đến dùng cách chọn nước tốt cho họ (gộp điều lại với 18 được) Giá trị best cần khởi đầu nhỏ để đảm bảo không vượt giá trị value, tốt giá trị -vô cùng: Thông thường, bàn cờ biểu diễn biến tồn cục Do thay cho truyền tham số bàn cờ pos vào thủ thục Minimax người ta biến đổi ln biến tồn cục nhờ thực nước "thử" (nước dẫn đến bàn cờ pos) Sau Minimax thực việc tính tốn dựa vào bàn cờ lưu biến tồn cục thuật tốn dùng số thủ tục để loại bỏ nước Như Minimax bỏ tham số pos sau:  Đánh giá thuật tốn Minimax Nếu hệ số nhánh trung bình b ta thực tìm kiếm đến độ sâu d số nút phải lượng giá đáy ta biết bd Đây số đo độ phức tạp thuật tốn Nếu b = 40, d = (các số thường gặp trị chơi cờ) số nút phải lượng giá 40^4 = 2560000 (trên triệu rưỡi nút) Cịn với b = 40, d = số nút phải lượng giá tăng 40 lần thành 40^5 = 102400000 (trên 102 triệu nút) Lưu ý: tồn ý tưởng thuật tốn dựa việc chuyển đổi cờ thành số để đánh giá Rất tiếc số thường không tốt không đủ để đánh giá hết điều Mặt khác, thuật tốn tốn (chạy chậm) việc sinh nước lượng giá tốn thời gian tính tốn, độ sâu trò chơi bị hạn chế nhiều Việc tỉa nhánh thuật toán AlphaBeta giúp để cải thiện tình hình Thuật tốn AlphaBeta Thuật tốn AlphaBeta nói chung giúp tiết kiệm nhiều thời gian so với Minimax mà đảm bảo kết tìm kiếm xác Tuy nhiên lượng tiết kiệm không ổn định - phụ thuộc vào số nút mà cắt bỏ Trong trường hợp xấu thuật tốn khơng cắt nhánh phải xét số 19 nút Minimax Ta cần đẩy mạnh việc cắt bỏ nhờ đẩy nhanh thu hẹp cửa sổ tìm kiếm alpha - beta Cửa sổ thu hẹp bước gặp giá trị tốt giá trị cũ Khi gặp giá trị tốt cửa sổ thu hẹp Do sớm gặp giá trị tốt cửa sổ chóng thu hẹp Như phải cho nút xếp theo trật tự từ cao xuống thấp Trật tự tốt thuật tốn chạy nhanh nhiêu (các công thức số nút phải lượng giá điều kiện lí tưởng tính với trật tự tốt nhất) KẾT LUẬN Kết đạt Qua q trình tìm hiểu nhóm em nắm số kiến thức công nghệ Silverlight áp dụng vào xây dựng chương trình chơi cờ caro với giao diện sinh động, đơn giản mà hấp dẫn Sau thời gian thực đề tài, chương trình hồn thành đạt số kết sau: • • Website chơi cờ caro có giao diện dễ nhìn, dễ sử dụng Trị chơi chơi người với người chơi với máy Hạn chế đề tài Website chưa xây dựng chưa có nhiều chức lưu lại ván cờ để lần sau chơi tiếp, hay vừa chơi vừa nghe nhạc web, thay đổi giao diện Hướng phát triển đề tài Với cố gắng, lỗ lực nhóm em cố gắng hồn thành u cầu đề tài Do thời gian lực có hạn nên website đáp ứng chơi cờ caro bình thường mà chưa có chức tiện ích khác 20 Hướng phát triển Website trở thành chương trình chơi cờ với đầy đủ chức có giao diện bắt mắt, dễ sử dụng Đề nghị ý kiến Trong thời gian thực đề tài nhóm đề tài khơng thể tránh khỏi thiếu sót, em mong nhận ý kiến đóng góp từ phía q Thầy Cơ bạn để nhóm hồn thiện 21 ... cứu Tìm hiểu cơng nghệ Silverlight lập trình game caro Mục đích nghiên cứu  Xây dựng tài liệu giúp tìm hiểu công nghệ Silverlight  Xây dựng chương trình chơi game caro có sử dụng cơng nghệ Silverlight. .. nghiên cứu  Tìm hiểu cơng nghệ Silverlight ngơn ngữ XAML  Tìm hiều kiến thức công nghệ Silverlight để áp dụng vào xây dựng chương trình game caro Phương pháp nghiên cứu  Tìm hiểu hết tổng... tài Tìm hiểu cơng nghệ hành trang tốt để chuẩn bị kiến thức cho em sau trường Silverlight công nghệ kết hợp nhiều công nghệ vào tảng phát triển, cho phép lựa chọn nhiều cơng cụ ngơn ngữ lập trình

Ngày đăng: 24/10/2022, 19:51

Tài liệu cùng người dùng

Tài liệu liên quan