Dự án xây dựng game có ý tưởng bắt nguồn từ trò chơi xe tăng (tank) cổ điển
Trang 1Báo cáo bài tập lớn
Môn Kỹ thuật lập trình hướng đối tựợng
• Người viết
Bùi Kim Dung 1 Bùi Anh Dũng 2
Lê Quý Dương 3 Nguyễn Trọng Hiếu4
Phạm Tuấn Long 5 Lê Anh Tú 6
• Ngày & địa điểm viết
Hà Nội, Ngày 19 tháng 11 năm 2009
Trang 2Mục lục
1.1 Nội dung dự án 1
1.2 Phạm vi dự án 1
1.3 Công nghệ sử dụng 1
2 Nội dung công việc 2 2.1 Chi tiết công việc 2
2.2 Cách thức tổ chức hoạt động nhóm 3
3 Đặc tả phần mềm 4 3.1 Các modules của phần mềm 4
3.1.1 Các module do nhóm xây dựng 5
3.1.2 Các modules được kế thừa từ các nguồn có sẵn 6
3.1.3 Use case Diagram 8
3.2 Sequence Diagram 9
3.3 Package Diagram 10
3.4 Class Diagram 11
3.5 Danh sách các pattern đã sử dụng 12
3.5.1 Factory method 12
3.5.2 Observer 13
3.5.3 Proxy 14
3.5.4 Singleton 14
3.5.5 Strategy 15
3.5.6 State 15
3.6 Thuật toán điều khiển xe tăng tự động (AI) 16
3.6.1 Giải pháp hiện tại 16
3.6.2 Giải pháp đề xuất 16
3.7 Giao diện đồ họa phác thảo 18
4 Các kết quả đạt được 19 4.1 Giao diện trò chơi 19
4.2 Gameplay 20
5 Kết luận và hướng phát triển 21 5.1 Ưu điểm 21
5.2 Hạn chế 21
Trang 3A Một số APIs cơ bản của Jgame 3.3 23
Trang 41 TỔNG QUAN
1 Tổng quan
1.1 Nội dung dự án
Dự án xây dựng Game có ý tưởng bắt nguồn từ trò chơi Xe Tăng (Tank)
cổ điển nhưng chúng em sẽ bổ sung thêm nhiều tính năng mới, vũ khí mớikhiến nó trở nên đẹp hơn, hấp dẫn hơn và kịch tính hơn Đặc biệt, luật chơiđược thay đổi, thay vì bắn nổ xe tăng đối phương để qua bài thì trong phiênbản mới này, người chơi phải phá hủy thành lũy của đối phương
1.2 Phạm vi dự án
Mục đích thực hiện dự án là học tập nên chúng em sẽ cắt giảm nhiều tiểutiết của game để giữ cho game có cấu trúc rõ ràng như số lượng hạn chế cácloại khí tài, bản đồ, bonus, mà thay vào đó, chúng em sẽ chứng minh tínhkhả thi khi mở rộng chương trình với các tính năng đó
Một số phần trong bản phân tích thiết kế chi tiết (specification) có thểkhông được thực hiện căn cứ vào mức ưu tiên của chúng và tiến độ thực hiện
dự án
Phần mềm được mặc định sẽ chạy trên phiên bản mới nhất của JRE 6+trên hệ điều hành Ubuntu 9.10+ hoặc windows XP SP3, ram tương thích,chip tương thích, card đồ họa tương thích
Trang 52 Nội dung công việc
2.1 Chi tiết công việc
TT Nhiệm vụ Mô tả Thời gian Thành
Dũng BA,Hiếu NT,Dương LQ
100%
2 Phân tích 15/9/2009
22/9/2009
-100%
Phân tích yêucầu
Dũng BA,Dung BK,Dương LQ
100%
Phân tích chứcnăng Dũng BA,Dung BK,
-100.00%
Thiết kế tổngthể Long PT,Hiếu NT 100%Thiết kế giao
diện
TúLA 100%
Thiết kế media Dung BK,Long PT 100.00%Thiết kế module
multi-(chi tiết)
Dũng BA,Dung BK,
100.00%2
Trang 62.2 Cách thức tổ chức hoạt động nhóm 2 NỘI DUNG CÔNG VIỆC
TT Nhiệm vụ Mô tả Thời gian Thành
viên Trạng thái
30/10/2009
-95.00%
Cài đặt giao diện Long PT,
Dung BA 90.00%Cài đặt business All 95.00%Ghép code Dũng BA 100.00%
5 Kiểm thử 31/10/2009
5/11/2009
-100.00%
Danh sách testcase (các tìnhhuống có thể cókhi người dùngchơi game)
DungBK 100.00%
Thực hiện testcase
Tú LA,Dương LQ,Hiếu NT
100.00%
6 Chuyển
giao
6/10/2009-
10/11/2009
100.00%
Viết hướng dẫn
sử dụng phầnmềm
Dương LQ 100.00%
Viết báo cáo DungBK 100.00%Đóng gói &
chuyển giaochương trình
Long PT 100.00%
2.2 Cách thức tổ chức hoạt động nhóm
• Tổ chức nhóm thành 2 teams:
– Team 1: Dũng BA, Dung BK, Dương LQ
– Team 2: Long PT, Hiếu NT, Tú LA
Trang 7Công việc của nhóm sẽ được chia cho các cá nhân hoặc cho cả teamnhưng dù trong trường hợp nào, các team sẽ phải chủ động hỗ trợ đốcthúc nhau thực hiện công việc.
• Nhóm họp 1 tuần 2 lần, 1 buổi online bằng skype vào tối thứ 7 và mộtbuổi offline vào 2 tiết cuối ngày thứ 5 (2 tiết trống) Ngoài ra, nhómvẫn thường xuyên trao đổi khó khăn cũng như ý kiến về công việc củanhau qua email
• Để tiện trong việc lập trình và quản lý các revision và việc lưu trữ mãnguồn, nhóm đã đăng kí dự án trên code.google.com Địa chỉ dự án củanhóm là: http://code.google.com/p/tank-war/
Bất cứ ai cũng có thể tải mã nguồn của dự án về, thông qua các SVNclient Sau khi hoàn thành việc kiểm thử và viết tài liệu hướng dẫn sửdụng, nhóm sẽ tổ chức offline để đánh giá hiệu quả làm việc cũng nhưchất lượng của phần mềm, so sánh với mục tiêu đặt ra khi bắt đầu dựán
3 Đặc tả phần mềm
3.1 Các modules của phần mềm
Trang 83.1 Các modules của phần mềm 3 ĐẶC TẢ PHẦN MỀM
3.1.1 Các module do nhóm xây dựng
• Game Engine: Module này có vai trò điều phối hoạt động của Game,như sinh tank địch, sinh bonus, tính điểm, xử lí va chạm, hiển thị hìnhảnh, điều khiển tank địch, Module này bao gồm một số module nhỏnhư sau:
– Game: Module chính quản lý các hoạt động nói trên
– Keysettings: Quản lý phím điều khiển của người chơi (phím dichuyển, bắn, đổi súng )
– State: Quản lý diễn biến các state của game (lúc ở menu chính,lúc vào chơi, lúc hoàn thành nhiệm vụ, lúc thất bại )
Module này nằm trong gói com.battletank.engine
• Factory: Module này có nhiệm vụ sinh và quản lý một vài tập hợp đốitượng cần thiết cho Game như tập hợp các xe tank, tập hợp các bonus,tập hợp các phần địa hình (terrain) Module này bao gồm các modulenhỏ:
– TankFactory: để sinh tank địch cũng như tank phe ta, dựa vào cácthông số đọc từ map, như số lượng xe tank, số lượng từng chủngloại tank
– TerrainFactory: sinh địa hình (gạch, đá, rừng, biển, nhà )– BonusFactory: sinh bonus
Module này nằm trong gói com.battletank.factory
• Object: Module này bao gồm các đối tượng được hiển thị trên bản đồ,bao gồm:
– Tank: Các chủng loại tank
Trang 9• Core: Module bao gồm một số class thiết yếu cho game Một số phầnchính của module:
– AI: Trí tuệ nhân tạo, điều khiển việc di chuyển của tank địch.Hiện giờ game hỗ trợ cấp độ Normal với việc di chuyển của tankđịch là ngẫu nhiên và cấp medium khi xe tank địch có khả năngquan sát xung quanh để tiêu diệt xe tăng của người chơi Cấp độHard đang trong giai đoạn phát triển, ở cấp độ này, tank địch cóthể truy tìm tank hoặc nhà của phe ta để tiêu diệt Chức năngtìm nhà đã hoàn thành
– Map: Bản đồ, chứa thông tin về bản đồ, quản lý các đối tượngtrên bản đồ
– Gun: Một số chủng loại súng của tank
– Bonuses: Thực thi tác dụng của các chủng loại bonus
Module này nằm trong gói com.battletank.core
3.1.2 Các modules được kế thừa từ các nguồn có sẵn
• Resource: Module này chứa thư viện hình ảnh & âm thanh cần thiếtcho chương trình, bao gồm:
– Các hiệu ứng khi chơi (đạn, cháy nổ, )
– Các hình vẽ được hiện trên màn hình (background, button )– Địa hình (textures)
– Các loại xe tank, máy bay (units) Module này được thu thập từnhiều nguồn trên Internet, và có một số thành phần tự thiết kế
Nó này nằm trong gói resources
• JLayer: Module dùng để thao tác với định dạng MP3 trên Java Đây làmột dự án mã nguồn mở, được đăng kí giấy phép LGPL (GNU LesserGeneral Public License) Hiện gi JLayer đã ra phiên bản 1.0.1, bao gồmcác chức năng sau:
– Converter: Chuyển đổi giữa định dạng MP3 và các định dạng khác– Decoder: Decode MP3
– Player: Dùng để phát các bài MP3
Trang 103.1 Các modules của phần mềm 3 ĐẶC TẢ PHẦN MỀM
Website: http://www.javazoom.net/javalayer/javalayer.html Module nàynằm trong gói javazoom.jl Trong Game sử dụng chức năng Player củaJLayer
• JGame: Module chủ yếu hỗ trợ phần front-end, và một phần backendcủa Game JGame là một engine đồ họa được dùng để hỗ trợ trong việclập trình các game 2D, trên máy tính hoặc các thiết bị di động Đây
là dự án mã nguồn mở, được đăng kí giấy phép BSD Hiện giờ JGame
đã ra phiên bản 3.3, hỗ trợ những chức năng sau:
Frontend:
– Hiển thị hình ảnh: Nạp và hiển thị hình ảnh từ các file PNG vàJPG
– Phát âm thanh: Nạp và phát nhạc từ các file WAV
– Hiệu ứng animation: Nạp và hiển thị hiệu ứng animation từ cácfile PNG và JPG
– Vẽ: Cung cấp một số API cơ bản để vẽ hình (đường thẳng, hìnhtròn, đa giác, hình chữ nhật)
– Hiển thị đối tượng: Hiển thị các đối tượng dựa vào tọa độ (x,y)của đối tượng
Backend:
– Kiểm tra va chạm: Kiểm tra va chạm giữa các đối tượng
– Thiết lập Game: Thiết lập cấu hình cho Game (độ phân giải, kíchthước của mỗi tile )
– JGame cung cấp một cơ chế lập trình hướng sự kiện thay vì lậptrình đa luồng Một số sự kiện chính:
Sự kiện của toàn bộ chương trình:
∗ initGame: Sự kiện lúc bắt đầu khởi tạo game Có thể nạp hìnhảnh, khởi tạo các thông số cho game, như chỉ số FPS (FramePer Second) tại thời điểm này
∗ paintFrame: Cơ chế lập trình game phổ biến hiện nay là chiacác cảnh game thành nhiều frame, và chạy lần lượt các framenày Sự kiện paintFrame được gọi mỗi khi frame cần được vẽlại (bước sang frame mới) Có thể thực hiện việc vẽ hình ởđây
Trang 11∗ doFrame: Giống paintFrame, nhưng doFrame được dùng đểđiều khiển hoạt động của game.
Sự kiện của các đối tượng:
∗ move: Sự kiện được gọi khi đối tượng cần cập nhật vị trí
∗ hit: Sự kiện được gọi khi có va chạm với đối tượng khác.Website: http://www.13thmonkey.org/ boris/jgame/
Module này nằm trong gói jgame
3.1.3 Use case Diagram
Chỉ có 1 actor là player, có 2 thao tác chính là hiệu chỉnh tùy chọn và điềukhiển xe tăng trong khi chơi
Trang 123.2 Sequence Diagram 3 ĐẶC TẢ PHẦN MỀM
3.2 Sequence Diagram
Trang 133.3 Package Diagram
Trang 14– begin: Lúc đối tượng bắt đầu được kích hoạt
– onEnterFrame: Lúc mỗi frame được hiển thị
– end: Lúc đối tượng kết thúc (ví dụ như khi tank bị bắn nổ)
• IArmor, IGun, IBonus, IDisplayObject, là những interface kế thừa trựctiếp từ IObject Chúng nằm trong module Core
– IArmor: Áo giáp của các đối tượng Nhằm chống đỡ sức công phácủa đạn
– IGun: Súng của tank Mỗi loại súng tương ứng với một hay nhiềuloại đạn, súng quyết định số lượng đạn, thời gian nạp đạn.– IMoveBehaviour là AI của tank địch, cũng nằm trong moduleCore
Trang 15– IDisplayObject là interface chung cho các đối tượng được hiểnthị lên màn hình Những đối tượng này bao gồm: Tank, Bullet,Terrain Chúng nằm trong module Object.
Các đối tượng thuộc module này đều được kế thừa từ JGObject,đây là một class chuẩn của JGame cho những đối tượng cần hiểnthị
• Để sinh ra các đối tượng trên, cần các Factory, bao gồm TankFactory,TerrainFactory, BonusFactory Chúng nằm trong module Factory.Các implementation của những interface trên đều phải là singleton.Nhằm đảm bảo không có 2 factory cùng loại được sinh ra
• Việc quản lý diễn biến game, khởi tạo game và các đối tượng cần thiết,cần class Game và các class khác trong module GameEngine (Xem lạiphần 3.1 Các module chính của chương trình)
3.5 Danh sách các pattern đã sử dụng
3.5.1 Factory method
Trang 163.5 Danh sách các pattern đã sử dụng 3 ĐẶC TẢ PHẦN MỀM
Factory method pattern được sử dụng với 2 mục đích chính:
• Che giấu cách thức khởi tạo các đối tượng Khi muốn khởi tạo thêmđối tượng mới, ta chỉ cần sử dụng các method mà Factory cung cấp,không quan tâm cách thức tạo ra đối tượng đó như thế nào
• Quản lý mối ràng buộc giữa các đối tượng thuộc cùng tập hợp Ví dụ,với 1 bản đồ nào đó, số lượng xe tăng địch chỉ tối được phép có tối đa
20 chiếc, trong đó có 10 chiếc loại A, 5 chiếc loại B, 5 chiếc loại C Tất
cả những việc này sẽ do Factory quản lý
Factory method pattern được áp dụng trong module Factory, bao gồmTankFactory, TerrainFactory, BonusFactory (xem hình vẽ)
3.5.2 Observer
Observer pattern được sử dụng với mục đích:
• Đồng thời kích hoạt tất cả các components (buttons) khi xảy ra một
sự kiện xác định (nhấp chuột)
• Khi người dùng nhấp chuột, với Observer pattern, ta không cần phảiquan tâm có bao nhiêu components (buttons), và vị trí của từng com-ponents
Trang 173.5.3 Proxy
Proxy pattern được sử dụng với mục đích: Tạo ra một đối tượng trung gian(BonusImage), quản lý việc truy cập đối tượng thật (Bonus) BonusImagechỉ là hình ảnh bonus hiển thị trên sân chơi, nhằm giúp người chơi nhận biếtđược sự xuất hiện của các loại bonus Bonus là đối tượng chính thực thi cáctác dụng của từng chủng loại bonus (tăng tốc, bất tử ) Khi các xe tăng
“ăn” được BonusImage thì đối tượng thật Bonus mới được kích hoạt và thựcthi các tác dụng của mình
3.5.4 Singleton
Singleton được sử dụng với mục đích: Đảm bảo với một số class chỉ có duynhất một đối tượng được sinh ra Với các Factory class, rõ ràng chỉ có thể códuy nhất 1 Factory được sinh ra, hoặc với class Game, không thể có hai đốitượng Game cùng chạy trong một chương trình
Trang 183.5 Danh sách các pattern đã sử dụng 3 ĐẶC TẢ PHẦN MỀM3.5.5 Strategy
Strategy pattern được sử dụng với mục đích: Giúp cho AI của các tank địchtrở nên linh hoạt, và có thể dễ dàng thay đổi, nâng cấp Với strategy pattern,phần AI được tách riêng ra khỏi đối tượng tank, do đó sẽ dễ dàng sửa đổi,hoặc có thể thay đổi một cách linh hoạt phụ thuộc vào mức độ khó của mànchơi
3.5.6 State
State pattern được sử dụng với mục đích: Giúp thay đổi diễn biến của Gamemột cách linh hoạt phụ thuộc vào từng trạng thái Game có rất nhiều trạngthái khác nhau (ví dụ ở màn hình chính, lúc chơi game, lúc hoàn thành nhiệm
vụ, lúc thất bại ) Với một trạng thái, Game sẽ hoạt động theo diễn tiếnkhác nhau Sử dụng state pattern, ta có thể thay đổi diễn biến của game mộtcách linh hoạt mỗi khi game bước sang một trạng thái mới
Trang 193.6 Thuật toán điều khiển xe tăng tự động (AI)
3.6.1 Giải pháp hiện tại
Các loại MoveBehaviour (AI di chuyển cho tank):
• NormalMoveBehaviour: di chuyển theo các hướng ngẫu nhiên, yêu cầutank phải đi một độ dài nhất định rồi mới được quay đầu
• GoodMoveBehaviour: phát triển từ NormalMoveBehaviour, tuy nhiênkhi Player tank cùng hàng với tank địch (ngang hay dọc) thì tank địch
sẽ quay ra bắn Player tank ngay lập tức
• HardMoveBehaviour: tank địch tự tìm đường đến phá thành của mình.Trong quá trình kiểm nghiệm chương trình, chúng tôi nhận thấy chế độNormalMoveBehaviour là chế độ đơn giản dành cho người mới bắt đầu chơi.Với GoodMoveBehaviour và HardMoveBehaviour thì tank địch khó chịu hơnrất nhiều, đặc biệt là GoodMoveBehaviour thì không thể bắn lén tank địchtheo các cách chơi thông thường trước đây HardMoveBehaviour thì phù hợpvới những tank chạy nhanh hoặc với những map mà tank địch xuất hiện gầnthành của Player
Ngoài ra độ khó của game có thể được tăng lên bằng số lượng tank xuất hiệntrên bản đồ trong cùng một thời điểm
3.6.2 Giải pháp đề xuất
Thực ra với AI hiện có thì game đã có chế độ chơi rất khó đòi hỏi người chơiphải rất có kinh nghiệm mới chiến thắng được Do đó, việc đề xuất các AImới không nhằm vào việc tăng độ khó của game mà là tạo ra một phươngthức chơi mới hấp dẫn hơn, gần thực tế hơn Hiện chúng em có một số giảipháp đề xuất như sau:
• Xe tăng địch đuổi theo xe tăng người chơi: Ta có thể đánh số các ô(tile) trên bản đồ Bản đồ hiện thời có mặc định là 25x25 ô Xây dựngmảng a[i,j] ở đó, a[i,j]=1 nếu 2 ô i,j kề nhau (tức là có thể trực tiếp đếnnhau), a[i,j]=0 nếu 2 ô không kề nhau hoặc 1 trong 2 là đá hoặc nước(các địa hình không thể phá vỡ được) Từ mảng a[i,j] đang có, ta xâydựng mảng d[i,j] chính là khoảng cách ngắn nhất giữa 2 ô i và j Việcxây dựng mảng d có thể bằng thuật toán Floyd 9 Việc này chỉ cần
9
http://en.wikipedia.org/wiki/Floyd-Warshall_ algorithm
Trang 203.6 Thuật toán điều khiển xe tăng tự động (AI)3 ĐẶC TẢ PHẦN MỀM
làm một lần, có thể xây dựng lúc bắt đầu vào màn chơi hoặc có thểtính toán ngay sau khi tạo map (bởi nhà sản xuất hoặc người sử dụng).Khi có mảng d[i,j], xe tăng địch sẽ chọn đi sang trái, phải, thẳng, quaylại tùy xem hướng nào làm giảm khoảng cách (d) giữa nó và mục tiêu(player tank hoặc là thành lũy của người chơi)
• Chế độ radar và truyền tin của xe tăng địch Vẫn sử dụng thuật toántrên nhưng xe tăng địch chỉ có thể nhận thức sự tồn tại của playertank khi player tank cách nó trong một khoảng nào đó Khi một xetăng địch phát hiện ra player tank, nó có thể lan truyền thông tin cho
xe tăng đồng đội trong bán kính cho phép Thông tin được lan truyền
và một số xe tăng sẽ được điều động để bao vây tiêu diệt player tank
• Chế độ kính tiềm vọng của xe tăng địch: Xe tăng địch không có radarnên không thể truy vết player tank, thay vào đó, nó có kính tiềm vọngtức là có khả năng quan sát cả 4 hướng Điều đó có nghĩa là xe tăngđịch có thể nhận thấy sự tồn tại của player tank khi chúng ở trên cùngmột hàng hoặc cột và không bị chắn tầm nhìn bởi địa hình (cây, đá,gạch) Khi phát hiện ra thông tin, chúng sẽ lan truyền thông tin chonhau và tổ chức vây bắt tại địa điểm xung quanh nơi xuất hiện playertank
• Chế độ đa mục tiêu của xe tăng địch Chế độ này sẽ đặc biệt hữu hiệutrong trường hợp game có nhiều hơn 1 người chơi Xe tăng địch sẽ cónhiều mục tiêu theo dõi và việc chọn lựa đúng đối tượng để đi theocũng sẽ làm cho game trở nên thú vị và thử thách hơn!