1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xd game cờ caro bằng c

30 3 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 1,48 MB

Nội dung

SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Mục lục Lời nói đầu Phần I : Khái quát ngôn ngữ C# I.1 Lập trình hướng đối tượng C# I.2 Những đặc điểm ngôn ngữ C# I.2.1 Các toán tử I.2.2 Các kiểu liệu: I.2.3 Các câu lệnh I.2.4 Cấu tạo chương trình C# .6 I.3 C# vấn đề nâng cao I.3.1 C# với sở liệu I.3.2 C# với Internet .8 Phần II: Đồ họa C# II.1 Giới thiệu GDI+ .9 II.2 Kiến trúc GDI+ II.2.1 Đồ họa Vector 2D 10 II.2.2 Hình ảnh 10 II.2.3 In ấn hiển thị font chữ 10 II.3 Kiến trúc lớp GDI+ 11 II.4 Một số điểm GDI+ 11 II.4.1 Bút vẽ Gradient 11 II.4.2 Đường cong Spline 12 II.4.3 Đối tượng đồ họa độc lập 12 II.4.4 Chức chuyển đổi đối tượng ma trận 12 II.4.5 Vùng ảnh co giãn 13 II.4.6 Đổ bóng Alpha 13 II.5 Thay đổi mơ hình lập trình 14 II.5.1 Ngữ cảnh thiết bị, Handles đối tượng đồ họa 14 II.5.2 Bút vẽ, bút phủ, đồ họa, hình ảnh Font chữ .15 II.6 Giới thiệu đối tượng đồ họa 15 II.6.1 Đồ họa Vector 15 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai II.6.2 Hình ảnh Metafile 16 II.6.3 Các loại hệ tọa độ .17 II.6.4 Các phép chuyển đổi .17 Phần III: Control C# 19 III.1.Giới thiệu control: .19 III.2 Giới thiệu container: 23 Phần IV: Thiết kế trị chơi cờ ca rơ 27 Phần V: Kết luận, nhận xét 30 Tài liệu tham khảo 30 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Lời nói đầu Cơng nghệ thông tin ngày trở thành phần thiếu sống ngày Sau phút lao động mệt mỏi, cần đến trò chơi giải trí đơn giản giúp thư giản tạo thoải mái Vì thế, đề án lần này, em thực đề tài xây dựng chương trình trị chơi đánh cờ ca rơ đơn giản có sử dụng đồ họa, vừa để giúp người giải trí lúc rảnh rỗi, đồng thời giúp em củng cố thêm kiến thức lập trình, đặc biệt đồ họa Trong đề tài gồm phần: Phần 1: Nêu khái quát ngôn ngữ C# Phần 2: Giới thiệu đồ họa C# Phần 3: Giới thiệu control C# Phần 4: Thiết kế trị chơi cờ ca rơ Phần 5: Kết luận, nhận xét SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Phần I: Khái quát ngôn ngữ C# Có thể coi ngơn ngữ lập trình C# ngơn ngữ lập trình đơn giản có khoảng 80 từ khố khoảng 12 kiểu liệu xây dựng sẵn ( built-in) nhiên hỗ trợ tất mơ hình lập trình : lập trình cấu trúc, lập trình hướng đối tượng lập trình hướng thành phần ( COM ) I.1 Lập trình hướng đối tượng C# C# ngơn ngữ hồn tồn hướng đối tượng Tính chất hướng đối tượng trình bày tóm tắt sau:  “Tất đối tượng” Trong C#, thực thể biểu diễn đối tượng, với thuộc tính, hành vi ( method ) thực thể Như vậy, thuộc tính hay method chắn phải thuộc đối tượng  Một chương trình ứng dụng bao gồm nhiều đối tượng Khi chúng muốn đối tượng thực công việc hay đối tượng muốn đối tượng thực công việc, hay đối tượng giao tiếp với cách gửi thông điệp Thơng điệp hiểu lời gọi hàm gọi method đối tượng làm việc  Mỗi đối tượng có vùng nhớ riêng  Mỗi đối tượng có kiểu liệu riêng, kiểu liệu định nghĩa class ( lớp )  Mỗi đối tượng có giao diện để giao tiếp với đối tượng khác phần liệu che giấu đối tượng khác Ngoài ra, C# cúng cho phép người lập trình thực hoạt động sử dụng lại liệu kế thừa, đa hình thái kết tập I.2 Những đặc điểm ngôn ngữ C# C# xây dựng từ ngôn ngữ tiền đặc biệt C C++ đặc điểm ngôn ngữ C# giống với ngôn ngữ C, C++ Trong phần này, chúng em trình bày vài đặc điểm C# I.2.1 Các toán tử SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Trong C# có tốn tử thơng thường sau:  Các tốn tử toán hạng: ++,- -, !,~  Các toán tử hai toán hạng: *, /, %, +,  Các toán tử gán: =, *=, /=, %=, +=, -=, =, &=, ^=, !=  Các toán tử quan hệ: , =, is, as, ==, !=  Các toán tử lơ- gíc: &, ^, !, &, |,  Các toán tử điều kiện: &&, ||, ?:  Toán tử sizeof xác định kích thước kiểu liệu Trong C# cho phép chồng toán tử định nghĩa toán tử theo qui tắc sau:  Toán tử toán hạng: type_of_x operation op(x)  Toán tử hai toán hạng: type_of_x,y operation op(x,y) Trong C# khơng cho phép định nghĩa lại tốn tử gán I.2.2 Các kiểu liệu: C# hỗ trợ hai loại kiểu liệu kiểu tham trị kiểu tham biến Kiểu tham trị bao gồm kiểu đơn giản char, int, float Kiểu tham biến gồm kiểu lớp, kiểu Interface, kiểu mảng hay nói cách khác tất đối tượng tham biễn Kiểu tham trị khác kiểu tham biến chỗ: biến tham trị lưa trữ trực tiếp liệu nó, trái lại biến tham biến lưa trữ trỏ trỏ tới đối tượng C# cung cấp tập kiểu định nghĩa trước hầu hết có C C++ Ngoài , C# lại đưa thêm vào kiểu boolean, string giống Pascal C# cho phép chuyển kiểu giống C C++ cho phép chuyển kiểu giống C C++ I.2.3 Các câu lệnh C# kế thừa hầu hết câu lệnh từ C C++, nhiên có vài bổ xung thay đổi đánh ý Chúng ta điểm qua câu lệnh sau:  Các lệnh gán nhãn lệnh goto: lệnh gắn nhẵn có nhãn đứng đằng trước Các lệnh goto nhảy đến nhãn thực thi câu lệnh gán nhãn  Lẹnh if: lệnh if chọn biểu thức để làm việc dựa giá trị biểu thức lơ- gic Một lệnh if có thêm lệnh else để thực thi câu lệnh khác giá trị biểu thức sai  Lệnh swich: lệnh switch thực thi lệnh phụ thuộc vào giá trị biểu thức cho trước  Các lệnh lặp: lệnh lặp C# bao gồm lệnh lặp while, – while, for C SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai  Lệnh lặp foreach ( giống VB): lệnh lặp foreach liệt kê thành phần tập hợp, thực thi câu lệnh cho thành phần tập hợp  Các lệnh throw, try, catch: lệnh phục vụ cho q trình quản lí lỗi thời gian chạy ( runtime – error ) gồm có phát lỗi ( throw ), cặp lệnh try – catch đón nhận lỗi đưa hành động xử lí lỗi I.2.4 Cấu tạo chương trình C# Nếu C, đơn vị chương trình lớn hàm ( modul), Java C++, đơn vị chương trình lớn lớp ( class) C#, đơn vị chương trình lớn khơng gian tên (namespace) Một chương trình C# chứa hay nhiều khơng gian tên, khơng gian tên chứa liệu chương trình, khơng gian tên cịn lại khơng gian tên chứa phần liệu chương trình khác khai báo với từ khoá using sử dụng phần thư viện, ví dụ : Namespace 1: namespace Microsoft.CSharp.Introduction { public class HelloMessage { public string GetMessage() { return "Hello, world"; } } } Namespace 2: using Microsoft.CSharp.Introduction; class Hello { static void Main() { HelloMessage m = new HelloMessage(); System.Console.WriteLine(m.GetMessage()); } } Trong namespace lồng hay nhiều namespace khác, ví dụ: namespace Microsoft { namespace CSharp { namespace Introduction { } } } Dưới namespace đơn vị chương trình coi cấp : lớp (class), cấu trúc (struct), giao diện (Interface)  Lớp: lớp dùng để định nghĩa kiểu đối tượng Trong lớp có số, trường, SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai phương thức, thuộc tính, kiện, tốn tử, hàm dựng, hàm huỷ Đối với thành phần lớp có thuộc tính truy cập sau: - public: tất đối tượng khác truy cập đến thành phần - protected: đối tượng kế thừa từ đối tượng truy cập vào thành phần protected lớp cha - Internal: đối tượng định nghĩa assembly ( file định nghĩa chúng nằm assembly) truy cập thành phần Internal Những thành phần Internal thành phần khơng khai báo thuộc tính truy cập - Private: thành phần truy cập từ thành phần lớp  Cấu trúc ( struct): xây dựng loại struct nằm lớp nằm namespace nên coi đơn vị chương trình ngang với class Struct giống với class có biến liệu thành phần với thuộc tính truy cập chúng, hàm khởi tạo Tuy nhiên struct lại liệu kiểu tham trị class liệu kiểu tham biến, struct không cho phép kế thừa  Giao diện ( Interface ): ngôn ngữ C++ cho phép đa thừa kế, từ sinh nhập nhằng, rắc rối truy cập thành phần lớp cha Trong C# không cho phép thực đa thừa kế từ nhiều lớp Tuy nhiên để thực đa thừa kế, C# tạo đơn vị chương trình Interface, thay khai báo thừa kế từ nhiều lớp, khai báo thừa kế từ lớp thực thi nhiều Interface Qua đó, thực đa kế thừa Một Interface chứa phương thức, thuộc tính, kiện…, ví dụ: interface IExample { string this[int index] { get; set; } event EventHandler E; void F(int value); string P { get; set; } } public delegate void EventHandler(object sender, Event e); Mọi ứng dụng C# có hàm main Hàm main điểm vào chương trình (entry point), chương trình hàm main kết thúc Trong hàm main khởi tạo đối tượng ( lập trình giao diện Windows) hay gọi hàm khác thực thi ( lập trình Console ) Hàm main phải static xây dựng lớp, trả lại giá trị Int hay không trả giá trị SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai I.3 C# vấn đề nâng cao I.3.1 C# với sở liệu C# cho phép thao tác thuận tiện với loại sở liệu SQL Server 2000, MS access, Oracle,… thư viện lớp ADO.NET ADO.NET phiên chiến lược truy cập sở liệu vạn Microsoft Thư viện lớp ADO.NET chia thành loại lớp kết nối lớp khơng kết nối Lớp kết nối trình điều khiển kết nối sở liệu (Data Provider) cụ thể, có nghĩa phải sử dụng NET Data Provider mà chúng hỗ trợ sở liệu cần làm việc Trong lớp khơng kết nối sử dụng NET data Provider Khi cần thiết phải truy cập, xử lí liệu nguồn với thao tác select, insert, delete, update phải sử dụng lớp kết nối, ngược lại thao tác liệu tạm thời dùng lớp không kết nối Loại lớp kết nối gồm lớp sau:  Connection: Lớp kết nối sở liệu  DataAdapter: Lớp chứa liệu  Command: lớp chứa lệnh  DataReader: Lớp đọc liệu Loại lớp không kết nối gồm lớp sau:  Lớp DataSet: DataSet nắm giữ Tables Relations  Lớp DataTable: DataTable nắm giữ Rows, Column  Lớp DataView: DataView tạo nên view cho liệu I.3.2 C# với Internet Từ năm 90, giới lập trình có thay đổi từ lập trình ứng dụng máy riêng lẻ chuyển sang lập trình ứng dụng Internet Các chương trình ứng dụng Web có ưu điểm : chi phí thấp, truy cập thuận tiện từ nơi khác nhau…Đối với site tĩnh (static site) dù đơn giản cần phải lập trình để quản lí Web Form Lớp HttpHandler cung cấp phương thức đơn giản, rõ ràng để quản lí Web Form Đối với site động (Dynamic site), ASP.NET thư viện hoàn hảo để tạo trang Web có nội dung thay đổi theo thời gian đặc biệt thương mại điện tử Đối với mạng ngang hàng Peer-To-Peer, C# có cơng cụ mạnh để tạo nên hệ thống mạng ngang hàng có khả chia sẻ tài nguyên SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Phần II: Đồ họa C# Đồ họa phần thiếu ngôn ngữ lập trỡnh công cụ phát triển thời đại giao diện đồ họa người sử dụng phát triển mạnh Thực tế giao diện đẹp thân thiện đóng góp phần không nhỏ thành công phần mềm Trong phần khảo sát công cụ đồ họa GDI+ C# tổng quát môi trường phát triển ứng dụng NET II.1 Giới thiệu GDI+ GDI+ phân hệ hệ điều hành MS Windows XP cung cấp tính dựng hỡnh 2D đồ họa vector, xử lý hỡnh ảnh Đúng tên hàm ý, GDI+ phiờn cải tiến GDI (thế hệ giao diện thiết bị đồ họa trước Windows) Nó chịu trách nhiệm hiển thị dựng hỡnh trờn hỡnh, mỏy in GDI+ trang bị thêm nhiều tính tối ưu tính sẵn có GDI+ cho phộp lập trỡnh viờn viết mó độc lập ứng dụng Điều có nghĩa lập trỡnh viờn việc viết mó để hiển thị thơng tin mà không cần quan tâm đến thiết bị hiển thị cụ thể bên Người lập trỡnh việc gọi cỏc hàm cung cấp cỏc lớp GDI+ cỏc hàm đến lượt chúng chịu trách nhiệm giao tiếp với driver thiết bị cụ thể GDI cách ly ứng dụng khỏi phần cứng cho phép lập trỡnh viờn viết mó độc lập thiết bị Các lớp quản lý GDI+ phần kiến trỳc Microsoft NET, mụi trường để xây dựng, phân phối chạy dịch vụ Web XML ứng dụng khác II.2 Kiến trúc GDI+ Các dịch vụ GDI+ chia thành lớp rộng sau:  Hình học vector 2D SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai  Hình ảnh  Typography Sau xem xét lớp này: II.2.1 Đồ họa Vector 2D Đồ họa vector liên quan đến việc vẽ thực thể đồ họa sở đường thẳng, đường cong hay khối hỡnh cho tập hợp điểm hệ tọa độ Ví dụ, đường thẳng xác định điểm cuối nó, hỡnh chữ nhật cú thể xác định cách điểm xác định đỉnh trái cặp số xác định chiều cao chiều rộng Một đồ thị đơn giản xác định mảng điểm nối với đường thẳng đường Bézier spline đường cong tinh vi xác định điểm điều khiển GDI+ cung cấp lớp cấu trúc lưu trữ thông tin thực thể sở, lớp lưu trữ thông tin cách thức mà thực thể dựng lớp chịu trách nhiệm hiển thị hỡnh ảnh lờn thiết bị Vớ dụ, cấu trỳc Rectangle lưu trữ thông tin vị trí kích cỡ hỡnh chữ nhật; lớp Pen lưu trữ thông tin màu sắc, độ rộng đường thẳng kiểu đường thẳng; Cũn lớp Graphics cú cỏc phương thức cho dựng đường thẳng, hỡnh chữ nhật, đồ thị hỡnh hỡnh học khỏc Cũn cú thờm vài lớp Brush lưu trữ thông tin cách thức mà hỡnh tô màu Ta cú thể ghi lại hỡnh ảnh vector (thực chất chuỗi cỏc lệnh dựng hỡnh) metafile GDI+ cung cấp lớp Metafile để ghi lại, hiển thị lưu metafile Các lớp MetafileHeader MetaHeader cho phép ta lưu trữ thông tin phần header metafile II.2.2 Hình ảnh Cú số loại hỡnh ảnh cú thể khó khơng thể hiển thị với kỹ thuật đồ họa vector Ví dụ, hỡnh ảnh trờn cụng cụ cỏc hỡnh icon cú thể khú mụ tả tập cỏc đường thẳng đường cong Một ảnh độ phân giải cao chí cũn khú tạo với ký thuật đồ họa vector Các hỡnh ảnh dạng lưu trữ dạng ảnh bitmap (một dóy cỏc số biểu diễn màu sắc điểm hỡnh GDI+ cung cấp lớp Bitmap để xử lý, hiển thị lưu ảnh bitmap II.2.3 In ấn hiển thị font chữ 10 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Lớp Graphics GDI+ cung cấp phương thức để vẽ đối tượng DrawLine, DrawRectangle, DrawEllipse, DrawPolygon, DrawArc, DrawCurve DrawBezier DrawBezier Mỗi phương thức overload để nhận vài danh sách tham số Tất phương thức làm việc kết hợp với đối tượng bút vẽ Pen Để vẽ thứ gỡ ta phải tạo ớt đối tượng: đối tượng Graphics đối tượng Pen Đối tượng Pen lưu trữ thông tin thuộc tính độ rộng đường màu sắc cho hỡnh vẽ II.6.2 Hình ảnh Metafile Lớp Image lớp sở trừu tượng cung cấp phương thức làm việc với ảnh raster (dạng ảnh bitmap) ảnh vector Các lớp Bitmap Metafile kế thừa lớp Image Lớp Bitmap mở rộng khả lớp Image cách cung cấp thêm phương thức cho tải, lưu giữ xử lý cỏc ảnh raster Lớp Metafile mở rộng thờm khả ghi lại hỡnh ảnh vector GDI+ cung cấp lớp Metafile để ta ghi lại hiển thị metafile Một metafile cũn gọi hỡnh ảnh vector hỡnh ảnh lưu lại chuỗi lệnh vẽ Những lệnh vẽ lưu đối tượng Metafile lưu nhớ hay lưu file đối tượng stream GDI+ hiển thị metafile lưu định dạng sau:  Windows Metafile (WMF)  Enhanced Metafile (EMF)  EMF+ GDI+ ghi lại metafile định dạng EMF EMF+ không định dạng WMF EMF phần mở rộng GDI+ cho phép GDI+ ghi lưu lại Chỉ có biến đổi với định dạng EMF: EMF+ đơn EMF+ kép EMF+ đơn chứa ghi GDI+ Các metafile hiển thị GDI+ khơng phải GDI EMF+ kép có chứa ghi GDI+ GDI Mỗi ghi GDI+ lưu EMF+ metafile cặp với ghi thay GDI Mỗi metafile hiển thị GDI+ hay GDI Ví dụ sau hiển thị metafile lưu trước dạng file Metafile hiển thị với góc điểm (100,100) public void Example_DisplayMetafile(PaintEventArgs e) { Graphics myGraphics = e.Graphics; Metafile myMetafile = new Metafile("SampleMetafile.emf"); 16 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai myGraphics.DrawImage(myMetafile, 100, 100); } II.6.3 Các loại hệ tọa độ GDI+ dùng loại hệ tọa độ không gian: giới thực, trang thiết bị Khi ta có lời gọi đến hàm myGraphics.DrawLine(myPen, 0, 0, 160, 80) điểm mà ta truyền cho phương thức DrawLine – (0,0) (160,80) hệ tọa độ thực Trước GDI+ vẽ đường thẳng lên hỡnh, hệ tọa độ trải qua dóy cỏc biến đổi phép chuyển đổi chuyểntọa độ thực tọa độ trang phép chuyển đổi khác chuyển hệ tọa độ trang thành hệ tọa độ thiết bị Chẳng hạn ta muốn làm việc với hệ thống tọa độ có điểm nằm vùng client thay vỡ gúc trỏi trờn, vớ dụ pixel 100 từ cạnh trái vùng client 50 pixel từ đỉnh vùng client Hỡnh sau minh họa hệ tọa độ kết gọi hàm myGraphics.DrawLine(myPen, 0, 0, 160, 80): Hình Dịch chuyển hệ toạ độ Phép chuyển đổi thực việc ánh xạ hệ tọa độ thực vào hệ tọa độ trang gọi phép chuyển đổi hệ tọa độ thực lưu thuộc tính Transform lớp Graphics Phép chuyển đổi thực việc ánh xạ tọa độ trang vào hệ tọa độ thiết bị gọi phép chuyển đổi trang Lớp Graphics cung cấp thuộc tính PageUnit PageScale để xử lý chuyển đổi trang Lớp cung cấp thuộc tính DpiX DpiY để xác định độ phân giải điểm ảnh dọc ngang thiết bị hiển thị II.6.4 Các phép chuyển đổi Một phép chuyển đổi tổng thể phép chuyển đổi áp dụng lên tất đối tượng vẽ đối tượng Graphics Để thực phép chuyển đổi ta tạo đối tượng Graphics, thao tác với thuộc tính Transform Thuộc tính Transform đối tượng ma trận, lưu giữ số lượng dóy cỏc phộp biến đổi Affine Phép chuyển đổi lưu thuộc tính Transform gọi phép chuyển đổi hệ tọa độ giới thực Lớp Graphics cung cấp vài phương thức để tổng hợp phép biến đổi phức tạp: 17 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai MultiplyTransform, RotateTransform, ScaleTransform, TranslateTransform Sau ví dụ phép chuyển đổi này: myGraphics.DrawEllipse(myPen, 0, 0, 100, 50); myGraphics.ScaleTransform(1, 0.5f); myGraphics.TranslateTransform(50, 0, MatrixOrder.Append); myGraphics.RotateTransform(30, MatrixOrder.Append); myGraphics.DrawEllipse(myPen, 0, 0, 100, 50); Một phép chuyển đổi cục phép biến đổi áp dụng cho đối tượng cụ thể Đối tượng Graphics cho phép tạo ảnh đồ họa áp dụng phép chuyển đổi lên Ví dụ: Matrix myMatrix = new Matrix(); myMatrix.Rotate(45); myGraphicsPath.Transform(myMatrix); myGraphics.DrawRectangle(myPen, 10, 10, 100, 50); myGraphics.DrawPath(myPen, myGraphicsPath); 18 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai Phần III: Control C# III.1.Giới thiệu control: - Khái niệm control  Control thành phần Form  Có thành phần: o Thuộc tính o Phương thức o Sự kiện  Tất control chứa namespace: System.Windowns.Forms Một số control thường dùng: 19 SV: Nguyên Đức Mạnh MSV: 11122485 Đề tài: XD game cờ caro C# GVHD: Nguyễn Quỳnh Mai - Thuộc tính control o Size: xác nhận kích thước control o TabIndex: thứ tự control nhận focus o Mặc định VS.NET thiết lập 20

Ngày đăng: 07/09/2023, 14:54

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w