ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH ĐẠI HỌC CÔNG NGHỆ THÔNG TIN BỘ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG BÁO CÁO BÀI TẬP 7 GVHD : NGÔ QUỐC HƯNG BÀI TẬP: BATTLE CITY NHÓM THỰC HIỆN: NHÓM 9 LÊ VÕ HỮU TRÍ (10520516) TRẦN LÊ TUẤN (10520425) TRẦN ĐÌNH THI (10520434) NGUYỄN TUẤN ANH (10520331) MỤC LỤC I.GIỚI THIỆU CHƯƠNG TRÌNH……………………………………… II.GIẢI THUẬT………………………………………………………………… III.CÁC LỚP …………………………………………………………………… IV.KẾT LUẬN……………………………………………………………………. I.GIỚI THIỆU CHƯƠNG TRÌNH: *Cốt truyện: Trong những năm của đế chiến thứ 2, quân đội Nhật tăng cường đại đội Tank thiết giáp của mình bắn phá các thành phố lớn trên thế giới, trước tình hình đó vào những năm giữa cuộc chiến, một tiểu đội Tank của Việt Nam tuy mới được thành lập nhưng đã dũng cảm lãnh sứ mệnh tiêu diệt những đội Tank hung hãn của phát-xít ở các thành phố lớn trên thế giới để bảo vệ biểu tượng hòa bình cho nhân loại. Bằng lòng nhiệt huyết và tinh thần quốc tế. Những chiến sỹ Tank thiết giáp của Việt Nam dũng mãnh xông pha lửa đạn tiêu diệt quân thù. Trong bối cảnh của Game người chơi đóng vai một chiến sỹ lái Tank mang theo mình sứ mệnh hòa bình cho thế giới. *Cách chơi: +Người chơi sử dụng các phím mũi tên để di chuyển, space để bắn tiêu diệt hết quân địch hoàn thành sứ mệnh hòa bình của mình. +Nếu biểu tượng hòa bình của thành phố bị tiêu hủy sẽ thua ngay và trở về Level1. +Người chơi có thể tùy chỉnh level1 tuy nhiên level2 là mặc định và phải vượt qua. *Demo Giao diện Giao diện ban đầu. màn hình chơi Công cụ Edit Map II.GIẢI THUẬT. 2.1. Vấn đề bài toán: Xây dựng Game Bắn xe tăng (battle city) bằng việc ứng dụng phương pháp lập trình hướng đối tượng. Game phải đáp ứng các tương tác về vật lí của những vật thể bao gồm: xe tăng ta, xe tăng địch, vật cản…. và những thay đổi của Game theo thời gian. 2.2 Giải thuật chính: Bài toán được giải quyết trên nền ngôn ngữ C# với công nghệ .NET, xây dựng dưới dạng ứng dụng WinForm. 2.2.a .Lưu trữ: Để giải quyết vấn đề lưu trữ vị trí của các đối tượng trên màn hình ta dùng một ma trận kích thước NxM với N,M tự định nghĩa, ở mỗi vị trí ( i ,j ) của ma trận ta nhân với ô đơn vị để xác định vị trí của đối tượng, bên cạnh đó ta đánh dấu mỗi vị trí ( i ,j ) với một giá trị (do người lập trình tự định nghĩa) để xác định loại đối tượng trên bản đồ. Vd: N = 5, M = 18. 0 0 0 0 0 0 0 2 0 6 0 2 0 0 0 0 0 2 0 0 2 2 2 2 2 2 0 6 0 2 2 2 2 2 2 0 0 0 0 0 2 3 3 2 2 2 2 2 2 2 2 2 3 3 0 0 2 0 0 2 2 0 0 0 0 0 2 2 0 0 2 0 0 0 0 0 2 0 0 2 2 0 0 6 0 0 2 2 0 0 Các đối tượng 3,6 là 2 loại Tank, 2 là loại vật cản. Tại vị trí ( i=2,j=3) có giá trị 2 tương ứng với tọa độ (2*CONST_SIZE,3*CONST_SIZE) có đối tượng vật cản. ( CONST_SIZE là một hằng số tự định nghĩa, là ô đơn vị) 2.2.b .Di chuyển: Trong Game việc di chuyển bao gồm bốn hướng Đông, Tây, Nam, Bắc ứng với mỗi hướng di chuyển ta đặt một biến cờ quy định hướng di chuyển cho đối tượng, biến cờ (Flag) sẽ có tác dụng truyền vào hàm di chuyển kích hoạt sự di chuyển của đối tượng thông qua phương thức của nó. Di chuyển được phân thành 3 loại như sau. +Di chuyển theo phím điều khiển của Tank phe ta. +Di chuyển tự động theo ngẫu nhiên khi gặp vật cản của địch. +Đuổi theo bước di chuyển của phe ta đối những tên trùm. *Di chuyển của Tank phe ta: việc di chuyển này hoàn toàn phụ thuộc vào yêu cầu di chuyển của người dùng, nên cách đơn giản nhất là sử dụng thao tác phím trên giao diện với sự kiện (Event) KeyDown, KeyUp. Như vây mỗi lần các phím di chuyển được ấn, ta sẽ lưu biến Flag với giá trị hằng (do người lập trình tự định nghĩa) tương ứng với hướng được di chuyển. *Di chuyển của phe địch: vấn đề lại nảy sinh khi ta đặt các giá trị random trường hợp trùng seed sẽ rất dễ xãy ra, vì nếu chúng ta cho seed chạy theo thời gian hệ thống thì thời điểm các Tank sinh ra là hoàn toàn gần như trùng nhau ở các máy có bộ xử lí nhanh. Như thế ta sẽ chủ động ngưng thời gian lại bằng lời gọi Thread.Sleep(time_delay) được chứa trong System.Threading. Và giá trị random sẽ được sinh ra sau mỗi lần Tank di chuyển xảy ra va chạm với vật cản, với Tank ta hay giới hạn của Map. 2.2.c Va chạm Va chạm là phương thức vật lí không thể thiếu trong hầu hết các đối tượng của Game. Đối với Tank Battle bao gồm các cặp va chạm như sau: Tank-vật cản, Tank-đạn, đạn- Vật cản, đạn-Tường, tank-tường. Ở mỗi cặp ta đều sử dụng một công thức ứng dụng tọa độ chung, được mô phỏng như sau: 1 2 3 4 Hình đen là đối tượng bị tác động, hình vàng là đối tượng tác động. Vì lí do các đối tượng graphics được quảng lí theo tọa độ góc trái trên nên ta dể dàng xét va chạm khi phân thành bốn trường hợp như vậy. III.CÁC LỚP 3.1 .Giới thiệu các lớp: FrmMain: Thể hiện giao diện chính của chương trình. Cung cấp các tương tác với người dùng: tương tác phím, các chọn lựa,… FrmMapEditor: Cung cấp giao diện cho người dùng có thể trực tiếp tạo bản đồ theo ý muốn của mình. GameObject: Lớp nền tảng cho các lớp đối tượng trong game, chứa các thuộc tính chung và nền tảng của các lớp khác trong Game. GameWorld: Chứa thông tin về Game, vận hành game, xác định các thuộc tính của game, là cầu nối từ frmMain đến các lớp cụ thể khác. Player: Bao gồm các thông tin của người chơi: LEVEL, WIN, LOSE,…. Tank: Lớp được kế thừa từ GameObject thể hiện cụ thể thành xe tank có thể vận hành và bắn. Bullet: Lớp được kế thừa từ GameObject, được cụ thể hóa thành viên đạn là một đối tượng động. Obstruction: Lớp kế thừa từ GameObject, là lớp có thuộc tính gần với GameObject nhất, cụ thể thành các vật cản tĩnh. BattleField: Có đối tượng chính là Bản đồ, cung cấp các thao tác xử lí trên bản đồ: thêm, sửa xóa, tạo,…… Constant: Lớp phụ chứa các hằng số nhằm tùy chỉnh game. 3.2 .Sơ đồ Lớp: Các lớp thuộc cây kế thừa của GameObject GameObject Bullet Obstruction Tank Các lớp khác 3.3 Xây dựng mô hình kế thừa của GameObject Nhìn chung ở các đối tượng chính của Game: Bullet, Tank, Obstruction đều có chung một số thuộc tính như: tọa độ, kích thước, … các phương thức: va chạm, phá vỡ, hủy…. như thế việc hình thành sơ đồ ban đầu như sau: Như vậy để việc kế thừa diễn ra thực sự có hiệu quả ta xây dựng các phương thức cơ bản từ GameObject là các phương thức ảo (virtual), từ đó ở các lớp con có thể sử dụng một cách linh hoạt hơn. Ví dụ một phương án xây dựng Prototype cụ thể: Xét ví dụ trên: +Trong GameObject các phương thức chung được xây dựng Virtual. +Ở các lớp còn lại ngoài những phương thức riêng các phương thức con lại đều được override và thể hiện cụ thể trong từng trường hợp. Ví dụ: Hàm Destroy Destroy của GameObject: virtual public bool Destroy(Graphics Map) { Map.FillRectangle(Brushes.Black, new Rectangle(Location, new Size(Size, Size))); Map.DrawRectangle(Pens.Black, new Rectangle(Location, new Size(Size, Size))); return true; } Destroy của Obstruction: public override bool Destroy(Graphics Map) { if (!Break) return Break; return base.Destroy(Map); } Destroy của Bullet public override bool Destroy(Graphics Map) { return true; } Từ việc ứng dụng tính đa hình, phương thức ảo ta thực sự linh hoạt hơn trong code. IV. KẾT LUẬN: Bằng ứng dụng hướng đối tượng vào lập trình giúp việc trình bày, thể hiển được trong sáng hơn, bên cạnh đó giúp tối ưu hóa code dể dàng. Giúp cho việc phân tích thiết kế dể đi vào khuông mẫu và thực hiện. Mặc dù đã cố gắng hoàn thiện chương trình, tuy nhiên việc sai sót trong lập trình là khó tránh khỏi, trong hướng tới phần mềm sẽ được tối ưu code hơn nữa, các giải thuật sẽ mang tính thông minh hơn. HẾT . cho các lớp đối tượng trong game, chứa các thuộc tính chung và nền tảng của các lớp khác trong Game. GameWorld: Chứa thông tin về Game, vận hành game, xác định các thuộc tính của game, là cầu. lần Tank di chuyển xảy ra va chạm với vật cản, với Tank ta hay giới hạn của Map. 2.2.c Va chạm Va chạm là phương thức vật lí không thể thiếu trong hầu hết các đối tượng của Game. Đối với Tank. Map II.GIẢI THUẬT. 2.1. Vấn đề bài toán: Xây dựng Game Bắn xe tăng (battle city) bằng việc ứng dụng phương pháp lập trình hướng đối tượng. Game phải đáp ứng các tương tác về vật lí của những