Thực hiện nhiệm vụ học tập của nhà trường trong đợt thực tập tốt nghiệp, được sự đồng ý của ban lãnh đạo Khoa Viễn Thông 1 và các giảng viên hướng dẫn. Bám sát đề cương của Khoa đưa ra, những lý luận và kiến thức đã học. Trong quá trình thực tập tại Trung tâm Nghiên cứu và Phát triển Samsung Việt Nam (SRV), em đã được trau dồi thêm kiến thức về ngành viễn thông nói chung, mảng lập trình nói riêng cũng như cơ cấu và tình hình hoạt động của công ty nơi em được thực tập. Được sự tận tình giúp đỡ hướng dẫn của các giảng viên Khoa Viễn Thông 1 cùng với giáo viên hướng dẫn thực tập tại công ty và nỗ lực học tập, tìm tòi học hỏi, em đã hoàn thành báo cáo thực tập tốt nghiệp của mình. Báo cáo này gồm 2 phần chính: Phần I: Giới thiệu về đơn vị thực tập Phần II: Nội dung thực tập
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA VIỄN THÔNG I BÁO CÁO THỰC TẬP TỐT NGHIỆP Hà Nội 08/2023 LỜI MỞ ĐẦU Kính thưa Ban lãnh đạo Học Viện Khoa Viễn Thông Thực nhiệm vụ học tập nhà trường đợt thực tập tốt nghiệp, đồng ý ban lãnh đạo Khoa Viễn Thông giảng viên hướng dẫn Bám sát đề cương Khoa đưa ra, lý luận kiến thức học Trong trình thực tập Trung tâm Nghiên cứu Phát triển Samsung Việt Nam (SRV), em trau dồi thêm kiến thức ngành viễn thơng nói chung, mảng lập trình nói riêng cấu tình hình hoạt động công ty nơi em thực tập Được tận tình giúp đỡ hướng dẫn giảng viên Khoa Viễn Thông với giáo viên hướng dẫn thực tập công ty nỗ lực học tập, tìm tịi học hỏi, em hồn thành báo cáo thực tập tốt nghiệp Báo cáo gồm phần chính: Phần I: Giới thiệu đơn vị thực tập Phần II: Nội dung thực tập Trong trình thực báo cáo, cố gắng em cịn hạn chế thời gian tìm hiểu, kiến thức kinh nghiệm cịn nhiều sai sót Em mong nhận ý kiến đóng góp nhận xét để em hồn thiện LỜI CẢM ƠN Để hoàn thành báo cáo thực tập tốt nghiệp em xin cảm ơn tới phía ban lãnh đạo Trung tâm Nghiên cứu Phát triển Samsung Việt Nam (SRV) tạo điều kiện cho em thực tập Ngoài ra, em cảm ơn anh hướng dẫn ln nhiệt tình dẫn, giảng dạy cho em kiến thức lập trình để em hồn thiện Em xin gửi lời cảm ơn tới ban lãnh đạo Học Viện, Khoa Viễn Thông thiết lập khung chương trình có mơn học “Thực tập” để em vận dụng kiến thức học giảng đường áp dụng vào cơng việc tham quan, tìm hiểu môi trường doanh nghiệp Em xin gửi lời cảm ơn sâu sắc chân thành tới giảng viên hướng dẫn Lê Thanh Thủy Cơ ln dìu dắt, giúp đỡ bảo tận tình cho em để hoàn thành tốt Thực tập Em xin chân thành cảm ơn! Hà Nội, ngày 22 tháng 08 năm 2023 MỤC LỤC DANH MỤC TỪ VIẾT TẮT DANH MỤC HÌNH VẼ Chương 1: Tổng quan đơn vị thực tập I Giới thiệu đơn vị thực tập II Lĩnh vực hoạt động Chương 2: Nội dung thực tập I Đào tạo kĩ giải thuật 1.1 Thuật toán thành phần thuật toán 1.2 Cấu trúc liệu sơ cấp: mảng, chuỗi, ngăn xếp, hàng đợi 1.2.1: Mảng 1.2.2: Chuỗi 1.2.3: Ngăn xếp 1.2.4: Hàng đợi (Queue) 1.3: Hướng dẫn gỡ lỗi triển khai thuật toán 10 II Đào tạo kỹ giải thuật lập trình 11 2.1: Giới thiệu đồ thị: Đồ thị vơ hướng, đồ thị có trọng số 11 2.2: Thuật toán Dijsktra 12 2.3: Thuật toán Depth-First Search 12 2.4: Thuật toán Breadth-First Search 13 2.5: Thuật toán quay lui 14 III Đào tạo kĩ sử dụng Office 15 IV Xây dựng dự án game ngôn ngữ C++ 18 4.1: Tìm hiểu hướng đối tượng C++ 18 4.1.1: Các tính chất 18 4.2: Xây dựng game xếp hình 29 4.2.1: Giới thiệu game 29 4.2.2: Lập trình game xếp hình 30 V Kết luận 32 DANH MỤC TỪ VIẾT TẮT Từ viết tắt Viết đầy đủ Giải thích nghĩa Input/Output Đầu vào/Đầu MVC Model - View - Controller Mơ hình - Quan sát - Điều khiển RAII Resource Acquisition Is Initialization Thu hồi tài nguyên khởi tạo SFML Simple and Fast Multimedia Library Thư viện Đa phương tiện nhanh đơn giản I/O STL SVMC UML Standard Template Library Thư viện mẫu chuẩn SamsungVietnam Researching and Developing Center Trung tâm Nghiên Cứu Phát triển Điện thoại di động Samsung Việt Nam Unified Modeling Language Ngơn ngữ mơ hình hóa thống DANH MỤC HÌNH VẼ Hình Tính đóng gói (Encapsulation) 18 Hình Thiết kế lớp với hai thuộc tính private 19 Hình Thiết kế lớp với thuộc tính private 19 Hình Tính kế thừa (Inheritance) 20 Hình Đa hình với nạp chồng phương thức 21 Hình Ví dụ thiết kế lớp Employee 21 Hình Thiết kế lớp Manager ghi đè lại phương thức lớp Employee 22 Hình Hàm makeSound() trả kết khác với đối tượng khác 23 Hình Đa hình thơng qua đối tượng đa hình 24 Hình 10 Cấp phát động nhớ thông thường 25 Hình 11 Sử dụng RAII để tránh memory leak 26 Hình 12 Ví dụ Singleton 26 Hình 13 Sơ đồ đơn giản Observer 27 Hình 14 Sơ đồ MVC 28 Hình 15 Cách tạo thread 29 Chương 1: Tổng quan đơn vị thực tập I Giới thiệu đơn vị thực tập • • • • Tên đơn vị: Trung tâm nghiên cứu phát triển Samsung Việt Nam Tên tiếng Anh: Samsung Research and Development Center Vietnam Tên viết tắt: SRV Địa chỉ: Tịa Samsung, Khu thị Tây Hồ Tây, đường Hoàng Minh Thảo, phường Xuân Tảo, quận Bắc Từ Liêm, Hà Nội, Bắc Từ Liêm, Bắc Từ Liêm SRV Trung tâm Nghiên cứu Phát triển Điện lớn Tập đồn Samsung khu vực Đơng Nam Á SRV khoản đầu tư dự án quan trọng Tổ hợp Samsung Việt Nam SRV thức vào hoạt động từ tháng 2/2012 Hoạt động kinh doanh SRV bao gồm loạt Nghiên cứu Phát triển Phần mềm, Phần cứng cho sản phẩm khác điện thoại thông minh, máy tính bảng, đồng hồ thơng minh II Lĩnh vực hoạt động SRV hoạt động lĩnh vực bao gồm: • Phát triển phần mềm thương mại hóa cho thiết bị thơng minh Samsung nhằm đáp ứng tốt nhu cầu khắt khe từ thị trường cung cấp gói phần mềm tuyệt vời cho khu vực • Nghiên cứu phát triển giải pháp phần mềm tiên tiến, dịch vụ đại cho người tiêu dùng, doanh nghiệp nước toàn cầu với mục tiêu trở thành nhà cung cấp dịch vụ phần mềm hàng đầu giới • Đánh giá đảm bảo chất lượng tuyệt vời gói phần mềm mạng, máy chủ cho hệ thống mạng 4G/5G cho người tiêu dùng tồn cầu thơng qua cơng cụ tự động hóa thơng minh • Phát triển thiết kế phần cứng, khí cho tất thiết bị, sản phẩm chủ lực Samsung hỗ trợ quy trình sản xuất phần cứng chuyên dụng nhà máy SEV/T Việt Nam Chương 2: Nội dung thực tập I Đào tạo kĩ giải thuật 1.1 Thuật toán thành phần thuật toán Thuật toán tập hợp công việc thực theo thứ tự định để giải toán số bước từ trạng thái đầu vào ban đầu trạng thái đầu kết mong muốn - Các thành phần thuật toán bao gồm: Đầu vào (Input): Đây liệu mà thuật tốn cần để thực cơng việc Dữ liệu số, văn bản, hình ảnh, dạng liệu liên quan đến vấn đề cần giải Đầu (Output): Đây kết mà thuật toán tạo sau hồn thành q trình xử lý Đầu thường liên quan trực tiếp đến mục tiêu mà thuật toán cố gắng đạt Bước xử lý (Processing Steps): Đây chuỗi bước cụ thể logic mà thuật toán thực liệu đầu vào để tạo kết mong muốn Các bước bao gồm phép tốn số học, so sánh, lặp lại, thao tác khác liên quan đến loại vấn đề cụ thể Lưu trữ (Memory/Storage): Một thuật tốn sử dụng nhớ để lưu trữ tạm thời giá trị trung gian liệu quan trọng trình xử lý Điều cần thiết để thực phép toán liệu để kiểm soát trình lặp lại Điều kiện (Conditions): Thuật tốn phải thực định dựa điều kiện tiêu chí cụ thể Các điều kiện định liệu thuật tốn có thực bước định hay không, chọn đường xử lý khác Lặp lại (Iteration/Loops): Trong số trường hợp, thuật toán cần thực chuỗi bước xử lý lặp lại nhiều lần Điều thường thực thơng qua vịng lặp (loops), cho phép thuật toán xử lý liệu cách lặp lặp lại đạt điều kiện khỏi vịng lặp Điểm bắt đầu (Starting Point): Thuật toán cần biết từ đâu để bắt đầu thực bước xử lý Điểm bắt đầu liệu đầu vào ban đầu vị trí cụ thể q trình xử lý Kết thúc (Termination): Một thuật tốn cần có điều kiện dừng để xác định kết thúc việc thực Điều đảm bảo thuật tốn khơng tiếp tục thực vơ hạn mà kết thúc đạt mục tiêu khơng cịn cần thiết Các thành phần tạo nên cấu trúc logic thuật tốn, giúp hoạt động hiệu để giải vấn đề cụ thể 1.2 Cấu trúc liệu sơ cấp: mảng, chuỗi, ngăn xếp, hàng đợi 1.2.1: Mảng Mảng (Array) tập hợp phần tử có kiểu liệu phần tử lưu trữ dãy ô nhớ liên tục nhớ Các phần tử mảng truy cập cách sử dụng “chỉ số” Mảng có kích thước N có số từ tới N – Tất mảng bao gồm vị trí nhớ liền kề Địa thấp tương ứng với thành phần đầu tiền địa cao tương ứng với thành phần cuối mảng Ưu điểm mảng: • Truy câp phàn tử vơi thời gian số O(1) • Sử dụng nhớ hiệu • Tính cục nhớ Nhược điểm mảng: • Khơng thể thay đổi kích thước mảng chương trình thực 1.2.2: Chuỗi Chuỗi tập hợp ký tự (char) lưu trữ ô nhớ liên tiếp ln ln có ký tự null \0 báo hiệu kết thúc chuỗi Các hoạt động chuỗi bao gồm trích xuất, cắt, nối, tìm kiếm xếp ký tự Chuỗi thường hỗ trợ thao tác xử lý văn biểu diễn ngôn ngữ tự nhiên Ưu điểm chuỗi: • • • • • Dễ sử dụng Hỗ trợ thư viện Xử lý văn Đa dạng Các phép tốn tích hợp Nhược điểm chuỗi: • Thao tác chuỗi tốn thời gian tài nguyên, đặc biệt chuỗi có kích thước lớn • Sử dụng chuỗi dẫn đến vấn đề quản lý nhớ, đặc biệt thêm/xóa ký tự tạo chuỗi • Khó xử lý liệu nhị phân 1.2.3: Ngăn xếp Ngăn xếp (stack) cấu trúc liệu tuân theo nguyên tắc "Last In, First Out" (LIFO), có nghĩa phần tử cuối thêm vào phần tử lấy Cách hoạt động ngăn xếp: • • • • • Push: Thêm phần tử vào đỉnh ngăn xếp Pop: Lấy phần tử đỉnh ngăn xếp Top (Peek): Xem giá trị phần tử đỉnh ngăn xếp mà không loại bỏ IsEmpty: Kiểm tra xem ngăn xếp có rỗng hay không Size: Đếm số lượng phần tử ngăn xếp Ưu điểm ngăn xếp: • Dễ sử dụng: Các hoạt động ngăn xếp đơn giản dễ hiểu, giúp quản lý thứ tự thực tác vụ • Quản lý thứ tự: Ngăn xếp thường sử dụng để trì thứ tự xử lý, đảm bảo tác vụ thực trước • Undo/Redo: Ngăn xếp thường sử dụng ứng dụng để hỗ trợ hoạt động undo redo Nhược điểm ngăn xếp: • Giới hạn kích thước: Ngăn xếp thường có giới hạn kích thước, vượt giới hạn dẫn đến tràn nhớ (stack overflow) • Khơng phù hợp cho tìm kiếm phức tạp: Việc truy cập vào phần tử khác ngồi đỉnh ngăn xếp làm cho việc tìm kiếm phức tạp 1.2.4: Hàng đợi (Queue) Hàng đợi (queue) cấu trúc liệu tuân theo nguyên tắc "First In, First Out" (FIFO), có nghĩa phần tử thêm vào hàng đợi phần tử lấy Các hoạt động hàng đợi: • • • • • Enqueue (Push): Thêm phần tử vào cuối hàng đợi Dequeue (Pop): Lấy phần tử đầu hàng đợi Front (Peek): Xem giá trị phần tử đầu hàng đợi mà khơng loại bỏ IsEmpty: Kiểm tra xem hàng đợi có rỗng hay khơng Size: Đếm số lượng phần tử hàng đợi Ưu điểm hàng đợi: • Dễ sử dụng: Các hoạt động hàng đợi thường đơn giản dễ hiểu • Quản lý thứ tự: Hàng đợi thường sử dụng để quản lý thứ tự xử lý tác vụ theo nguyên tắc FIFO ln đảm bảo tính chất khơng âm nhỏ Muốn thay đổi gpa, ta phải thông qua hàm • Ẩn thông tin không cần thiết đối tượng • Cho phép thay đổi cấu trúc bên lớp mà khơng ảnh hưởng tới lớp khác Ví dụ ban đầu, ta thiết kế lớp Student giống sau: Hình Thiết kế lớp với hai thuộc tính private Sau này, muốn gộp thuộc tính firstName lastName thành fullName lớp Student giống sau: Hình Thiết kế lớp với thuộc tính private Lúc này, cấu trúc lớp Student bị thay đổi đối tượng sử dụng lớp không cần phải thay đổi đối tượng quan tâm tới phương thức getFullName() Nếu khơng có phương thức này, ta phải sửa tất chỗ sử dụng thuộc tính firstName lastName lớp Student B Tính kế thừa (Inheritance) Khi lập trình, chắn có trường hợp mà đối tượng có chung số thuộc tính phương thức Ví dụ viết chương trình lưu thơng tin học sinh giáo viên Với học sinh cần lưu thông tin tên tuổi, địa chỉ, điểm với giáo viên cần lưu thơng tin 19 tên, tuổi, địa chỉ, tiền lương Lúc viết chương trình riêng rẽ code trung lặp nhiều Với kế thừa, vấn đề giải Kế thừa hướng đối tượng thừa hưởng lại thuộc tính, phương thức lớp Nghĩa lớp A kế thừa lớp B lớp A có thuộc tính, phương thức lớp B Do đó, ví dụ trên, ta tạo lớp Person cho lớp Student, Teacher kế thừa lại Ta xem hình để hình dung rõ hơn: Hình Tính kế thừa (Inheritance) C Tính đa hình (Polymorphism) Tính chất gắn liền với thực tế Cụ thể, hoàn cảnh, trường hợp, đối tượng có vai trị khác Ví dụ, người cơng ty có vai trị nhân viên, siêu thi có vai trị khác hàng, Trong lập trình, đối tượng, phương thức có nhiều hình thái tính đa hình Đa hình thể hình thức: • Đa hình với nạp chồng phương thức (Overloading): Ví dụ: phương thức cộng có hình thái cộng số nguyên, cộng số thức, cộng số nguyên, Cùng phương thức cộng lại có nhiều hình thái khác 20 Hình Đa hình với nạp chồng phương thức • Đa hình với ghi đè phương thức (Overriding): Ví dụ: phương thức getSalary() dùng để tính lương có hình thái tính lương cho quản lý, cho nhân viên, Với nhân viên, ta viết thuộc tính, phương thức sau: Hình Ví dụ thiết kế lớp Employee 21 Với quản lý, quản lý giống nhân viên, có tên lương nên quản lý kế thừa lại từ nhân viên Tuy nhiên, quản lý có lương cao hơn, phần cao ta giả sử thuộc tính private bonus Lúc này, ta ghi đè (overriding) Manager gồm thuộc tính name, salary thêm vào bonus Hình Thiết kế lớp Manager ghi đè lại phương thức lớp Employee • Đa hình thơng qua đối tượng đa hình (polymorphic objects): 22 Hình Hàm makeSound() trả kết khác với đối tượng khác Các biến thuộc lớp cha tham chiếu tới đối tượng lớp nên biến thuộc lớp cha có nhiều hình thái nên đa hình Ví dụ: 23 Hình Đa hình thơng qua đối tượng đa hình Trong ví dụ này, lớp cha Animal có phương thức ảo sound() (tiếng kêu) Các lớp Dog, Cat, Duck có phương thức hình thái khác vật lại có tiếng kêu khác D.Tính trừu tượng (Abstraction) Tính chất đơn giản hóa thơng tin bên đối tượng Nó cho phép người dùng giao tiếp với thành phàn đối tượng mà không cần phải biết cách mà thành phần xây dựng (chính xác khơng cần biết thành phần xây dựng, code mà cần biết chúng dùng để làm gì) Ví dụ: Khi ta rút tiền ATM, ta không cần quan tâm tới cách mà ATM hoạt động hay thành phần bên nó, mà ta quan tâm nhìn thấy tính rút tiền Trong trường hợp này, thông tin không cần thiết ATM đếm tiền, trừ tiền tài khoản, gửi liệu máy chủ ẩn 24 Trong lập trình vậy, gọi tới phương thức đối tượng cần quan tâm tới phương thức dùng để làm khơng cần quan tâm code Tính chất có ích làm việc nhóm, ta cần quan tâm tới chức phương thức mà thành viên khác code khơng cần biết cài đặt Để thực tính trừu tượng, sử dụng abstract class interface chúng chứa phần khai báo khơng có phần cài đặt, định nghĩa interface coi abstract class chúng chứa phương thức trừu tượng Ví dụ, ta tạo lớp Customer có interface ICustomer Các đối tượng khác muốn giao tiếp với lớp Customer phải thông qua interface 4.1.2 Design Pattern Đây kỹ thuật lập trình hướng đối tượng Kỹ thuật nhà nghiên cứu trước đúc kết lại, tạo thành mẫu thiết kế chuẩn để lập trình viên có áp dụng, tối ưu chương trình Trong thời gian thực tập, sinh viên nghiên cứu loại Design Pattern: RAII, Singleton, Observer, MVC Cụ thể sau: A RAII Một lỗi mà lập trình viên C++ hẳn khơng lần gặp phải memory leak, hiểu nơm na nhớ RAM máy tính tăng lên đều mà khơng thể tìm nguyên nhân Đây lỗi kinh điển C++ cấp phát động nhớ với tốn tử new “qn” khơng giải phóng delete Để khắc phục nhược điểm này, khái niệm RAII (Resource Acquisition Is Initialization) đời, dịch đơn giản “việc thu hồi tài nguyên khởi tạo” Để hiểu rõ hơn, ta theo dõi ví dụ sau: Theo cách thông thường, sau cấp phát động nhớ cho trỏ i sử dụng nhớ để làm việc đó, ta phải giải phóng với delete Trừ trường hợp ta “quên”, phần //Do something phát sinh trường hợp khiến delete khơng thực xảy memory leak Hình 10 Cấp phát động nhớ thơng thường Với RAII, ta thực sau: 25 Hình 11 Sử dụng RAII để tránh memory leak Sau biến trỏ i_ khai báo private, cấp phát động nhớ hàm tạo int_pointer(int i) với i tham số truyền vào Tiếp theo, hàm hủy ~int_pointer() sử dụng Trong hàm này, ta sử dụng delete để thu hồi lại nhớ Bằng cách sử dụng RAII, ta không cần phải ghi nhớ việc sử dụng delete lần cấp phát động không sợ bị memory leak //Do something phát sinh ngoại lệ làm cho delete không chạy B Singleton Để thực Singleton, có điều kiện lớp mà có thể toàn chương điểm truy cập toàn cục để lớp khác truy cập tới lớp Ta thực điều kiện cách tạo hàm khởi tạo (constructor) có phạm vi private tạo phương thức tĩnh có phạm vi truy cập public Xem hình để hình dung rõ hơn: Hình 12 Ví dụ Singleton 26 C Observer Pattern định nghĩa hay nhiều phụ thuộc đối tượng Nếu đối tượng thay đổi trạng thái, tất phụ thuộc thơng báo cập nhật tự động Xem hình sau để hình dung rõ hơn: Hình 13 Sơ đồ đơn giản Observer Trong hình trên, Observer Subject interface Tất observer cần liệu thừa kế giao diện Observer Phương thức notify() định nghĩa hành động thực Subject cung cấp cho Observer liệu Subject trì observerCollection (danh sách observer đăng ký) registerObserver(observer) unregisterObserver(observer) phương thức để thêm/xóa observers notifyObservers() gọi liệu thay đổi observers cần cung cấp liệu D MVC Là viết tắt Model-View-Controller bao gồm thành phần tương ứng: • Model: đáp ứng trực tiếp cho việc xử lý liệu Nó không nên dựa vào thành phần khác View Controller Nói cách khác, Model khơng quan tâm liệu hiển thị nào cập nhật Model chịu trách nhiệm truy xuất liệu tùy ý đăng ký kiện thay đổi liệu • View: biết cách trình bày liệu với người dùng Nó cần truy nhập vào Model thường cần định nghĩa hàm thực chức • Controller: u cầu Model cập nhật liệu Ngồi ra, yêu cầu View thay đổi việc trình bày Về bản, thành phần lấy đầu vào từ người dùng gửi yêu cầu tới View Model 27 Hình 14 Sơ đồ MVC 4.1.3 Một số tính nâng cao A STL Standard Template Library (STL) tập hợp lớp Template mạnh mẽ C++ để cung cấp lớp hàm mà tạo theo khn mẫu lập trình tổng qt Nó triển khai nhiều thuậ tốn, cấu trúc liệu phổ biến, thông dụng vector, list, queue, stack, Có thành phần mang tính cấu trúc mạnh mẽ STL là: Containers: Dùng để quản lý tập hợp đối tượng kiểu cụ thể Một số kiểu Containers: list, vector, map, Algorithms: Hoạt động Containers, cung cấp phương thức mà từ thực khởi tạo, xếp, tìm kiếm nội dung Containers Iterators: Dùng để duyệt qua phần tử tập hợp đối tượng Những tập hợp Containers tập Containers Nói chung, thành phần có tập hợp hàm định nghĩa trước giúp thực tác vụ phức tạp cách dễ dàng B Thread Khi quy mơ chương trình lớn vấn đề sử dụng tài nguyên tối ưu trở quan trọng Sử dụng đa luồng phương pháp tối ưu để sử dụng tài ngun máy Với nó, nhiều cơng việc thực đồng thời thay Thread hiểu đơn luồng chạy chương trình Ta định công việc máy tự xử lý, thực cơng việc đồng thời với luồng chạy 28 Hình 15 Cách tạo thread Trong hình 15, ta định nghĩa hàm SaySomething(const char* msg) sau cho chạy thread vừa tạo thơng quan dịng thread task(SaySomething, “Hello STDIO”) Trong SaySomething tên hàm vừa tạo, “Hello STDIO” tham số truyền vào Hàm join() gọi có chức tạm dừng chương trình, đợi thread chạy xong tiếp tục Nếu không muốn đợi thread chạy xong thay hàm detach() Lúc này, thread trở thành độc lập tự hoạt động C I/O Viết tắt Input/Output, hiểu đơn giản sử dụng tính ta đưa cho chương trình liệu đầu vào, chương trình chạy xong cho ta kết đầu Một thư viện chuẩn sử dụng phổ biến iostream Cùng với thư viện này, ta sử dụng cin, cout để phục vụ việc nhập liệu, lấy kết D SFML Viết tắt Simple and Fast Multimedia Library, thư viện đa phương tiện viết C++ Nó bao gồm mơ đun: • System: gồm lớp liên quan với hệ thống làm thời gian, xử lý unicode (có thể dùng để viết Tiếng Việt) • Window: liên quan tới việc tạo, đóng xử lý kiện cửa sổ • Graphics: gồm lớp việc render đồ họa (rất thích hợp cho việc lập trình game C++) • Audio: gồm lớp xử lý âm thanh, ta dùng để phát nhạc, ghi âm cho máy lưu thành file • Network: liên quan đến vấn đề mạng máy tính 4.2: Xây dựng game xếp hình 4.2.1: Giới thiệu game Trị chơi xếp hình trị chơi có ma trận kích thước MxN, lúc bắt đầu trị chơi trạng thái hộp rỗng Mỗi lượt cho khoois hình ngẫu nhiên hình dưới: 29 Khối hình có xu hướng dịch chuyển xuống phía dưới, dừng lại rơi xuống đáy hộp, gặp phải khối hình rơi xuống trước đó, sau dừng lại khối hình khác rơi xuống, hình vng khối hình gộp thành hàng ngang hàng ngang biến khối hình phía rơi xuống, chỗ cho hàng ngang vừa Có thể di chuyển khối hình sang trái, sang phải xuống dưới, đặc biệt xoay khối hình góc 90o theo chiều kim đồng hồ (có thể xoay nhiều lần) Nhiệm vụ phá vỡ nhiều hàng ngang nhiều tốt, trò chơi bị thua khơng cịn chỗ xuất hình cho khối hình 4.2.2: Lập trình game xếp hình Tạo class gồm thuộc tính: • • • • Loại khối hình Màu sắc khối hình Hình vng trung tâm (dùng để xoay khối hình) Tất tọa độ hình vng có khối hình Và phương thức: • • • • • • Khởi tạo tọa độ vng khối hình Xoay trái 90 độ Xoay phải 90 độ Dịch khối hình lên trên, xuống dưới, sang trái, sang phải Kiểm tra khơi hình chạm Và phương thức getters setters thuộc tính 30 Các phương thức di chuyển lên, xuống, trái, phải: if (sf::Keyboard::isKeyPressed(sf::Keyboard::A) && y > 0) { if (ShapeControl::ifNextStepTouch(cell_matrix, shapes[current], 0, -1)) { y -= 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { //delay = 0.05; touchCheck(); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) && ShapeControl::checkRight(shapes[current])) { if (ShapeControl::ifNextStepTouch(cell_matrix, shapes[current], 0, 1)) { y += 1; } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::R)) { if (ShapeControl::ifNextRotate(cell_matrix, shapes[current], x, y)) { updateTetris(); shapes[current]->rotateTetrisShape(cell_matrix); Sleep(75); } } } Phương thức “addNextShape” để thêm hình vào trị chơi sau hình khơng thể di chuyển bool Tetris::addNextShape() { x = 0; y = WIDTH_LEN / 2; current = next; shapes[current]->setX(x); shapes[current]->setY(y); if (!shapes[current]->addNewTetrisShape(cell_matrix, x, y)) { ifEnd = false; 31 return 0; } next = rand() % 6; return 1; } Phương thực “ifFullRow” kiểm tra xem có hàng đầy chưa, có xóa hàng cập nhật điểm số void Tetris::ifFullRow() { int count = 0; while (findFullRows()) { count += 1; deleteRows(findFullRows()); Score += count * count * 10; } } V Kết luận Qua trình thực tập đơn vị, thân sinh viên tìm hiểu kiến thức lập trình C/C++ biến, hằng, hàm, trỏ, thuật tốn, Bên cạnh đó, sinh viên cịn tìm hiểu thêm lập trình hướng đối tượng C++ với tính chất (thừa kế, đa hình, trừu tượng, đóng gói), số tính Design Pattern, STL, Thread, I/O, SFML, Từ sinh viên vận dụng kiến thức để tạo nên trị chơi đơn giản 32 33