TRƯỜNG ĐH HỒNG ĐỨC
KHOA CNTT&TT
BÀI TIỂU LUẬN
HỌC PHẦN ĐỒ HỌA MÁY TÍNH
Đề tài:
“Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game”
SVTH : Bùi Hữu Giáp
Lớp : Đại học tin – K15
MSV : 1261030003
Thanh Hóa, 11/2014
TRƯỜNG ĐH HỒNG ĐỨC
KHOA CNTT&TT
BÀI TIỂU LUẬN
HỌC PHẦN ĐỒ HỌA MÁY TÍNH
Đề tài:
“Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game”
SVTH : Bùi Hữu Giáp
Lớp : Đại học tin – K15
MSV : 1261030003
GVHD: ThS. Lê Thị Hồng
Thanh Hóa, 11/2014
LỜI CẢM ƠN
Trong quá trình học tập tại trường, chúng em đã được học hỏi và tiếp thu
rất nhiều kiến thức đại cương cũng như chuyên ngành nhằm nâng cao vốn hiểu
biết và là hành trang quý báu giúp chúng em vững bước vào đời. Em xin gửi lời
cảm ơn chân thành đến quý thầy cô đã giảng dạy chúng em trong suốt thời gian
qua, khoa Công Nghệ Thông Tin và truyền thông cũng như tất cả quý thầy cô
trong trường Đại học Hồng Đức. Đặc biệt em xin chân thành cảm ơn cô Lê Thị
Hồng - người đã trực tiếp giảng dạy chúng em học phần Đồ họa máy tính và
cũng là người tận tình hướng dẫn em trong suốt thời gian thực hiện đề tài này.
Tuy nhiên, dù rất cố gắng nhưng do thời gian có hạn nên bài tiểu luận của
em khó tránh khỏi những thiếu sót. Em rất mong nhận được sự thông cảm và đóng
góp ý kiến của quý thầy cô và các bạn để bài tiểu luận của em được hoàn chỉnh
hơn.
Em xin chân thành cảm ơn!
Thanh Hóa, 11/2014
Sinh viên thực hiện
i
MỤC LỤC
CHƯƠNG I: MỞ ĐẦU 1
1.1.
Lí do chọn đề tài 1
1.2.
Mục tiêu, nhiệm vụ của đề tài 1
1.2.1.
Mục tiêu 1
1.2.2.
Nhiệm vụ 2
1.3.
Khách thể, đối tượng và phạm vi nghiên cứu 2
1.3.1.
Khách thể nghiên cứu 2
1.3.2.
Đối tượng và phạm vi nghiên cứu 2
1.4.
Phương pháp nghiên cứu 2
CHƯƠNG II: CƠ SỞ LÍ LUẬN 3
2.1.
Xe tăng 3
2.2.
Đạn 3
2.3.
Di chuyển 4
2.4.
Boss 6
2.5.
Luật chơi 7
CHƯƠNG III: NỘI DUNG 9
3.1.
Tổ chức lưu trữ game 9
3.2.
Nhóm các hàm điều khiển 10
3.2.1.
Nhóm các hàm thao tác với đạn 10
3.2.2.
Nhóm các hàm thao tác với xe tăng 11
3.2.3.
Nhóm các hàm điều khiển xe tăng của địch 12
3.2.4.
Hàm điều khiển Boss 13
3.2.5.
Nhóm các hàm điều khiển việc chơi game của người chơi 13
3.3.
Nhóm các hàm đồ họa 14
3.3.1.
Hiển thị một điểm ảnh trên màn hình 14
3.3.2.
Hàm hiển thị một số nguyên ra màn hình đồ họa 15
3.3.3.
Nhóm các hàm hiển thị các đối tượng trong game 16
ii
3.3.4.
Nhóm các hàm điều khiển giao diện khi chơi game 17
3.3.5.
Màn hình Welcome 20
3.3.6.
Menu chính 22
3.3.7.
High Score 23
3.3.8.
Option 24
3.3.9.
Help 25
3.3.10.
About 26
3.4.
Nhóm các hàm khác 27
3.4.1.
Nhóm các hàm điều khiển cửa sổ chương trình 27
3.4.2.
Nhóm các hàm kiểm tra. 27
3.4.3.
Nhóm các hàm định hình hệ thống 28
3.4.4.
Nhóm các hàm thao tác với chuột 28
3.5.
Xây dựng một số level cho game 28
CHƯƠNG IV: KẾT LUẬN 32
4.1.
Tóm tắt kết quả nghiên cứu 32
4.2.
Đề xuất và hướng phát triển 32
TÀI LIỆU THAM KHẢO 34
iii
HÌNH ẢNH
Hình 1: Xe tăng địch 3
Hình 2: Xe tăng do người chơi điều khiển 3
Hình 3: Đạn 3
Hình 4: Di chuyển xe tăng khi không bị vật cản 4
Hình 5: Di chuyển khi xe tăng bị cản một bên ở phía trước 5
Hình 6: Di chuyển xe tăng khi bị cản cả hai bên ở phía trước 6
Hình 7:
Di chuyển khi xe tăng bị cản ở phía sau 6
Hình 8: Boss 6
Hình 9: Màn hình Welcome 20
Hình 10: Menu chính của chương trình 22
Hình 11: Bảng xếp hạng người chơi 23
Hình 12: Giao diện Option 24
Hình 13: Giao diện Help 25
Hình 14: Giao diện About 26
Hình 15: Level 1 29
Hình 16: Level 2 29
Hình 17: Level 3 30
Hình 18: Level 4 30
Hình 19: Đấu với Boss ở cuối mỗi Level 31
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
1
GVHD: ThS. Lê Thị Hồng
CHƯƠNG I: MỞ ĐẦU
1.1. Lí do chọn đề tài
Vào những năm 80, khi máy tính và Internet vẫn chưa xuất hiện thì thứ giải
trí “xa xỉ” nhất đối với những đứa trẻ con đô thị là màn hình tivi và máy điện tử
bốn nút Nintendo của Nhật. Chính các trò chơi điện tử kinh điển thuở thập niên
80 này là sự khởi đầu của nguồn cảm hứng sáng tạo cho những game online ăn
khách sau này.
Thật thiếu sót nếu không liệt kê trò Battle City – bắn tăng – vào dòng game
kinh điển của một thế hệ. Trò chơi này được Namco bán năm 1985 trên hệ máy
NES, sau đó được phát triển cho một số nền máy như Game Boy, Arcade, Sharp
X1. Battle City có khoảng 35 màn chơi mà khi vượt qua hết game thủ sẽ quay về
chơi lại từ đầu với mức độ khó hơn. Ngoài ra, trò chơi cũng có chế độ cho phép
thay đổi và tự tạo ra bản đồ.
Máy điện tử Brick game đã thực sự tạo nên một cuộc cách mạng trong các
phương tiện giải trí cầm tay từ những năm 1993 – 1994. Hiếm có cô cậu học sinh
nào thời đó không bị “hút hồn” vào màn hình đen trắng của chiếc máy này trong
nỗ lực chinh phục đỉnh cao của trò chơi “xếp gạch”. Các phiên bản về sau của
Brick game còn có thể các trò khác như đấm bốc hay đua xe.
Tuổi thơ đã đi qua và không bao giờ trở lại, đến bao giờ game thủ Việt mới
có thể sống lại cảm giác của một thời đam mê điện tử bốn nút, có thể chơi đi chơi
lại một trò chơi mà không thấy chán? Ngày đó, bao giờ?
Để mang hồi tưởng lại
một thời tuổi thơ với bao điều thú vị, tôi đã quyết định lựa chọn đề tài “Mô phỏng
game bắn tăng trên máy điện tử cầm tay Brick Game”, mời các bạn tìm hiểu
phần nội dung đề tài.
1.2. Mục tiêu, nhiệm vụ của đề tài
1.2.1. Mục tiêu
Đề tài này được thực hiện nhằm tạo ra một chương trình mô phỏng giao diện
và cách thức hoạt động của game bắn tăng trên máy điện tử cầm tay Brick game.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
2
GVHD: ThS. Lê Thị Hồng
1.2.2. Nhiệm vụ
- Tổ chức lưu trữ game một cách hợp lí nhất.
- Xây dựng nhóm các hàm điều khiển mô phỏng hoạt động của game.
- Xây dựng nhóm các hàm đồ họa mô phỏng giao diện của game.
- Xây dựng nhóm các hàm điều khiển cửa sổ, kiểm tra, định hình hệ
thống.
- Đọc chuột và bạn phím đồng thời trong quá trình chơi game.
- Xây dựng một số level cho game.
1.3. Khách thể, đối tượng và phạm vi nghiên cứu
1.3.1. Khách thể nghiên cứu
Cài đặt chương trình mô phỏng game bắn tăng trên máy điện tử cầm tay
Brick Game.
1.3.2. Đối tượng và phạm vi nghiên cứu
Game bắn tăng trên máy điện tử cầm tay Brick Game.
1.4. Phương pháp nghiên cứu
- Phương pháp thu thập tài liệu: thu thập tài liệu từ những bài báo khoa
học, các trang web tin học và một số ebook về đề tài nghiên cứu, giáo
trình và các tài liệu học tập khác.
- Phương pháp phân tích và tổng hợp tài liệu: từ những tài liệu đã thu
thập, tiến hành tìm hiểu, phân tích và tồng hợp nội dung liên quan đến
đề tài.
- Phương pháp chuyên gia: trong quá trình nghiên cứu có sự góp ý, điều
chinh từ giáo viên hướng dẫn.
- Phương pháp phân tích và tổng hợp kinh nghiệm: sau quá trình tìm
hiểu và đúc kết kinh nghiệm, tiến hành tổng hợp và hoàn thiện đề tài.
- Phương pháp thực nghiệm: sau khi cài đặt xong chương trình cần xây
dựng một số bộ test tiêu biểu và thực hiện kiểm tra tính đúng đắn dựa
trên kết quả thu được từ chương trình.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
3
GVHD: ThS. Lê Thị Hồng
CHƯƠNG II: CƠ SỞ LÍ LUẬN
2.1. Xe tăng
Ở trong game, mỗi xe tăng được biểu diễn bởi 6 điểm ảnh; điểm ảnh ở phía
trước chính là nòng của xe tăng. Hình 1 biểu diễn hình dạng của xe tăng khi ở
những hướng khác nhau tương ứng là lên trên, sang trái, xuống dưới và sang phải.
Xe tăng do người chơi điều khiển cũng giống như xe tăng của địch, chỉ khác
ở chỗ có tâm với một màu sắc khác để phân biệt (hình 2).
2.2. Đạn
Mỗi viên đạn được biểu diễn bởi 1 điểm ảnh. Khi được một xe tăng bắn ra,
nó sẽ có vị trí ban đầu ở ngay trước nòng của xe tăng đó (hình 3). Viên đạn sẽ bay
theo hướng ban đầu và sẽ không đổi hướng trong suốt quá trình. Khi viên đạn
Hình 1: Xe tăng địch
Hình 3: Đạn
Hình 2: Xe tăng do người chơi điều khiển
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
4
GVHD: ThS. Lê Thị Hồng
chạm vào giới hạn của địa hình, một xe tăng thì viên đạn sẽ bị hủy. Khi đạn chạm
vào một vật cản của địa hình, ô địa hình đó sẽ bị phá hủy, đồng thời viên đạn đó
cũng bị hủy. Khi hai hay nhiều viên đạn chạm vào nhau, tất cả chúng sẽ bị hủy.
2.3. Di chuyển
Trong game, mỗi xe tăng có quyền tự do di chuyển trên khắp địa hình nhưng
phải tuân thủ theo những quy tắc sau:
- Khi phía trước của xe tăng không bị cản bởi vật cản (vật cản địa hình
hoặc bởi một xe tăng khác) và xe tăng di chuyển một nấc cùng hướng
với hướng hiện tại của xe tăng (xe tiến lên một nấc) thì toàn thân của
nó sẽ được dịch chuyển 1 ô về hướng đó.
- Khi xe tăng di chuyển một nấc về một hướng khác so với hướng hiện
tại của xe tăng (xe rẽ trái, rẽ phải hoặc quay đầu) và những ô thuộc xe
Hình 4: Di chuyển xe tăng khi không bị vật cản
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
5
GVHD: ThS. Lê Thị Hồng
tăng khi di chuyển không có vật cản thì tọa độ tâm của nó là không
đổi và chỉ xoay toàn thân về hướng tương ứng (hình 4).
- Khi phía trước của xe tăng có vật cản ở một phía thì nó không thể tiến
về phía trước được; tuy nhiên nó vẫn có thể rẽ về 1 trong 3 hướng còn
lại nếu như hướng đó không có vật cản. Khi xe tăng rẽ về hướng ngược
với hướng có vật cản, toàn thân của xe tăng dịch chuyển về hướng đó
1 nấc, đồng thời thân xe tăng quay về hướng đó (hình 5).
- Khi xe tăng bị vật cản ở cả hai bên phía trước, nó không thể tiến về
phía trước cũng như rẽ trái hay rẽ phải, lúc này nó chỉ có thể quay đầu.
Khi quay đầu, ngoài việc xe tăng đổi hướng thì nó còn được dịch
chuyển về hướng đó 1 nấc (hình 6).
Hình 5: Di chuyển khi xe tăng bị cản một bên ở phía trước
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
6
GVHD: ThS. Lê Thị Hồng
- Khi xe tăng bị một vật cản ở phía sau (bởi nòng của một xe tăng khác),
nó không thể rẽ trái, rẽ phải hay quay đầu, nó chỉ có thể tiến về phía
trước (hình 7).
2.4. Boss
Boss được biểu diễn bởi 81 điểm ảnh như hình 8. Toàn thân Boss được bọc
thép rất chắc chắn nên bạn chỉ có thể làm tổn thương Boss bằng cách bắn trúng
điểm tận cùng trên nòng của Boss (điểm yếu). Khi Boss xuất hiện thì luôn ở tận
Hình 6: Di chuyển xe tăng khi bị cản cả hai bên ở phía trước
Hình 8: Boss
Hình 7: Di chuyển khi xe tăng bị cản ở phía sau
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
7
GVHD: ThS. Lê Thị Hồng
cùng, phía trên của địa hình. Boss chỉ có thể di chuyển qua trái và qua phải theo
một quỹ đạo nhất định. Khi Boss bắn ra một viên đạn, viên đạn đó sẽ xuất hiện
ngay phía trước nòng của Boss và sẽ bay từ trên xuống dưới.
Khi ở chế độ đánh Boss, xe tăng do người chơi điều khiển sẽ xuất hiện ở tận
cùng, phía dưới của địa hình, xe tăng do người chơi điều khiển sẽ di chuyển ngang
và luôn hướng nòng về phía Boss.
2.5. Luật chơi
Tại mỗi màn chơi, số lượng xe tăng của quân địch có mặt không quá 8. Khi
một xe tăng của quân địch bị tiêu diệt, một xe tăng khác sẽ xuất hiện thay thế. Xe
tăng của quân địch có thể xuất hiện ở 1 trong 6 vị trị trên địa hình và sẽ di chuyển
và bắn một cách ngấu nhiên. Đạn của xe tăng địch không làm hại quân địch mà
chỉ có đạn do xe tăng người chơi bắn ra mới có thể tiêu diệt được quân địch.
Người chơi sẽ được yêu cầu tiêu diệt một số lượng xe tăng nhất định, khi
hoàn thành nhiệm vụ này, người chơi sẽ được đấu với Boss; nếu xe tăng người
chơi điều khiển điều khiển bị trúng đạn thì ngay lập tức nó sẽ nổ và người chơi
phải chơi lại màn chơi đó, đồng thời số lượt chơi còn lại sẽ bị trừ đi 1.
Khi đấu với Boss, người chơi sẽ được giao nhiệm vụ bắn trúng điểm yếu của
Boss một lượng đạn nhất định để tiêu diệt được nó và hoàn thành nhiệm vụ. Khi
bị trúng đạn của Boss, xe tăng do người chơi điều khiển sẽ nổ ngay tức thì và
người chơi sẽ phải quay lại chiến đấu với Boss từ đầu đồng thời số lượt chơi còn
lại sẽ bị trừ đi 1. Sau khi hạ được Boss của Level đó, người chơi sẽ được đưa tới
Level tiếp theo với độ khó cao hơn.
Trong quá trình chơi, người chơi có thể tạm dừng bất cứ lúc nào với chức
năng Pause hay dừng chơi với chức năng Stop. Khi chọn chức năng Stop, toàn bộ
thông tin liên quan đến trò chơi sẽ được lưu lại; người dùng có thể thoát khỏi trò
chơi và tiếp tục bất cứ lúc nào nếu muốn.
Khi chức năng Reset được gọi tới khi người dùng đang chơi, toàn bộ kết quả
sẽ bị hủy bỏ, người dùng sẽ chơi lại game từ đầu.
Khi xe tăng do người chơi điều khiển bị nổ và số lượt chơi còn lại đã hết thì
người chơi sẽ thua. Trò chơi sẽ tự động cập nhật bảng xếp hạng và yêu cầu người
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
8
GVHD: ThS. Lê Thị Hồng
chơi nhập tên vào (nếu như số điểm của người chơi lớn hơn của người chơi có thứ
hạng 10 trong bảng xếp hạng).
Khi người chơi hoàn thành được tất cả những Level trong game, trò chơi sẽ
kết thúc, kết quả của người chơi sẽ được cập nhật vào bảng thứ hạng, người chơi
có thể chơi lại từ đầu nếu muốn.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
9
GVHD: ThS. Lê Thị Hồng
CHƯƠNG III: NỘI DUNG
3.1. Tổ chức lưu trữ game
Các thông tin chính về game được lưu trữ bằng những biến sau:
char a[maxx+2][maxy+2];
int score=0, destroy=0, level=1, target=0, cursor[5], turn=4;
int mball[101][4], c_mball=0, eball[101][4], c_eball=0, enemy[11][4], c_enemy=0;
int a_boss[5];
Trong đó:
- char a[maxx+2][maxy+2]
là biến mảng dùng để lưu lại toàn bộ địa
hình trong game, mỗi phần tử của mảng ứng với mỗi điểm ảnh trên
địa hình.
- int score=0, destroy=0, level=1, target=0, cursor[5], turn=4 lần lượt
là các biến dùng để lưu lại số điểm của người chơi đạt được; nhiệm vụ
mà người chơi đã hoàn thành được trong mỗi level; level hiện tại của
người chơi; mục tiêu của level hiện tại; những thông tin liên quan đến
xe tăng do người chơi điều khiển; số lượt chơi còn lại.
- int mball[101][4], c_mball=0, eball[101][4], c_eball=0,
enemy[11][4], c_enemy=0 lần lượt là các biến dùng để lưu lại thông
tin về những viên đạn do xe tăng người chơi điều khiển bắn ra; số
lượng đạn do xe tăng người chơi bắn ra hiện có trên màn hình; thông
tin về những viên đạn do xe tăng địch bắn ra; số lượng đạn do xe tăng
địch bắn ra hiện có trên màn hình; thông tin về những xe tăng địch
hiện có trên màn hình; số lượng xe tăng địch hiện có trên màn hình.
- int a_boss[5]
là mảng dùng để lưu các thông tin liên quan tới Boss
trong mỗi level.
Ba biến khác được sử dụng:
string path;
int lv_max=0;
int g_ct=0;
char r_name[12][16];
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
10
GVHD: ThS. Lê Thị Hồng
int r_score[12];
Trong đó:
- string path dùng để lưu lại thông tin về đường dẫn tới thư mục cài đặt
của game, đường dẫn này sẽ được cập nhật liên tục mỗi khi game đươc
thực thi.
- int lv_max=0 dùng để lưu lại thông tin về level tối đa đang được game
hỗ trợ. Khi người chơi vượt được qua level này thì game sẽ kết thúc.
Biến này sẽ được tự động cập nhật giá trị mỗi khi game được thực thi,
vì vậy, nếu muốn tăng số lượng level của game, ta chỉ cần copy file
lưu trữ thông tin về level của game vào thư mục cài đặt, game sẽ tự
động nhận diện sự thay đổi này khi khởi động lại.
- char r_name[12][16] và int r_score[12] là hai biến dùng để lưu lại
bảng xếp hạng của người chơi. Chúng sẽ được tự động nạp vào khi
game khởi động và cập nhật khi có một người chơi nào đó vượt qua
thành tích của người chơi đứng cuối cùng trong bảng xếp hạng.
Ngoài ra, còn một số biến khác dùng để lưu lại thông tin về sự cài đặt của
người chơi:
int sound=1, music=1, speed=6;
bool InFullScreen=false;
int X0=0, Y0=0;
Trong đó:
- int sound=1, music=1, speed=6 là 3 biến dùng để lưu lại thông tin về
việc bật hay tắt hiệu ứng âm thanh, nhạc nền và tốc độ của game.
- bool InFullScreen=false dùng để lưu lại thông tin về cửa sổ game có
đang ở chế độ toàn màn hình hay chế độ cửa sổ thông thường.
- int X0=0, Y0=0 là hai biến dùng để lưu lại tọa độ trên cùng bên trái
của màn hình hiển thị game.
3.2. Nhóm các hàm điều khiển
3.2.1. Nhóm các hàm thao tác với đạn
Các hàm thao tác với đạn bao gồm:
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
11
GVHD: ThS. Lê Thị Hồng
void huy_dan(int i, int ball[][4], int &c_ball, int del=1);
void huy_danxy(int x, int y, int direction, int ball[][4], int &c_ball);
void huy_danxy_same(int x, int y, int direction, int ball[][4], int &c_ball, int &p);
Trong đó:
- Hàm void huy_dan(int i, int ball[][4], int &c_ball, int del=1) dùng để
hủy viên đạn thứ i trong mảng đạn ball với số đạn trong mảng hiện tại
là c_ball. Đối số del đưa vào để cho phép hàm này xóa viên đạn trên
màn hình đồ họa hay không.
- Hàm void huy_danxy(int x, int y, int direction, int ball[][4], int
&c_ball) dùng để xóa tất cả những viên đạn có tọa độ (x, y) và có
hướng bay là direction trên màn hình game ra khỏi mảng lưu đạn ball,
sau khi thao tác xóa hoàn thành, số đạn c_ball được lưu trên mảng sẽ
giảm đi 1.
- Hàm void huy_danxy_same(int x, int y, int direction, int ball[][4], int
&c_ball, int &p) dùng để xóa tất cả những viên đạn có tọa độ (x, y) và
có hướng bay là direction trên màn hình game ra khỏi mảng lưu đạn
ball, sau khi thao tác xóa hoàn thành, số đạn c_ball được lưu trên mảng
sẽ giảm đi 1, viên đạn thứ p trên mảng lưu đạn ban đầu sẽ biến đổi
thành viên đạn thứ p trên mảng lưu đạn sau khi xóa.
3.2.2. Nhóm các hàm thao tác với xe tăng
Các hàm thao tác với xe tăng bao gồm:
int empty(int x, int y, int direction);
int damage(int x, int y, int direction, int xt, int yt, int directiont);
void move(int &x, int &y, int &o_direction, int n_direction);
void shoot(int x, int y, int direction, int a_ball[][4], int &c_ball);
int die(int x, int y, int direction, int ball[][4], int &c_ball);
Trong đó:
- Hàm int empty(int x, int y, int direction) dùng để kiểm tra xem tại vị
trí (x, y) có còn trống để một xe tăng có hướng direction nằm hay
không.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
12
GVHD: ThS. Lê Thị Hồng
- Hàm int damage(int x, int y, int direction, int xt, int yt, int directiont)
dùng để kiểm tra xem một xe tăng nằm ở tọa độ (xt, yt) với hướng
directiont có bị một viên đạn có tọa độ (x, y) với hướng direction uy
hiếp hay không.
- Hàm void move(int &x, int &y, int &o_direction, int n_direction)
dùng để di chuyển một xe tăng ở vị trí (x, y) với hướng là o_direction
sang hướng n_direction.
- Hàm void shoot(int x, int y, int direction, int a_ball[][4], int &c_ball)
dùng để bắn một viên đạn ra từ xe tăng có tọa độ (x, y) với hướng
direction. Viên đạn được bắn ra sẽ được lưu vào mảng a_ball với số
đạn được lưu trong mảng c_ball tăng lên 1.
- Hàm int die(int x, int y, int direction, int ball[][4], int &c_ball) dùng
để kiểm tra xem xe tăng có tọa độ (x, y) với hướng direction có bị giết
bới một viên đạn thuộc mảng ball có c_ball viên đạn hay không.
3.2.3. Nhóm các hàm điều khiển xe tăng của địch
Những hàm điều khiển xe tăng của địch được sử dụng bao gồm:
void sinhdich(int enemy[][4], int &c_enemy);
void dichlam(int enemy[][4], int &c_enemy, int eball[][4], int &c_eball, int mball[][4],
int &c_mball);
Trong đó:
- Hàm void sinhdich(int enemy[][4], int &c_enemy) dùng để sinh ra
một xe tăng địch tại một trong 6 vị trí trên màn hình. Sau khi xe tăng
được sinh ra sẽ được lưu vào mảng enemy với số xe tăng trong mảng
c_enemy được tăng lên 1. Việc sinh địch phục thuộc vào số lượng xe
tăng địch cho phép tối đa trên màn hình e_max.
- Hàm void dichlam(int enemy[][4], int &c_enemy, int eball[][4], int
&c_eball, int mball[][4], int &c_mball) dùng để điều khiển hoạt động
của tất cả các xe tăng của địch. Các thao tác này được thực hiện một
cách ngẫu nhiên phụ thuộc vào những con số được sinh ngẫu nhiên
bởi hệ thống.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
13
GVHD: ThS. Lê Thị Hồng
3.2.4. Hàm điều khiển Boss
void boss_lam()
{
if (a_boss[2]==8 && a_boss[3]==-1)
a_boss[3]=1;
else if (a_boss[2]==33 && a_boss[3]==1)
a_boss[3]=-1;
else if (a_boss[4]==b_speed)
{
p_boss(a_boss[1], a_boss[2], 1);
if (a_boss[3]==1)
a_boss[2]++;
else
a_boss[2] ;
p_boss(a_boss[1], a_boss[2], 0);
a_boss[4]=0;
}
if (a_boss[4]<b_speed)
a_boss[4]++;
if (rand()%2 && rand()%2 && rand()%2)
shoot(a_boss[1]+9, a_boss[2], 3, eball, c_eball);
p_ball(eball, c_eball, mball, c_mball);
}
Hàm này sẽ điều khiển toàn bộ hoạt động của Boss bao gồm di chuyển và
bắn. Cách thao tác này cũng được thực hiện phụ thuộc vào những con số ngẫu
nhiên được sinh ra bởi hệ thống. Tốc độ bắn của Boss phụ thuộc vào b_speed
được quy định bởi chương trình.
3.2.5. Nhóm các hàm điều khiển việc chơi game của người chơi
Các hàm điều khiển này bao gồm:
void lv_initial();
int play();
int boss();
void newgame();
void continuegame();
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
14
GVHD: ThS. Lê Thị Hồng
Trong đó:
- Hàm void lv_initial() dùng để khởi tạo cho mỗi level bao gồm đọc địa
hình vào từ file, khởi tạo địch và một vài thông số khác liên quan tới
level đó.
- Hàm int play() dùng để điều khiển tất cả các thao tác của người chơi
và xe tăng của địch khi chơi ở chế độ bắn xe tăng. Giá trị trả về của
hàm trả về sẽ quyết định thao tác tiếp theo của toàn chương trình.
- Hàm int boss() dùng để điều khiển tất cả các thao tác của người chơi
và Boss khi chơi ở chế độ Boss. Giá trị trả về của hàm sẽ quyết định
thao tác sẽ thực hiện tiếp theo của toàn chương trình.
- Hàm void newgame() sẽ được gọi tới khi người dùng chơi một ván
mới. Hàm này sẽ điều khiển toàn bộ quá trình chơi game của người
dùng qua các level. Hoạt động của hàm sẽ phụ thuộc vào giá trị trả về
của hàm play() và boss() đã được đề cập tới ở trên.
- Hàm void continuegame() cũng tương tự như hàm play(), tuy nhiên
hàm này được gọi tới khi người dùng tiếp tục chơi với một trạng thái
được lưu từ trước. Khi được gọi đến, hàm này sẽ đọc tất cả những
thông tin liên quan tới game đã được người chơi dừng lại tại phiên
trước; sau khi đọc dữ liệu, quá trình chơi game sẽ được tiếp tục.
3.3. Nhóm các hàm đồ họa
3.3.1. Hiển thị một điểm ảnh trên màn hình
Mỗi điểm ảnh trên màn hình chơi game được hiển thị ra bởi hàm
void point(int x, int y, int color=0)
{
setcolor(color);
rectangle(X0+xlt+(y-1)*p_size+p_size/2-2, Y0+ylt+(x-1)*p_size+p_size/2-2,
X0+xlt+(y-1)*p_size+p_size/2+2, Y0+ylt+(x-1)*p_size+p_size/2+2);
setfillstyle(1, color);
floodfill(X0+xlt+(y-1)*p_size+p_size/2, Y0+ylt+(x-1)*p_size+p_size/2, color);
rectangle(X0+xlt+(y-1)*p_size+1, Y0+ylt+(x-1)*p_size+1, X0+xlt+y*p_size-1,
Y0+ylt+x*p_size-1);
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
15
GVHD: ThS. Lê Thị Hồng
}
Hàm này sẽ vẽ ra một điểm ảnh có màu là color với một hình vuông rỗng
phía ngoài và một hình vuông đặc ở phía trong.
3.3.2. Hàm hiển thị một số nguyên ra màn hình đồ họa
Trong thư viện của C không hỗ trợ sẵn hàm xuất một số nguyên lên màn hình
đồ họa, chính vì vậy trong chương trình của chúng tôi đã sử dụng hàm sau để xuất
một số nguyên lên màn hình đồ họa tại một vị trí tùy ý:
void p_number(int num, int x, int y, int color=getcolor(), int size=1, int font=8)
{
char s[15];
s[0]='0';
s[1]=0;
int i=0;
while (num!=0)
{
s[i]=48+num%10;
s[i+1]=0;
num=num/10;
i++;
}
int l=strlen(s);
for (i=0; i<l/2; i++)
{
char temp=s[i];
s[i]=s[l-i-1];
s[l-i-1]=temp;
}
settextstyle(font, 0, size);
int c=getcolor();
if (color!=c)
setcolor(color);
outtextxy(x, y, s);
if (color!=c)
setcolor(c);
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
16
GVHD: ThS. Lê Thị Hồng
}
Trong đó, num là con số cần được hiển thị; x, y lần lượt là hai tọa độ ứng với
vị trí (x, y) cần hiển thị; color là màu chữ; size là kích thước chữ; font là font chữ
cần hiển thị.
Hàm này hoạt động như sau: Đầu tiên, một xâu s được khởi tạo với giá trị
‘0’ dùng để lưu xâu chuyển đổi.Tiếp theo, từng chữ số của con số sẽ được
chuyển đổi thành các kí tự số và lưu vào trong s. Tiếp đến, xâu s sẽ được đảo
ngược lại trật tự. Cuối cùng là hiển thị xâu s ra màn hình tại đúng tọa độ (x, y).
3.3.3. Nhóm các hàm hiển thị các đối tượng trong game
Nhóm này bao gồm các hàm:
void p_ball(int ball1[][4], int &c_ball1, int ball2[][4], int &c_ball2);
void p_army(int x, int y, int direction, int e=0, int del=0);
void p_die(int x, int y);
void p_boss(int x, int y, int del);
Trong đó :
- Hàm void p_ball(int ball1[][4], int &c_ball1, int ball2[][4], int
&c_ball2) dùng để vẽ c_ball viên đạn trong mảng lưu đạn ball ra màn
hình. Những viên đạn nào rơi vào một trong những điều kiện hủy sẽ
được hủy bỏ ra khỏi mảng lưu đạn.
- Hàm void p_army(int x, int y, int direction, int e=0, int del=0) dùng
để hiển thị một xe tăng tại tọa độ (x, y) với hướng direction ra màn
hình, đồng thời đánh dấu vị trí của xe tăng đó trong mảng a. Nếu e =
1 thì hiển thị xe tăng của quân địch, nếu e = 0 thì hiển thị ra xe tăng
của người chơi. Nếu del = 1 thì xóa xe tăng đó đi, còn del = 0 thì vẽ
xe tăng đó ra.
- Hàm void p_die(int x, int y) dùng để hiển thị hiệu ứng nổ khi xe tăng
do người dùng điều khiển bị trúng đạn.
- Hàm void p_boss(int x, int y, int del) dùng để hiển thị Boss ra màn
hình ở tọa độ (x, y) được đưa vào. Đối số del sẽ quyết định hành động
này là vẽ ra hay là xóa đi.
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
17
GVHD: ThS. Lê Thị Hồng
3.3.4. Nhóm các hàm điều khiển giao diện khi chơi game
Hàm xóa màn hình
void g_clrscr()
{
if (InFullScreen)
{
setbkcolor(0);
setfillstyle(10, 8);
bar(0, 0, GetSystemMetrics(SM_CXSCREEN), Y0);
bar(0, Y0+Width, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
bar(0, Y0, X0, Y0+Width);
bar(X0+Height, Y0, GetSystemMetrics(SM_CXSCREEN), Y0+Width);
}
setfillstyle(1, 2);
bar(X0, Y0, X0+Height, Y0+Width);
}
Nhiệm vụ của hàm này là xóa toàn bộ các đối tượng trên màn hình đồ họa
và sau đó khởi tạo lại màn hình cửa sổ chơi game theo đúng kiểu cửa sổ đã được
thiết lập (Maximized Window hay Nomal Window).
Hàm hiển thị địa hình cho mỗi level
void p_frame()
{
g_clrscr();
setcolor(0);
rectangle(X0+12, Y0+32, X0+428, Y0+648);
rectangle(X0+19, Y0+39, X0+421, Y0+641);
setfillstyle(1, 0);
floodfill(X0+16, Y0+36, 0);
for (int i=1; i<=maxx; i++)
for (int j=1; j<=maxy; j++)
if (i==cursor[1] && j==cursor[2])
point(i, j, 15);
else if (a[i][j]=='*')
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
18
GVHD: ThS. Lê Thị Hồng
point(i, j, 4);
else if (a[i][j]==14)
point(i, j, 14);
else if (a[i][j]=='±')
point(i, j, 6);
else if (a[i][j]!=32)
point(i, j);
setcolor(1);
setbkcolor(2);
settextstyle(8, 0, 1);
outtextxy(X0+460, Y0+40, "Score");
outtextxy(X0+550, Y0+40, ":");
p_number(score, X0+590, Y0+40);
outtextxy(X0+460, Y0+65, "Turn");
outtextxy(X0+550, Y0+65, ":");
p_number(turn, X0+590, Y0+65);
outtextxy(X0+460, Y0+90, "Target");
outtextxy(X0+550, Y0+90, ":");
p_number(target, X0+590, Y0+90);
outtextxy(X0+460, Y0+115, "Destroy");
outtextxy(X0+550, Y0+115, ":");
p_number(destroy, X0+590, Y0+115);
settextstyle(2, 0, 5);
outtextxy(X0+470, Y0+190, "Level");
outtextxy(X0+510, Y0+190, ":");
p_number(level, X0+530, Y0+190, getcolor(), 5, 2);
settextstyle(2, 0, 5);
outtextxy(X0+580, Y0+190, "Speed");
outtextxy(X0+620, Y0+190, ":");
p_number(speed, X0+640, Y0+190, getcolor(), 5, 2);
settextstyle(2, 0, 5);
outtextxy(X0+470, Y0+215, "Music");
outtextxy(X0+510, Y0+215, ":");
if (music)
outtextxy(X0+530, Y0+215, "On");
Mô phỏng game bắn tăng trên máy điện tử cầm tay Brick Game
SVTH: Bùi Hữu Giáp
19
GVHD: ThS. Lê Thị Hồng
else
outtextxy(X0+530, Y0+215, "Off");
outtextxy(X0+580, Y0+215, "Sound");
outtextxy(X0+620, Y0+215, ":");
if (sound)
outtextxy(X0+640, Y0+215, "On");
else
outtextxy(X0+640, Y0+215, "Off");
animation_play();
}
Nhiệm vụ của hàm này là nhận các đối tượng từ các hàm khác sau đó hiển
thị địa hình ra màn hình theo đúng với level.
Hàm hiển thị hiệu ứng động trên màn hình chơi game
void animation_play()
{
setfillstyle(1, 3);
setcolor(3);
rectangle(X0+460, Y0+300, X0+670, Y0+560);
settextstyle(8, 0, 2);
outtextxy(X0+512, Y0+400, "Placement");
outtextxy(X0+512, Y0+440, "Animation");
}
Hàm này có nhiệm vụ hiển thị những hiệu ứng động vui mắt trên màn hình
chơi game giúp người dùng hứng thú hơn với trò chơi.
Nhóm các hàm hiển thị thông báo
Nhóm này bao gồm các hàm:
void mes_pause(int x=220, int y=340, int over=0);
void mes_the_end();
Các hàm này làm nhiệm vụ hiển thị ra những thông báo tương ứng tới người
dùng.