Tải bản đầy đủ (.doc) (44 trang)

Lập trình trò chơi bắn máy bay

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (146.17 KB, 44 trang )

Lập Trình Trò Chơi Bắn Máy Bay

Mục lục

Lời nói đầu... ..3
Phần I: Phân tích bài toán.4
1. Bài toán ...4
2. Phân tích bài toán...4
Phần II: Phân rã chức năng....6
1. Mô tả trò chơi .6
2. Sơ đồ modul hoá .6
3. Phân rã chức năng...7
Phần III: Tổ chức dữ liệu cho chơng trình...9
1. Các biến toàn cục ...9
2. Các biến cục bộ10
Phần IV: Thiết kế giải thuật.11
1. Giải thuật vẽ máy bay....11
a. T tởng của giải thuật...11
b. Giải thuật11
2. Giải thuật vẽ nòng súng.11
a. T tởng của giải thuật11
b. Lu đồ .12
c. Giải thuật.12
3. Giải thuật vẽ viên đạn13
a. T tởng của giải thuật13
b. Giải thuật 13
4. Giải thuật kiểm tra xem đạn có trúng máy bay không?.13
a. T tởng của giải thuật13
b. Lu đồ .....13
c. Giải thuật.14
5. Giải thuật vẽ đờng đi của viên đạn..15


a. T tởng của giải thuật15
b. Giải thuật.15
6. Giải thuật làm nổ máy bay.16
a. T tởng của giải thuật16


Lập Trình Trò Chơi Bắn Máy Bay
b. Lu đồ .16
c. Giải thuật.18
Phần V: Một số giao diện của chơng trình..19
1. Giao diện của trò chơi.19
2. Màn hình thiết lập thông số cho chơng trình.19
3. Hộp thoại khi thoát chơng trình.20
Phần VI: Mã nguồn của chơng trình21


Lập Trình Trò Chơi Bắn Máy Bay

LờI NóI ĐầU
Trong thời đại công nghệ thông tin ngày nay, tin học đợc áp dụng vào hầu hết
các ngành nghề, lĩnh vực nh kinh tế, văn hoá, xã hội Trong lĩnh vực giải trí thì công
nghệ thông tin càng đợc ứng dụng mạnh mẽ hơn, trong đó Game nổi lên với những trò
chơi mới đầy hấp dẫn cả về nội dung, hình ảnh và âm thanh. Qua 4 năm học tập và
rèn luyện trên giảng đờng của Khoa Công Nghệ Tin Học - Viện Đại Học Mở Hà Nội
cùng với sự dạy dỗ chỉ bảo tận tình của các thầy cô giáo trong khoa, em đã trang bị
cho mình đợc một số kiến thức nhất định về ngành công nghệ thông tin. Những kiến
thức này sẽ là hành trang giúp em có thể đứng vững khi ra trơng và có thể đóng góp
một phần nhỏ bé của mình trong quá trình tin học hoá và trong công cuộc phát triển
của đất nớc.
Hiện nay em đã hoàn thành các chơng trình học của trờng và của khoa đã đề ra,

đã đến lúc em phải đối mặt với những thử thách mới, đầu tiên đó là bài tập tốt nghiệp
với đề tài Lập trình trò chơi bắn máy bay viết trên ngôn ngữ Turbo C mà khoa
đã giao cho. Với sự hớng dẫn của thầy giáo Thạc Sỹ Lơng Cao Đông cùng với kiến
thức và sự nỗ lực của bản thân, em đã hoàn thành bài tập tốt nghiệp.
Em xin trân trọng cảm ơn các thầy các cô trong Khoa Công Nghệ Tin Học Viện Đại Học Mở Hà Nội, cùng tất cả bạn bè và mọi ngời đã giúp đỡ, chỉ bảo trong
những năm qua, đặc biệt em chân thành cảm ơn thầy giáo Lơng Cao Đông đã quan
tâm tới em trong quá trình học tập, rèn luyện tại trờng và đã giúp đỡ, chỉ bảo em trong
quá trình làm bài tập tốt nghiệp này.
Tuy nhiên do hạn chế thời gian và đang ở những bớc đi ban đầu nên chơng
trình của em không thể tránh khỏi những thiếu sót và những mặt hạn chế. Em rất
mong đợc sự đóng góp ý kiến của các thầy cô giáo và toàn thể mọi ngời.
Em xin trân trọng cảm ơn !


Lập Trình Trò Chơi Bắn Máy Bay

Phần I: Phân Tích Bài Toán.
1.BàiToán:
Đề bài: Lập trình trò chơi bắn máy bay.
Yêucầu:
+ Các máy bay xuất hiện ngẫu nhiên tại toạ độ ngẫu nhiên trên đỉnh màn hình.
+ Dùng phím -> và <- để điều khiển quay nòng súng ở đáy màn hình.
+ Dùng phím Space để bắn.
+ Vẽ đờng chuyển động của đạn.
+ Mỗi lần bắn trúng sẽ đợc tính 1 điểm.
+ Tăng tần suất xuất hiện máy bay nếu số điểm >1/2 số máy bay xuất hiện.
+ Phím ESC để kết thúc trò chơi.
+ Có các phím nóng cho phép chơi lại, thoát, khai báo các tham số cho trò
chơi.
+ Thông báo kết quả là tỷ lệ bắn trúng máy bay.

2. Phân tích bài toán
Để xây dựng đợc chơng trình này, ta sẽ phân chia bài toán thành các modul nhỏ
(có thể là chia theo các chức năng của chơng trình), và tìm giải thuật cho từng modul
đó.
Từ yêu cầu của bài toán này có thể đa ra một số modul ban đầu nh:
+ Vẽ máy bay.
+ Vẽ đạn.
+ Vẽ súng
+ Chuyển động của nòng súng.
+ Kiểm tra va chạm
+ Xử lý bắn đạn
+ Xử lý kết thúc trò chơi
+ Thông báo kết quả
Trong những modul này có thể có các modul con khác, để giải quyết đợc những
yêu cầu này thì ta cần tổ chức dữ liệu cho từng modul và viết đợc giải thuật cho từng
modul, phải biết cách sử dụng một số phơng pháp:
+ Sử dụng một số hàm, thủ tục trong th viện đồ hoạ graphics.h nh: thủ
tục khởi tạo đồ hoạ, vẽ hình chữ nhật, vẽ đờng thẳng, tô màu, đặt
màu, cắt dán ảnh. để vẽ giao diện chơng trình.
+ Dùng vòng lặp để bắt phím
+ Sử dụng định lý Pitago trong tam giác để tính toạ độ của 1 điểm.
+ Sử dụng phơng trình đờng thẳng để vẽ đờng chuyển động của đạn.
+ Lấy và xử lý thời gian hệ thống.
+ Sử dụng phơng pháp cắt dán ảnh để vẽ đạn và máy bay.


Lập Trình Trò Chơi Bắn Máy Bay
Sau khi đã xây dựng đợc giải thuật cho từng modul thì bắt tay vào việc viết mã
cho các chơng trình con tơng ứng với từng modul. Kết nối, xử lý các chơng trình con
và xử lý các tình huống để có đợc một chơng trình hoàn thiện.



Lập Trình Trò Chơi Bắn Máy Bay

Phần II: Phân Rã Chức Năng
1. Mô tả trò chơi.
Trong trò chơi này các máy bay sẽ xuất hiện ngẫu nhiên trên màn hình. Ngời
chơi sẽ dùng các phím quy định để chơi trò này, mỗi lần tiêu diệt 1 máy bay sẽ đợc
tính 1 điểm, bắn trợt sẽ không đợc điểm nhng cũng không bị trừ điểm (vì trò chơi căn
cứ vào thời gian chơi chứ không căn cứ vào số đạn bắn ra để qua bài). Khi bắn đạn và
khi đạn trúng máy bay làm nổ báy bay đều phát ra âm thanh.
Trong khi chơi ngời chơi có thể đặt lại các thông số cho chơng trình nh:
+ Tốc độ di chuyển của nòng súng.
+ Độ khó của trò chơi (Thực chất là quy định thời gian 1 máy bay sẽ
biến mất).
+ Thời gian sẽ kết thúc một bài chơi.
Và ngời chơi cũng có thể bắt đầu chơi một bài mới hay có thể ngừng chơi bằng các
phím nóng đã đợc hớng dẫn ở bên dới màn hình.
Nếu ngời chơi qua đợc bài thì bài sau sẽ khó hơn bài trớc (máy bay sẽ biến
mất nhanh hơn bài trớc đó).
Trong mỗi bài chơi đều có các chỉ số cho phép ngời chơi biết mình đã bắn bao
nhiêu lần, đã đợc bao nhiêu điểm, máy bay đã xuất hiện bao nhiêu lần và thời gian
còn lại của bài chơi đó.
Khi ngời chơi chiến thắng hay thất bại tức là khi kết thúc trò chơi thì sẽ có một
bảng tổng kết thành tích ngời đó đã đạt đợc qua tất cả các bài đã chơi.
2. Sơ đồ modul hoá. (trang bên)


Lập Trình Trò Chơi Bắn Máy Bay


Trò Bắn Máy Bay
Khởi tạo
ban đầu

Vẽ giao
diện

Vẽ
Vẽ
khung khung Vẽ bệ
chơi thông súng
Game báo

Kiểm
tra chơi
tiếp /
thoát

Vẽ lại
nòng
súng

Giới
thiệu
Vẽ
nòng
súng

Xử lý các chương
trình con


Xử lý
phím

Kiểm
tra bắn
trúng

Xử lý
qua bài

Xử lý
bắn
trúng

Nổ máy
bay

Đếm
thời
gian

Kiểm
tra bắn

Vẽ lại
Kiểm
bệ súng tra chơi
lại


Tăng
điểm

Thông báo
kết quả

Vẽ đư
ờng đi
của đạn

đếm
máy
bay

Vẽ lại
máy
bay

Kiểm
soát giờ
chơi

Thông
báo giờ
chơi

Xử lý
qua bài

Vẽ

máy
bay

Sơ Đồ Modul Hoá
3. Phân rã chức năng.
Để đáp ứng đợc các yêu cầu của trò chơi cũng là đáp ứng đợc chức năng chính
của bài toán ta có thể phân chia thành một số các mudul cơ bản sau:


Lập Trình Trò Chơi Bắn Máy Bay
+ Khởi tạo ban đầu:
Mo dul này sẽ làm nhiệm vụ khởi tạo các biến và tham số ban đầu cho chơng
trình.
+ Vẽ máy bay:
Modul này sẽ thực hiện chức năng vẽ máy bay lên màn hình, lu hình ảnh của
máy bay vào một biến trỏ (pmb) là biến toàn cục sau đó sẽ xoá màn hình.
Modul này chỉ đợc gọi một lần trong chơng trình.
+ Vẽ đạn:
Thực hiện chức năng vẽ viên đạn và lu hình ảnh viên đạn vào biến trỏ toàn cục
(pdan), sau đó xoá màn hình
+ Vẽ đờng đi của đạn:
Tính toán toạ độ của viên đạn trên đờng chuyển động và sử dụng biến trỏ pdan
để vẽ hình ảnh đạn chuyển động.
+ Vẽ nòng súng
Chức năng này sẽ sử dụng một số tham số có sẵn cùng với công thức toán học
để tính toạ độ của nòng súng rồi vẽ nòng súng, sử dụng tham số truyền vào là
màu tô để tô màu cho nòng súng.
+ Vẽ giao diện:
Gọi tới 2 chức năng vẽ khung chơi và vẽ khung thông báo cùng với vẽ bệ súng
và dán ảnh nòng súng để tạo màn hinh chơi game.

+ Kiểm tra đạn có bắn trúng máy bay.
Modul này sẽ kiểm tra tại vị trí hiện thời của viên đạn và của máy bay thì viên
đạn có trúng máy bay không? Nếu trúng thì sẽ trả về giá trị 1 và gọi tới modul
làm nổ máy bay sau đó sẽ nhảy tới
đoạn chơng trình xử lý phím. Nếu
không trúng thì sẽ trả về giá trị 0.
+ Làm máy bay nổ
Tạo hình ảnh và âm thanh khi nổ máy bay.
+ Chơi Lại.
Là modul cho phép ngời chơi có thể chơi lại bài mình đang chơi.
+ Đặt thông số cho chơng trình:
Khi ngời chơi ấn phím quy định nào đó thì chức năng này sẽ đợc gọi. Modul
này sẽ gọi một số chơng trình con khác nh: chơng trình vẽ hộp tuỳ chọn,
chơng trình tạo nhập số liệu từ bàn phím và trả về giá trị đó . Ngời chơi sẽ
thay đổi các tham số chơng trình trên hộp tuỳ chọn option. Những thay đổi
này sẽ đợc ghi vào các biến toàn cục để các modul khác đều có thẻ sử dụng đợc.
+ Thông báo kết quả:
Modul này sẽ sử dụng kết quả xử lý của 1 số modul nh: cộng điểm, đếm máy
bay để đa kết quả của ngời chơi ra màn hình. Modul này sẽ đợc gọi khi
ngời chơi chọn mục ngừng chơi, hay ngời chơi đã thua hoặc đã thắng.


Lập Trình Trò Chơi Bắn Máy Bay

Phần III: Tổ Chức Dữ Liệu Cho Chơng Trình
Để lu trữ dữ liêu, trong chơng trình có sử dụng cả biến toàn cục và biến cục bộ,
ở một số modul có sử dụng mảng 1 chiều và mảng 2 chiều.
1. Các biến toàn cục:
+ goc_lech: là biến có kiểu số thực có chức năng lu giữ giá trị của góc lệch (tính
bằng độ) của nòng súng so với phơng ngang 0x

+ int xs1,ys1,xs2,ys2, xs3,ys3, xs4,ys4 ;
Là tám biến kiểu nguyên giữ giá trị toạ độ của 4 điểm của nòng súng. Trừ 2
biến xs1,ys1 là đựơc tính toán theo vị trí đặt bệ súng và 2 biến này không thay
đổi trong chơng trình, ngợc lại giá trị của 6 biến còn lại thay đổi liên tục
trong chơng trình.
+ int danbay;
Cho biết trạng thái của viên đạn. Nếu viên đạn vẫn ở trên màn hình thì nó đợc
gán giá trị=1 ngợc lại nó luôn giữ giá trị =0;
+ int xd,yd;
Cho biết tọa độ trên trái của viên đạn khi bay, giá trị của 2 biến này thờng
xuyên thay đổi.
+ int xmb,ymb;
Là hai biến nguyên lu trữ toạ độ trên trái của máy bay. Toạ độ này thờng
xuyên thay đổi trong chơng trình.
+ int dmb, rmb;
Chiều dài và rộng của máy bay. Giá trị của hai biến này là không thay đổi
trong toàn bộ chơng trình, nhng chúng đợc sử dụng trong nhiều modul khác
nhau nên nó phải là biến toàn cục.
+ int ban,trung,demmb;
Là ba biến nguyên để đếm tổng số lần bắn, số lần bắn trúng, và tổng số lần máy
bay xuất hiện, giá trị ban đầu của chúng đều bằng 0.
+ int rtime,goctang,dokho;
Là ba biến nguyên trong đó rtime là số thời gian (tính bằng phút) của 1 bài,
goctang là giá trị tính bằng độ để cho biết mỗi lần di chuyển nòng súng nó sẽ
tăng hay giảm bao nhiêu độ,
dokho lu tr giá trị để quy định mức độ khó của trò chơi.(Khó nhất là dokho =
1), dokho chính là số giây máy bay hiện trên màn hình.
+ int ytach;
Tọa độ đờng phân cách giữa vùng Game và vùng Thông báo, giá trị ytach còn
đợc dùng trong các chơng trình khác nh ve_be_sung

+ int x1box,y1box,x2box,y2box;
Toạ độ của hộp thoại Exitbox để xem ngời chơi có muốn thoát khỏi chơng
trình không


Lập Trình Trò Chơi Bắn Máy Bay
+ char *cban,*ctrung,*cdemmb, *tgian;
Là các biến trỏ có tác dụng lu trữ một xâu ký tự
+ char *pmb, *pdan, *pmsg;
Ba Biến trỏ lu hình ảnh của máy bay , của đạn và của hộp thoại exit. Những
biến này yêu cầu phải tồn tại xuyên suốt chơng trình, chỉ khi kết thúc trò chơi
nó mới đợc giải phóng.
+ char *ptam;
Là biến trỏ để lu trữ những hình ảnh mà dùng xong có thể giải phóng khỏi bộ
nhớ luôn.
2. Các biến cục bộ
Các chơng trình con ngoài việc sử dụng các biến toàn cục thì chơng trình nào
cũng sử dụng một vài biết cục bộ phục vụ cho riêng nó nh các biến đếm, các biến
trung gian.

Phần IV: Thiết Kế Giải Thuật


Lập Trình Trò Chơi Bắn Máy Bay

1. Giải thuật vẽ máy bay.
a. T tởng của giải thuật:
Giả sử ta vẽ máy bay với n điểm, ta lu các điểm của máy bay vào hai mảng một
chiều. Trong đó có một mảng chứa hoành độ x[n] và một mảng chứa tung độ y[n] của
từng điểm đó. Nh vậy nếu một điểm thứ m trong dãy các điểm của máy bay sẽ có toạ

độ (x[m],y[m]).
Dùng một vòng lặp để nối lần lợt các điểm này với nhạu: điểm[1] nối với
điểm[2], điểm[2] nối điểm[3], .., điểm[n-1] nối điểm[n] . Kết thúc vòng lặp ta sẽ
nối nốt điểm[n] với điểm[1].
Dùng hàm đồ hoạ để tô màu cho máy bay.
b. Giải thuật:
setcolor(màuvẽ);
for (i=1;i< n;i++)
Line(x[i], y[i], x[i+1], y[y+1]);
Line (x[1], y[1], x[1], y[1]);
2. Giải thuật vẽ nòng súng.
a. T tởng của giải thuật.
+ Ta sẽ vẽ một nòng súng có hình chữ nhật với 4 điểm (x1,y1), (x2,y2), (x3,y3),
(x4,y4). Trong chơng trình nòng súng này sẽ quay xung quanh điểm (x1,y1).
+ Những dữ kiện đã biết:
1. Điểm (x1,y1) đã biết trớc (tính đợc do nó nằm trong bệ súng) và nó là
cố định, không đổi.
2. Chiều cao(cao_sung) và chiều rộng(rong_sung) của nòng súng là một
hằng số.
3. Góc lệch là góc tạo bởi véc tơ đi qua (x1,y1) (x2,y2) với trục
0x(phơng ngang).
+ Yêu cầu đặt ra ở đây là tính đợc toạ độ của 3 điểm còn lại (x2,y2); (x3,y3);
( x4,y4).
+ Phơng Pháp: ta sẽ dùng định lý Pitago trong tam giác để tính.
+ Tính (x2,y2):
x2=x1+AB ;
x2=x1+(dài*cos() );


Lập Trình Trò Chơi Bắn Máy Bay


y2=y1-AC ;
y2=y1-(dài*sin() );
+ Tính (x3,y3):
Tơng tự cách tính (x2,y2) ở trên
ta sẽ tính đợc x3 và y3:
x3=x1+(rộng*cos(90-) );
y3=y1+ (rộng*sin(90-) );
+ Tính (x4,y4):
x4 = x2+(x3-x1);
y4= y2+ (y3-y1);
+ Vẽ:
Dùng một mảng 10 phần tử: m[ ] để lu lần lợt toạ độ của các đỉnh sau đó dùng
thủ tục drawpoly(int n, int far *s) để vẽ nòng súng, và dùng thủ tục fillpoly để tô màu
cho nòng súng.
Chú ý: Trong chơng trình phải đổi góc ra đơn vị radian.
b. Lu đồ.
begin
Cao,dài, , x1, y1
x2=x1+(dài*cos() );
y2=y1-(dài*sin() );
x3=x1+(rộng*cos(90-) );
y3=y1+ (rộng*sin(90-) ); x4 = x2+(x3-x1);
y4= y2+ (y3-y1);
setcolor(màuvẽ); m[0]=x1; m[1]=y1; m[2]=x2; m[3]=y2; m[4]=x4;
m[5]=y4;
m[6]=x3; m[7]=y3; m[8]=x1 ; m[9]=y1;
drawpoly(5,m);
setfillstyle(1,màutô); fillpoly(4,m);


end

c. Giải thuật:
setcolor(màuvẽ);
int m[9];


Lập Trình Trò Chơi Bắn Máy Bay
m[0]=x1; m[1]=y1; m[2]=x2; m[3]=y2;
m[4]=x4; m[5]=y4; m[6]=x3; m[7]=y3; m[8]=x1 ; m[9]=y1;
drawpoly(5,m);
setfillstyle(1,màutô);
fillpoly(4,m);
3. Giải thuật vẽ viên đạn
a. T tởng của giải thuật:
Viên đạn ở đây chỉ đơn giản là một hình tròn nhỏ bán kính r đợc tô màu. Do
vậy để vẽ viên đạn đơn giản ta chỉ cần dùng thủ tục circle(int x,int y, int r) để vẽ 1
hình tròn sau đó dùng thủ tục floodfill(int x,int y,int màuviền) để tô màu cho viên
begin
đạn.
b. Giải thuật:
setcolor(màuvẽ); xmb,ymb, xdan, ydan,
rộngmb, dàimb
circle(x,y,r);
setfillstyle(1,màutô);
T
floodfill(x,y,màuvẽ);
4. Giải thuật kiểm tra đạn có trúng máy bay không?
xdan>=xmb F
a. T tởng của giải thuật:

T
+ Tại mỗi vị trí mới của viên đạn(xdan,ydan) ta sẽ kiểm tra xem tại đó viên đạn có
trúng máy bay không. Nếu có thì sẽ trả về giá trị 1 còn không thì trả về giá trị 0.
F
*) Các dữ kiện đã biết:
xdan<=xmb+daimb
1. Toạ độ hiện thời của viên đạn (xdan,ydan).
2. Chiều rộng của máy bay và chiều dài của máy bay (rộngmb,dàimb) là hai
hằng số.
T
3. Toạ độ điểm trên trái của máy bay (xmb, ymb)
F viên đạn nằm bên trong máy bay
+ Một viên đạn bắn trúng máy bay nếu toạ độ của
ydan>=ymb
b. Lu đồ.
T
ydan<=ymb+rongmb

Return(1)

end

F

Return(0)


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay

c. Gi¶i thuËt:

int kt_va_cham()
{
if( (xdan>=xmb)&(xdan<=xmb+dµimb)&(ydan>=ymb)&(yd<=ymb+réngmb) )
return 1;
else return 0;


Lập Trình Trò Chơi Bắn Máy Bay
}
5. Giải thuật vẽ đờng đi của viên đạn.
a. T tởng của giải thuật:
+ Khi vẽ đợc viên đạn ta lu ảnh của viên đạn vào biến char *pdan bằng cách dùng
thủ tục malloc(size) và các hàm imagesize(int x1,int y1,int x1,int y2), hàm
getimage(int x1,int y1, int x2,int y2,pdan).
+ Để viên đạn chuyển động đợc ta dùng phơng pháp cắt dán ảnh( getimage và
putimage). Vị trí ban đầu của viên đạn là ở đầu nòng súng do đó toạ độ ban
đầu của nó bao giờ cũng là (x1,y1)
*) Yêu cầu đợc đặt ra là phải làm sao để viên đạn chuyển động cùng phơng với
nòng súng
*) Vấn đề cần giải quyết ở đây là làm sao xác định đợc toạ độ của viên đạn khi nó
chuyển động trên màn hình.
*) Giải quyết vấn đề: Để giải quyết vấn đề nêu ở trên ta sử dụng phơng trình đờng
thẳng đi qua 2 điểm (x1,y1) và (x2,y2) là 2 điểm ngoài cùng của nòng súng
(Xem hình nòng súng ở trang trớc). Để cho viên đạn chuyển động lên phía
trên đỉnh màn hình thì ta sẽ cho tung độ của viên đạn (ydan) giảm dần từ y1
sau đó dựa vào phơng trình đờng thẳng ở trên để tìm ra hoành độ (xdan) của
viên đạn.
+ Với chế độ XOR_PUT của thủ tục putimage ta sẽ dán ảnh pdan vào vị trí cũ để xoá
sau đó dán vào vị trí mới. Viên đạn sẽ ngừng chuyển động (biến mất) khi nó
chạm vào các cạnh của màn hình(xdan>=getmaxx() || xdan<=0 || ydan<=0)

hoặc chạm vào máy bay(kt_va_cham()==1).
b. Giải thuật:
xdan=x1;
ydan=y1; // Vị trí ban đầu ở đầu nòng súng
do
{
xdan=(ydan-y1)*(x2-x1)/(y2-y1)+x1;
putimage(xdan,ydan,pdan,XOR_PUT); //Vẽ
delay(1);
putimage(xdan,ydan,pdan,XOR_PUT); //Xoá
yd=yd-1; // cho vien dan bay ve phia tren mh
}
while(kt_va_cham()!=1 & xdan<getmaxx() & xdan>0 & ydan>0);
6. Giải thuật làm nổ máy bay.


Lập Trình Trò Chơi Bắn Máy Bay
a. T tởng của giải thuật:
+ Khi viên đạn chạm vào máy bay thì sẽ xoá hình máy bay (việc xoá máy bay sẽ đợc
làm trớc khi gọi chơng trình con này) và thay vào đó là một hình ảnh nổ (ở đây đơn
giản chỉ là những đoạn thẳng khác màu giao nhau tại 1 điểm) kèm theo đó là phát ra
một âm thanh nổ.
+ Ta có thể dùng một vòng for(i=1;i<=n; i++) để tạo ra n đoạn thẳng với những màu
bất kỳ, vẽ xong ta cho dừng màn hình (delay(100)) để có thể xem đợc sau đó sẽ chạy
một vòng for giống ở trên để xóa hìnhbegin
vừa vẽ.
c. Lu đồ.
xmb, ymb

i =1


ax[i]=random(35); ay[i]=random(5);
mau[i]=random(15); setcolor(mau[i]);
line(xmb+35-ax[i],ymb+5- ay[i],xmb+35+ax[i],ymb+15+ay[i]);

i =i +1

F
i >=10

T
Delay(100)
i =1

setcolor(getbkcolor());
line(xmb+35-ax[i],ymb+5- ay[i],xmb+35+ax[i],ymb+15+ay[i]);

F
i >=10

end

i =i +1


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay

c. Gi¶i thuËt.
void no_may_bay(int xmb,int ymb)
{

int i, ax[12],ay[12],mau[15];


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay
sound(100);delay(200);
sound(200);delay(100);
nosound();
for(i=1 ;i<=10;i++)
{
//VÏ h×nh khi m¸y bay næ
ax[i]=random(35);
ay[i]=random(5);
mau[i]=random(15);
setcolor(mau[i]);
line(xmb+35-ax[i],ymb+5-ay[i],xmb+35+ax[i],ymb+15+ay[i]);
}
delay(100);
for(i=1 ;i<=10;i++)
{
// Xo¸
setcolor(getbkcolor());
line(xmb+35-ax[i],ymb+5-ay[i],xmb+35+ax[i],ymb+15+ay[i]);
}
}

PhÇn V: Mét sè giao diÖn cña ch¬ng tr×nh
1. Giao diÖn cña trß ch¬i.


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay


2. Mµn h×nh thiÕt lËp th«ng sè cho ch¬ng tr×nh.

3. Hép tho¹i khi tho¸t ch¬ng tr×nh


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay

PhÇn VI: M· Nguån Cña Ch¬ng Tr×nh


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay

#include <dos.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <graphics.h>
#define rong_be 50
#define cao_be 8
#define cao_sung 50
#define rong_sung 6

//chieu rong cua be sung
//chieu cao cua be sung
//chieu dai cua nong sung
//chieu rong cua nong sung


float goc_lech;
// goc lech cua nong sung so voi phuong ngang 0x
int xs1,ys1,xs2,ys2, xs3,ys3, xs4,ys4 ; //toa do 4 diemcua nong sung
int danbay;
// cho biet tren man hinh co vien dan dang bay khong
int xd,yd;
//toa do cua vien dan khi bay
int xmb,ymb;
//Toa do may bay
int dmb, rmb;
// chieu dai va rong cua may bay
int ban,trung,demmb;
// cac bien dem so lan ban trung va truot...
int rtime,goctang,dokho; //rtime:thoi gian cua 1 bai choi.
int ytach;
// toa do duong phan cach giua vung game va vung thong bao
char *cban,*ctrung,*cdemmb, *tgian;
char *pmb, *pdan;
// Bien tru luu hinh anh may bay va dan
char *pmsg, *ptam;
int x1box,y1box,x2box,y2box; //toa do of hop exitbox
void init(void);
void khoi_dong_do_hoa(void);
void gioithieu(void);
void ve_khung_game(void);
void ve_khung_mess(void);
void ve_may_bay(void); //ve va luu anh may bay vao bien tro pmb
void ve_be_sung(void);
void ve_nong_sung(int mau);

void ve_dan(int mau);
//ve va luu anh vien dan vao bien tro pdan
int ban_trung(int xmb,int ymb); //kiem tra dan co trung may bay khong?
void no_may_bay(int xmb,int ymb);


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay
void thong_bao(char *s,int bai) ; //ve ra hop message box
void run(void);
//ket noi cac chuong trinh con va xu ly cac tinh huong
void tongket(void);
// Thong bao ket qua choi
void button(int x,int y,int x1,int y1,char s[25], int mau);// ve nut an
int getbox(int x,int y, int defau,int nhapso); //ham de nhan vao DL tu keyboard
void option(int dai, int rong); // ve hop tuy chon(OPTION) ra giua man hinh.
void exitbox(int dai,int rong,char kt); //ve hop exit giua mh // kt='T'or='K'
int kt_thoat(void);
/*------------------------------------------*/
void init(void)
{
goctang=3;
ytach=getmaxy()-getmaxy()/7;
rtime=1;
// Mac dinh la 2 phut se ket thuc bai choi.
dokho=3;
// khoang thoi gian may bay xuat hien (tinh =
//giay)(binhthuong=4, de=6, kho=2)
danbay=0;
//moi dau chua ban dan
yd=ys2;

// vi tri vien dan ban ra ngang voi nong sung
goc_lech=90;
xs1= getmaxx()/2 - rong_sung/2;
ys1= ytach-2-cao_be/2;
//toa do diem duoi cua nong sung
randomize();
}
/*------------------------------------------*/
void khoi_dong_do_hoa(void)
{
int gd, gm, errorcode;
//
gd = installuserdriver("svga256",NULL);
//
gm = 1; /* 640 x 480 - 256 color */
gd=DETECT;
initgraph(&gd, &gm, "d:\\tc\\bgi");
errorcode=graphresult();
if(errorcode!=grOk)
printf(" Loi do hoa: %s\n",grapherrormsg(errorcode));
}
/*------------------------------------------*/


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay
void gioithieu(void)
{
setcolor(15);
setfillstyle(1,9);
rectangle(2,2,getmaxx()-2,getmaxy()-2);

floodfill(100,100,15);
setcolor(10);
settextstyle(1,0,1);
outtextxy(getmaxx()/2-120,25,"VIEN DAI HOC MO HA NOI");
outtextxy(getmaxx()/2-60,45,"KHOA CNTH");
setcolor(1);
settextstyle(0,0,2);
outtextxy(getmaxx()/2-285,130,"DE THI THUC HANH NGON NGU
LAP TRINH");
settextstyle(2,0,7);
settextstyle(1,0,2);
outtextxy(getmaxx()/2-35,185,"De tai:");
line(getmaxx()/2+22,208,getmaxx()/2-35,208);
outtextxy(getmaxx()/2-175,210,"Lap trinh tro choi ban may bay");
settextstyle(2,0,7);
outtextxy(getmaxx()/2-160,280,"Ngon ngu lap trinh: Turbo C");
setcolor(10);
outtextxy(getmaxx()/2-220,getmaxy()-110,"Giao vien huong dan:
Th.s.LUONG CAO DONG");
outtextxy(getmaxx()/2-190,getmaxy()-85,"Sinh vien thuc hien:
NGUYEN VAN HAI ");
outtextxy(getmaxx()/2-50,getmaxy()-60,"Lop: 00B4");
/* tra ve kieu chu default */
settextstyle(0,0,0);
}
/*------------------------------------------*/
void ve_khung_game(void)
{
setfillstyle(1,BLUE);
bar(1,1,getmaxx()-1,ytach-1);

setcolor(WHITE);
rectangle(1,1,getmaxx()-1,ytach-1);
}
/*------------------------------------------*/


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay
void ve_khung_mess(void)
{
setfillstyle(1,9);
bar(1,ytach,getmaxx()-1,getmaxy()-1);
setcolor(WHITE);
rectangle(1,ytach+1,getmaxx()-1,getmaxy()-1);
rectangle(getmaxx()/2-1,ytach+1,getmaxx()/2+1,getmaxy()-1);
outtextxy(getmaxx()/2+10,ytach+5,"F2
: New Game ");
outtextxy(getmaxx()/2+10,ytach+20,"SPACE : Ban dan ");
outtextxy(getmaxx()/2+10,ytach+35,"F3
: Thiet dat tham
so(Option)");
outtextxy(getmaxx()/2+10,ytach+50,"ESC / F10 : Thoat khoi Game");
}
/*------------------------------------------*/
void ve_may_bay(void)
{
int x[9],y[9];// toa do of cac diem de ve may bay
int i;
int x1=10,y1=30;
unsigned n;
x[1]=x1;

y[1]=y1;
x[2]=x[1]+11; y[2]=y[1];
x[3]=x[1]+16; y[3]=y[1]+21;
x[4]=x[1]+39; y[4]=y[3];
x[5]=x[1]+53; y[5]=y[1]+8;
x[6]=x[1]+69; y[6]=y[1]+21;
x[8]=x[1]+11;
y[8]=y[1]+35;//y[8]=y[1]+30;
x[7]=x[1]+96; y[7]=y[1]+28;//y[7]=y[8];
x[1]=x[1]-6;
x[2]=x[2]-4;
dmb=x[7]-x[1];
rmb=y[8]-y[1];
setcolor(RED);
for(i=1;i<8;i++) line(x[i],y[i],x[i+1],y[i+1]);
line(x[8],y[8],x[1],y[1]);
setfillstyle(1,11);
floodfill(x[5],y[3],RED);
n=imagesize(x[1]-2,y[1]-2,x[7]+2,y[8]+2);
pmb=(char*)malloc(n);


LËp Tr×nh Trß Ch¬i B¾n M¸y Bay
getimage(x[1]-2,y[1]-2,x[7]+2,y[8]+2,pmb);
cleardevice(); //xoa man hinh
}
/*------------------------------------------*/
void ve_be_sung(void)
{
int x,y;

int mau=8;
x=(getmaxx()-rong_be)/2;
y=ytach-cao_be - 2;
setfillstyle(1,mau);
bar(x, y, x+rong_be, y+cao_be);
}
/*------------------------------------------*/
void ve_nong_sung(int mau)
{
float radian;
//goc_lech khi doi sang RADIAN
int toado[10];
radian = M_PI/180 ;
xs2=xs1 + cao_sung*cos(radian*goc_lech);
ys2=ys1- cao_sung*sin(radian*goc_lech);
xs3=xs1+rong_sung*cos(radian*(90-goc_lech));
ys3=ys1+rong_sung*sin((90-goc_lech)*radian);
xs4=xs2+(xs3-xs1);
ys4=ys2+(ys3-ys1);
setcolor(mau);
toado[0]=xs1;
toado[1]=ys1;
toado[2]=xs2;
toado[3]=ys2;
toado[4]=xs4;
toado[5]=ys4;
toado[6]=xs3;
toado[7]=ys3;
toado[8]=xs1;
toado[9]=ys1;

drawpoly(5,toado);
setfillstyle(1,mau);
fillpoly(4,toado);
}
/*------------------------------------------*/


×