HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG KHOA CÔNG NGHỆ ĐA PHƯƠNG TIỆN BÁO CÁO CUỐI KỲ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG C++ Đề tài Phát triển phần mềm quản lý cho thuê sách LỜI MỞ ĐẦU Trong thời đại CNTT.
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ ĐA PHƯƠNG TIỆN BÁO CÁO CUỐI KỲ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG C++ Đề tài: Phát triển phần mềm quản lý cho thuê sách [1] LỜI MỞ ĐẦU Trong thời đại CNTT phát triển nay, nhà lập trình ln phải suy nghĩ xem làm để tạo chương trình hay, tiện ích Và thứ hỗ trợ người lập trình ngơn ngữ lập trình Có số phương pháp lập trình truyền thống lập trình tuyến tính, lập trình cấu trúc Với lập trình tuyến tính số ứng dụng phức tạp thực Trong với lập trình cấu trúc, không quản lý thay đổi liệu có nhiều chương trình sử dụng biến chung, không tiết kiệm tài nguyên Để khắc phục số hạn chế trên, người ta xây dựng số mơ hình lập trình tiên tiến như: Lập trình hàm, lập trình logic, lập trình trực quan, lập trình tương tranh, lập trình phân tán, lập trình hướng đối tượng Trong báo cáo này, em trình bày Lập trình hướng đối tượng áp dụng vào làm game [2] I Lập trình hướng đối tượng Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) mẫu hình lập trình dựa khái niệm "cơng nghệ đối tượng", mà đó, đối tượng chứa đựng liệu, trường, thường gọi thuộc tính; mã nguồn, tổ chức thành phương thức Phương thức giúp cho đối tượng truy xuất hiệu chỉnh trường liệu đối tượng khác, mà đối tượng có tương tác (đối tượng hỗ trợ phương thức "this" "self") Trong lập trình hướng đối tượng, chương trình máy tính thiết kế cách tách khỏi phạm vi đối tượng tương tác với nhau.[1] [2] Ngơn ngữ lập trình hướng đối tượng đa dạng, phần lớn ngôn ngữ lập trình theo lớp, nghĩa đối tượng ngôn ngữ xem thực thể lớp, dùng để định nghĩa kiểu liệu OOP xem giúp tăng suất, đơn giản hóa độ phức tạp bảo trì mở rộng phần mềm cách cho phép lập trình viên tập trung vào đối tượng phần mềm bậc cao Ngồi ra, nhiều người cịn cho OOP dễ tiếp thu cho người học lập trình phương pháp trước Một cách giản lược, khái niệm nỗ lực nhằm giảm nhẹ thao tác viết mã cho người lập trình, cho phép họ tạo ứng dụng mà yếu tố bên ngồi tương tác với chương trình giống tương tác với đối tượng vật lý Những đối tượng ngôn ngữ OOP kết hợp mã liệu mà chúng nhìn nhận đơn vị Mỗi đối tượng có tên riêng biệt tất tham chiếu đến đối tượng tiến hành qua tên Như vậy, đối tượng có khả nhận vào thông báo, xử lý liệu (bên nó), gửi hay trả lời đến đối tượng khác hay đến môi trường Đa phần ngơn ngữ lập trình thơng dụng (như C++, Delphi, Java, Python etc.) ngôn ngữ lập trình đa mẫu hình hỗ trợ lập trình hướng đối tượng nhiều mức độ khác nhau, thường kết hợp với lập trình mệnh lệnh, lập trình thủ tục *CÁC KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Đối tượng -Đối tượng (object): Các liệu thị kết hợp vào đơn vị đầy đủ tạo nên đối tượng Đơn vị tương đương với chương trình [3] đối tượng chia thành hai phận chính: phần phương thức (method) phần thuộc tính (property) Trong thực tế, phương thức đối tượng hàm thuộc tính biến, tham số hay nội đối tượng (hay nói cách khác tập hợp liệu nội tạo thành thuộc tính đối tượng) Các phương thức phương tiện để sử dụng đối tượng thuộc tính mơ tả đối tượng có tính chất Lớp (class) -Một lớp hiểu kiểu liệu bao gồm thuộc tính phương thức định nghĩa từ trước Đây trừu tượng hóa đối tượng Một đối tượng xác lập thực thể hóa từ lớp Khác với kiểu liệu thông thường, lớp đơn vị (trừu tượng) bao gồm kết hợp phương thức thuộc tính Để có đối tượng (mà xem biến) hoạt động việc thực thể hóa bao gồm việc cài đặt giá trị ban đầu thuộc tính việc đăng kí nhớ, mà công việc thường giao cho phương thức gọi “máy kết cấu” (constructor) hay hàm dựng Ngược lại đối tượng thuộc lớp không cịn sử dụng có phương thức để xử lý gọi “máy hủy diệt” (destructor) hay hàm hủy Như vậy, để có đối tượng người lập trình OOP cần phải thiết kế lớp đối tượng cách xây dựng thuộc tính phương thức có đặc tính riêng Mỗi phương thức hay thuộc tính đầy đủ lớp cịn gọi tên thành viên (member) lớp Lớp (subclass) -Lớp lớp thông thường có thêm tính chất kế thừa phần hay tồn đặc tính lớp khác Lớp mà chia kế thừa gọi lớp phụ mẫu (parent class) Lớp trừu tượng hay lớp sở trừu tượng (abstract class) -Lớp trừu tượng lớp mà khơng thể thực thể hóa thành đối tượng thực dụng Lớp thiết kế nhằm tạo lớp có đặc tính tổng qt thân lớp chưa có ý nghĩa (hay khơng đủ ý nghĩa) để tiến hành viết mã cho việc thực thể hóa (xem thí dụ) Thí dụ: Lớp “hinh_phang” định nghĩa khơng có liệu nội có phương thức (hàm nội tại) “tinh_chu_vi”, “tinh_dien_tich” Nhưng lớp hình_phẳng chưa xác định [4] đầy đủ đặc tính (cụ thể biến nội tọa độ đỉnh đa giác, đường bán kính toạ độ tâm hình trịn, …) nên viết thành lớp trừu tượng Sau đó, người lập trình tạo lớp chẳng hạn lớp “tam_giac”, lớp “hinh_tron”, lớp “tu_giac”,… Và lớp người viết mã cung cấp liệu nội (như biến nội r làm bán kính số nội Pi cho lớp “hinh_tron” sau viết mã cụ thể cho phương thức “tinh_chu_vi” “tinh_dien_tich”) Phương thức (method) -Là hàm nội lớp (hay đối tượng) Tùy theo đặc tính mà người lập trình gán cho, phương pháp gọi bên hàm khác lớp đó, cho phép câu lệnh bên ngồi lớp gọi tới nó, hay cho phép lớp có quan hệ đặc biệt quan hệ lớp con, quan hệ bạn bè (friend) phép gọi tới Mỗi phương pháp có kiểu trả về, chúng trả kiểu liệu cổ điển hay trả kiểu lớp định nghĩa từ trước Một tên gọi khác phương pháp lớp hàm thành viên Người ta định nghĩa thêm vài loại phương pháp đặc biệt: ● Hàm dựng (constructor) hàm dùng để cài đặt giá tri ban đầu cho biến nội đơi cịn dùng để khai báo việc xử dụng nhớ ● Hàm hủy (destructor) hàm dùng vào việc làm nhớ hủy bỏ tên đối tượng sau dùng xong, bao gồm việc xóa trỏ nội trả phần nhớ mà đối tượng dùng Trong số trường hợp hàm hủy hay hàm dựng tự động hóa ngơn ngữ OOP trường hợp Visual C++, C# ● Tiện ích (utility) hàm họat động bên lớp mà không cho phép môi trường bên ngồi gọi tới Các hàm tính tốn trung gian nội đối tượng mà xét thấy không cần thiết phải cho giới bên ngồi đối tượng biết ● Thuộc tính (attribude) -Thuộc tính lớp bao gồm biến, hằng, hay tham số nội lớp Ở đây, vai trị quan trọng thuộc tính biến chúng bị thay đổi suốt q trình hoạt động đối tượng Các thuộc tính xác định kiểu kiểu chúng kiểu liệu cổ điển lớp định nghĩa từ trước Như ghi, lớp thực thể hóa [5] thành đối tượng cụ thể tập hợp giá trị biến nội làm thành trạng thái đối tượng Giống trường hợp phương pháp, tùy theo người viết mã, biến nội dùng bên phương pháp lớp đó, cho phép câu lệnh bên ngồi lớp, hay cho phép lớp có quan hệ đặc biệt quan hệ lớp con, (và quan hệ bạn bè (friend) C++) phép dùng tới (hay thay đổi giá trị nó) Mỗi thuộc tính lớp cịn gọi thành viên liệu lớp Thực thể -Thực thể hóa (instantiate) q trình khai báo để có tên (có thể xem biến) trở thành đối tượng từ lớp Một lớp sau tiến hành thực thể hóa để có đối tượng cụ thể gọi thực thể Hay nói ngược lại thực thể đối tượng riêng lẽ lớp định trước Như biến thông thường, hai thực thể lớp có trạng thái nội khác (xác định giá trị có biến nội tại) hồn tồn độc lập khơng có u cầu đặc biệt từ người lập trình Cơng cộng -Cơng cộng tính chất dùng để gán cho phương pháp, biến nội tại, hay lớp mà khai báo người lập trình cho phép câu lệnh bên đối tượng khác phép dùng đến Thí dụ: Trong C++ khai báo public: int my_var; biến my_var có hai tính chất tính cơng cộng integer hai tính chất hợp thành đặc tính biến my_var khiến xử dụng hay thay đổi giá trị (bởi câu lệnh) nơi bên lẫn bên lớp Riêng tư -Khi dùng tính chất gán cho biến, phương pháp biến hay phương pháp sử dụng bên lớp mà chúng định nghĩa.Mọi nỗ lực dùng đến chúng từ bên qua câu lệnh hay từ lớp bị phủ nhận hay bị lỗi 10 Bảo tồn - Tùy theo ngơn ngữ, có vài điểm nhỏ khác cách hiểu tính chất Nhìn chung tính chất mà mà dùng để áp dụng cho phương pháp, biến nội tại, hay lớp có nội lớp [6] hay lớp (hay nội gói Java) phép gọi đến hay dùng đến phương pháp, biến hay lớp So với tính chất riêng tư tính bảo tồn rộng rãi nghĩa chia sẻ liệu hay chức Nó cho phép số trường hợp dùng tới đặc tính lớp (từ lớp chẳng hạn) 11 Đa kế thừa -Đây tính chất cho phép lớp có khả kế thừa trực tiếp lúc nhiều lớp khác Vài điểm cần lưu ý viết mã dùng tính chất đa kế thừa: ● Khi muốn có kế thừa từ nhiều lớp phụ mẫu lớp cần phải độc lập đặc biệt tên liệu hay hàm cho phép kế thừa phải có tên khác để tránh lỗi “ambiguity” Bởi lúc phần mềm chuyển dịch xác định lớp thừa kế tên lớp phụ mẫu ● Không phải ngôn ngữ OOP loại phân lớp hỗ trợ cho tính chất ● Ngồi khái niệm trên, tùy theo ngơn ngữ, có chức OOP riêng biệt cấp thêm vào II Sơ lược kiến thức lập trình Unity Định nghĩa lập trình Unity gì? -Unity phần mềm có khả làm game đa tảng nhờ vào Unity Technologies Nó có khả phát triển video game cho máy tính, consoles điện thoại di động Việc phát triển game việc kéo thả (drag and drop) hành Ngay lần công bố hệ điều hành OS, X Apple’s Worldwide Developers Conference năm 2015 tới Unity mở rộng phát triển 27 tảng [7] Hình 2.1: lập tình Unity Trong thời điểm nay, có tới phiên thuộc phần mềm phát hành giới Vào triển lãm năm WWDC (2006) Unity tập đồn Apple trao thưởng giải Best Use of Mac OS X Graphics Định nghĩa lập trình Unity gì? -Lập trình Unity 2D 3D lập trình dựa vào ngơn ngữ C#, Boo UnityScript Thơng thường, ngơn ngữ mà lập trình viên Unity sử dụng phổ biến C# Đến đây, hẳn nhiều bạn đọc phân vân Unity lại sử dụng để thiết kế game mà phải biết rõ lập trình phía trên? Có thể bạn chưa biết rằng, Unity có phần hạn chế lập trình nằm phần kéo thả nên lập trình áp dụng phương pháp bổ trợ.Theo dõi ví dụ sau: Bạn biết đến trò chơi Planes sản phẩm tạo sinh viên Trò chơi lập trình với thao tác đơn giản bắn máy bay, ngồi cơng việc kéo thả giao diện main menu, đặt nhân vật khung nền, cịn thực dựa phương pháp drag and drop Những hiệu ứng bên trò chơi tự động lặp lặp lại bầu trời lùi liên tục nhằm tạo hiệu ứng máy bay di chuyển, vụ nổ, bắn đạn, Chính vậy, bạn khơng thể pick đối tượng tiến hành thả liên tục [8] cảnh chỉnh tay Bởi hiệu ứng tự động cách mà bạn cần phải lập trình Hình 2.2: Unity lập trình game phổ biến Game Unity xây dựng vận hành cách thức nào? -Dưới hướng đến khái niệm quan trọng phần lập trình Unity sau: GameObject: Một đối tượng cụ thể sử dụng game khái niệm game object Có thể nhân vật, đồ vật, Component: Một GameObject thường cấu tạo từ nhiều thành phần nên hình ảnh, hành động nhân vật, mã điều khiển, Functions thường kế thừa từ MonoBehaviour class ghi đè bên class cịn thực cho kiện quan trọng Hai kiện thường dùng phổ biến Component là: Start() tiến hành chạy thêm lần trước hàm update Update() thực sau vòng lặp chạy liên tục Nó gọi lần dành cho khung hình (thường 25 khung hình giây) Cứ thứ gọi gọi component GameObject [9] Script: Script dạng tập tin có chứa đoạn mã nguồn sử dụng với mục đích khởi tạo xử lý đối tượng game Đối với Unity bạn sử dụng C#, Java Script, BOO để thực lập trình Script Ngồi ra, bạn điều chỉnh thuộc tính cho component khác thông qua script Và script thường xem “não” người điều khiển phận lại Cấu trúc đoạn mã bao gồm thành phần sau: Biến (variable) thường có chứa giá trị kiểu dạng số đặc thù kiểu kí tự Hàm (function) thường sử dụng để thực ti cơng việc thơng thường có biến biểu thức toán học khác Những function bên Unity thường phân chia thành nhóm bao gồm: liên quan đến game – game relate (như system, input, network), đối tượng đặc trưng – object specific, người dùng định nghĩa – user defined.Chú thích (comment) bị chương trình dịch bỏ qua chạy chương trình cho phép người sử dụng co thể ghi chép lại điều cần nhớ vô hiệu hóa dịng mã lệnh Hình 2.3: Game lập trình từ Unity [10] III Game Zoombie Suvival Hinh 3.1: ảnh minh hoạ game Game Idea: -Ý tưởng: Xây dựng game bắn súng với góc nhìn thứ Game dành cho người chơi, người chơi làm điều khiển nhân vật chống lại đợt công Zoombie cách dùng súng bắn vào chúng, phá hủy thùng bom, bắn mục tiêu để chơi lâu Concept: -Target: người chơi Concept art: ● Đồ họa 3D Low polygon Game Design Document: -Player Control: ● Người chơi điều khiển nhân vật ● Di chuyển chuột để thay đổi hướng nhìn camera nhân vật ● Ấn chuột trái để bắn đạn ● Ấn chuột phải để ngắm bắn ● Ấn R để thay đạn, ấn T để inspect súng, ấn G để ném lựu đạn, ấn F Q để sử dụng vũ khí cận chiến - Gameplay: ● Trong trình chơi, nhân vật Zoombie xuất tiến lại gần người chơi ● Nhiệm vụ người chơi bắn zombie, tận dụng bia đạn thùng bom để hồi phục tiêu diệt zombie [11] ● Người chơi tiêu diệt zoombie để gia tăng điểm, thời gian chơi lâu, kỷ lục người chơi ghi lại - Challenge: ● Người chơi phải liên tục quan sát bắn Zoombie - Sound&Effect: ● Trò chơi xuyên suốt có nhạc ● Khi người chơi bán đạn, có sound effect ● Khi người chơi bắn trúng mục tiêu, có sound effect thơng báo trúng đạn Pitch: - Tên game : Zoombie Survival - Thể loại: Game người chơi, 3D, góc nhìn thứ - Câu chuyện : Thế giới bờ vực diệt vong trước đại dịch Zombie Bạn người may mắn sống sót tình nguy nan Hãy cố sống sót lâu tốt đại nạn tìm kiếm người may mắn sống sót khác - Gameplay: ● Trị chơi dành cho người chơi, góc nhìn thứ ● Di chuyển chuột click chuột để quan sát tiêu diệt Zoombie - Tuổi số ESRB: ● Tuổi : – 45 ● Chỉ số ESRB dự kiến : E (Everyone) Chứa hình ảnh, hoạt cảnh, ngơn ngữ bạo lực trò chơi nhẹ nhàng - Nền tảng vận hành & yêu cầu phần cứng: ● Nền tảng vận hành : Window 7,8,10 ● Yêu cầu phần cứng : Máy tính laptop RAM 100mb trở lên Kĩ thuật lập trình -Kiến trúc Actor Component Game: + Gameobject Player : Camera, Player (Script lưu trữ máu người chơi), PlayerMovement (Scripts nhận input từ chuột người chơi để quay góc nhìn), AutomaticGun (Scripts nhận input từ chuột để bắn đạn, nút để điều khiển súng) + Gameobject Enemy : Collider, Enemy (Script logic đuổi theo người chơi, hành động AI ) + Gameobject GameControler : GameController (Script quản lý vòng lặp game) [12] + Gameobject Sound : AudioSource, SoundManager (Script quản lý âm thanh, phát âm cho game) + Gameobject Bullet : Rigidbody, Collider, Bullet(Scripts xử lý viên đạn bay) + Gameobject Target : Collider, TargetHeal (Hồi máu cho player bắn vào) + Gameobject Barrel : Rigidbody, Collider, ExplosionBarrel (Scripts xử lý thùng xăng nổ) + Gameobject Text+2 : MeshRender, TextMesh (Text hiển thị Enemy chết bắn trúng mục tiêu, để hiển thị tăng máu cho người chơi + Gameobject UIController : Canvas, UIController (Scripts để hiển thị giao diện cho người chơi thực chức xem kỷ lục, chơi lại, lưu thơng tin,… -Kỹ thuật điều khiển vịng lặp chính: + PlayerMovement : Nhận Input từ bàn phím để di chuyển, nhận Input tọa độ chuột để thay đổi góc nhìn + AutomaticGun : Nhận Input chuột trái chuột phải để bắn ngắm, nút bàn phím thay đạn,… + GameController : Điều khiển vịng lặp Game, kiểm tra trạng thái Player, thay đổi trạng thái game, qua màn, sản sinh Enemy Target, Barrel… -Tải lưu đệm liệu: + Dữ liệu prefabs Bullet (Đạn) tải lên script AutomaticGun người chơi click chuột bắn đạn + Dữ liệu prefabs Enemy tải lên script GameController, zombie liên tục tạo suốt trò chơi + Dữ liệu prefabs Target, Barrel tải lên script GameController, vật phẩm liên tục tạo suốt trò chơi -Xử lý nhập xuất: + Game nhận liệu đầu vào từ tọa độ chuột để xoay camera người chơi (Thực script PlayerMovement) + Game nhận liệu đầu vào từ chuột trái để thực logic bắn đạn + Game có giao diện người dùng, kết thúc game có thơng tin nhập vào người dùng để thị tên, thời gian, điểm người chơi để lưu vào kỷ lục [13] -Lập trình giao diện: + Để thị giao diện, ta dùng scripts GameController để quản lý UI hiển thị cho người chơi, giao diện Text hiển thị cập nhật xuyên suốt vòng lặp + Hiển thị giao diện kỷ lục người chơi, tương tác, ta dùng scripts UIController để hiển thị thơng tin kỷ lục trị chơi, thơng tin kết chơi giao diện lưu thông tin người chơi, chơi lại, thoát game,… -Xử lý âm hiệu ứng: + Ta dùng script SoundManager để quản lý âm + Sử dụng Component AudioSource để chạy nhạc xử lý gọi Sound effect + Các hiệu ứng VFX tương ứng Gameobject sẵn có -Xử lý va chạm: + Xử lý va chạm Bullet chạm vào Enemy, Enemy Bullet biến mất, Effect text báo “+2” ra, Player tăng máu + Xử lý va chạm Bullet chạm Target, Target Bullet biến mất, Text báo “+2” ra, Player tăng máu + Xử lý va chạm Bullet chạm vào Barrel, Barrel phát nổ ảnh hưởng môi trường xung quanh, khiến Barrel khác phát nổ theo, Enemy gần bị tiêu diệt [14] Code game: -Code SoundManager Hình 3.2 - CodePlayerMovement hình 3.3 [15] -Code Player Hình 3.4 - Code Enemy hình 3.5 [16] - Code GameController Hình 3.6 [17] LỜI CẢM ƠN Để hồn thành báo cáo mơn học trước tiên em xin gửi đến thầy, cô khoa đa phương tiện học viện cơng nghệ bưu viễn thơng lời cảm ơn chân thành sâu sắc Đặc biệt, em xin gởi đến thầy Tạ Chí Hiếu người tận tình hướng dẫn, giúp đỡ em hồn thành báo cáo mơn lập trình hướng đối tượng lời cảm ơn sâu sắc Em xin chân thành cảm ơn giúp đỡ thầy tạo điều kiện cho em tìm hiểu cung cấp số liệu tài liệu cho em trình học làm tập Vì kiến thức thân cịn hạn chế, q trình thực tập, hồn thiện chun đề em khơng tránh khỏi sai sót, kính mong nhận ý kiến đóng góp từ thầy Em xin chân thành cảm ơn! [18] ... trình Unity gì? -Unity phần mềm có khả làm game đa tảng nhờ vào Unity Technologies Nó có khả phát triển video game cho máy tính, consoles điện thoại di động Việc phát triển game việc kéo thả... (Script quản lý vịng lặp game) [12] + Gameobject Sound : AudioSource, SoundManager (Script quản lý âm thanh, phát âm cho game) + Gameobject Bullet : Rigidbody, Collider, Bullet(Scripts xử lý viên... Conference năm 2015 tới Unity mở rộng phát triển 27 tảng [7] Hình 2.1: lập tình Unity Trong thời điểm nay, có tới phiên thuộc phần mềm phát hành giới Vào triển lãm năm WWDC (2006) Unity tập đoàn