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
Trang 1
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ật………11
2 Giải thuật vẽ nòng súng……….11
a T tởng của giải thuật………11
b Lu đồ……….12
c Giải thuật……… … 12
3 Giải thuật vẽ viên đạn………13
a T tởng của giải thuật………13
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ật………13
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ật………15
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ật………16
Trang 2b 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ình………21
Trang 3Lờ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 !
Trang 4Phầ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
+ 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
Trang 5Sau 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
Trang 6Phầ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)
Trang 7Vẽ nòng súng Xử lý phím tra bắnKiểm
Đếm thời gian
Kiểm tra bắn trúng
Vẽ đư
ờng đi của đạn
Vẽ lại máy bay
Kiểm soát giờ chơi
Xử lý qua bài
Tăng
điểm
Xử lý bắn trúng
đếm máy bay
Thông báo giờ chơi
Xử lý qua bài
Nổ máy bay
Vẽ máy bay
Sơ Đồ Modul Hoá
Trang 8+ 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
+ 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
Trang 9Phầ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
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
Trang 10+ char *cban,*ctrung,*cdemmb, *tgian;
Lµ c¸c biÕn trá cã t¸c dông lu tr÷ mét x©u ký tù
PhÇn IV: ThiÕt KÕ Gi¶i ThuËt
Trang 111 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à
Trang 12Chú ý: Trong chơng trình phải đổi góc ∝ ra đơn vị radian.
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);
Trang 133 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
4 Giải thuật kiểm tra đạn có trúng máy bay không?
a T t ởng của giải thuậ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
*) Các dữ kiện đã biết:
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ố
3 Toạ độ điểm trên trái của máy bay (xmb, ymb)
+ Một viên đạn bắn trúng máy bay nếu toạ độ của viên đạn nằm bên trong máy bay
Trang 155 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)
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.
Trang 16a 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ình vừa vẽ
Trang 17c Gi¶i thuËt.
void no_may_bay(int xmb,int ymb){
int i, ax[12],ay[12],mau[15];
Trang 18PhÇn V: Mét sè giao diÖn cña ch¬ng tr×nh
1 Giao diÖn cña trß ch¬i
Trang 192 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
Trang 20PhÇn VI: M· Nguån Cña Ch¬ng Tr×nh
Trang 21#define rong_be 50 //chieu rong cua be sung
#define cao_sung 50 //chieu dai cua nong sung
#define rong_sung 6 //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 baochar *cban,*ctrung,*cdemmb, *tgian;
char *pmb, *pdan; // Bien tru luu hinh anh may bay va dan
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);
Trang 22void 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 huongvoid 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 keyboardvoid 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);
Trang 23outtextxy(getmaxx()/2-190,getmaxy()-85,"Sinh vien thuc hien:
NGUYEN VAN HAI ");
Trang 24outtextxy(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");}
Trang 25getimage(x[1]-2,y[1]-2,x[7]+2,y[8]+2,pmb);cleardevice(); //xoa man hinh
Trang 26void ve_dan(int mau)
line(xmb+35-ax[i],ymb+5-}delay(100);
for(i=1 ;i<=10;i++)
{
Trang 27ay[i],xmb+35+ax[i],ymb+15+ay[i]);
line(xmb+35-ax[i],ymb+5-}}
Trang 28int ok=1, bai=1;
int ban1, trung1, demmb1;// Dem cac chi so nay trong tung baive_khung_game();
struct time timep;
int giay, giay_lech, no;
NEW:
tieptuc=1; tam=0; giay=0; no=0;
ban1=0; trung1=0; demmb1=0; goc_lech=90;
ve_be_sung();
setcolor(WHITE);
outtextxy(10,ytach+5,"Diem Cua Ban : 0 ");
outtextxy(10,ytach+20,"So Lan May Bay Xuat Hien : 0 ");outtextxy(10,ytach+35,"Tong So Lan Ban Dan : 0 ");outtextxy(10,ytach+50,"Thoi Gian Con Lai : ");
xx=10+textwidth("Diem Cua Ban : ");