Đề tài Lập trình trò chơi bắn máy bay viết trên ngôn ngữ Turbo C

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. Lưu đồ .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. Lưu đồ .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

b. Lưu đồ .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

 

 

 

 

 

 

 

 

 

 

 

 

doc44 trang | Chia sẻ: maiphuongdc | Lượt xem: 1709 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Đề tài Lập trình trò chơi bắn máy bay viết trên ngôn ngữ Turbo C, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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. Phần III: Tổ Chức Dữ Liệu Cho Chương Trình Để lưu 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 lưu 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 lưu 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, nhưng 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 lưu 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 + char *cban,*ctrung,*cdemmb, *tgian; Là các biến trỏ có tác dụng lưu trữ một xâu ký tự + char *pmb, *pdan, *pmsg; Ba Biến trỏ lưu 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ỏ để lưu 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 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 lưu 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: Đ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. Chiều cao(cao_sung) và chiều rộng(rong_sung) của nòng súng là một hằng số. 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(à) ); 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[ ] để lưu 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. Lưu đồ. begin end 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); c. Giải thuật: setcolor(màuvẽ); int m[9]; 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 đạn. b. Giải thuật: setcolor(màuvẽ); circle(x,y,r); setfillstyle(1,màutô); floodfill(x,y,màuvẽ); 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: Toạ độ hiện thời của viên đạn (xdan,ydan). 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ố. 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 b. Lưu đồ. begin xmb,ymb, xdan, ydan, rộngmb, dàimb end Return(1) Return(0) xdan>=xmb xdan<=xmb+daimb ydan>=ymb ydan<=ymb+rongmb T T T T F F F F c. Giải thuật: int kt_va_cham() { if( (xdan>=xmb)&(xdan=ymb)&(yd<=ymb+rộngmb) ) return 1; else return 0; } 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 lưu ả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 & xdan0 & ydan>0); 6. Giải thuật làm 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ình vừa vẽ. c. Lưu đồ. i >=10 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]); xmb, ymb i =i +1 F T Delay(100) i >=10 i =1 setcolor(getbkcolor()); line(xmb+35-ax[i],ymb+5- ay[i],xmb+35+ax[i],ymb+15+ay[i]); i =i +1 F end begin c. Giải thuật. void no_may_bay(int xmb,int ymb) { int i, ax[12],ay[12],mau[15]; 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. 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 Phần VI: Mã Nguồn Của Chương Trình #include #include #include #include #include #include #include #include #define rong_be 50 //chieu rong cua be sung #define cao_be 8 //chieu cao 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 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); 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)); } /*------------------------------------------*/ 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); } /*------------------------------------------*/ 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); 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); } /*------------------------------------------*/ void ve_dan(int mau) { unsigned int n; setcolor(mau); cleardevice(); circle(5,5,4); setfillstyle(1,mau); floodfill(5,5,mau); n=imagesize(1,1,9,9); pdan=(char*)malloc(n); getimage(1,1,9,9,pdan); cleardevice(); } /*------------------------------------------*/ int ban_trung(int xmb,int ymb) { if( (xd>=xmb) & (xd=ymb) & (yd<=ymb+rmb) ) return 1; else return 0; } /*------------------------------------------*/ void no_may_bay(int xmb,int ymb) { int i, ax[12],ay[12],mau[15]; sound(900);delay(100); sound(300);delay(100); nosound(); for(i=1 ;i<=10;i++) { 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++) { setcolor(getbkcolor()); line(xmb+35-ax[i],ymb+5-ay[i],xmb+35+ax[i],ymb+15+ay[i]); } } /*------------------------------------------*/ void thong_bao(char *s,int bai) { unsigned n; int cao,rong,x,y,x1,y1; settextstyle(0,0,2); cao=60; rong=textwidth(s)+60; x=(getmaxx()-rong)/2; //toa do tren trai cua hop thong bao y=cao; setcolor(15); rectangle(x,y,x+rong,y+cao); //vien ngoai setfillstyle(1,14); floodfill(x+1,y+1,15); setcolor(0); rectangle(x+3,y+3,x+rong-3, y+cao-3); //vien trong setfillstyle(1,9); floodfill(x+10,y+10,0); setcolor(12); x1=x+(rong-textwidth(s))/2 -2; y1=y+(cao-textheight("B"))/2; outtextxy(x1,y1,s); if(bai!=0) { itoa(bai,tgian,10); outtextxy(x1+textwidth(s),y1,tgian); } n=imagesize(x,y,x+rong,y+cao); ptam=(char*)malloc(n); getimage(x,y,x+rong,y+cao,ptam); settextstyle(0,0,0); setcolor(15); x1=x+(rong-textwidth("Press Enter."))/2-1; y1=y+cao+textheight("P"); outtextxy(x1,y1,"Press Enter..."); do { } while(getch()!=13); setcolor(getpixel(x1-1,y1-1)); outtextxy(x1,y1,"Press Enter...");//xoa putimage(x,y,ptam,XOR_PUT);//xoa free(ptam); } /*------------------------------------------*/ void run(void) { int ok=1, bai=1; int ban1, trung1, demmb1;// Dem cac chi so nay trong tung bai ve_khung_game(); ve_khung_mess(); while(ok) { int tieptuc ,xx,tongtg, tam; char c; 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_nong_sung(7); //Ve lai 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 : "); tongtg=rtime*60; itoa(tongtg,tgian,10); outtextxy(xx,ytach+50,tgian); thong_bao("BAI ",bai); setcolor(WHITE); outtextxy((getmaxx()- textwidth("Starting..."))/2,getmaxy()/2,"Starting..."); delay(1000); setcolor(BLUE); outtextxy((getmaxx()- textwidth("Starting..."))/2,getmaxy()/2,"Starting..."); gettime(&timep); giay_lech=timep.ti_sec%dokho; while (tieptuc) { gettime(&timep); //neu may bay no thi tinh lai do lech giay if (no) giay_lech=timep.ti_sec%dokho; if (giay != timep.ti_sec) { setcolor(9); itoa(tongtg,tgian,10); outtextxy(xx,ytach+50,tgian); setcolor(WHITE); tongtg-=1; itoa(tongtg,tgian,10); outtextxy(xx,ytach+50,tgian); giay = timep.ti_sec; if( (giay-giay_lech)%dokho==0 || no) { if( !no & (demmb1!=0) ) putimage(xmb,ymb,pmb,XOR_PUT); //xoa xmb=random(getmaxx()-dmb-4); xmb=xmb+2; ymb=random(getmaxy()/3); ymb=ymb+2; putimage(xmb,ymb,pmb,COPY_PUT); setcolor(9); itoa(demmb1,cdemmb,10); outtextxy(xx,ytach+20,cdemmb); demmb1+=1; no=0; itoa(demmb1,cdemmb,10); setcolor(WHITE); outtextxy(xx,ytach+20,cdemmb); } } if(danbay) // neu dan van tren mh { xd=(yd-ys1)*(xs2-xs1)/(ys2-ys1)+xs1; putimage(xd,yd,pdan,XOR_PUT); delay(1); putimage(xd,yd,pdan,XOR_PUT); yd=yd-1;// cho vien dan bay ve phia tren mh if ( ban_trung(xmb,ymb) ) { if (tam!=demmb1) { tam=demmb1; putimage(xmb,ymb,pmb,XOR_PUT); //xoa mb no_may_bay(xmb,ymb); no=1; danbay=0; setcolor(9); itoa(trung1,ctrung,10); //Xoa outtextxy(xx,ytach+5,ctrung); trung1+=1; itoa(trung1,ctrung,10); setcolor(WHITE); // Viet lai outtextxy(xx,ytach+5,ctrung); } } if (xd<0 || yd<0) //dan cham cac canh cua mh danbay=0; } if( kbhit() ) { c=getch(); switch(c) { case 75: //sang trai <- //Xoa nong sung ve_nong_sung(BLUE); goc_lech=goc_lech+goctang; if (goc_lech>145) goc_lech-=goctang; ve_nong_sung(7); //Ve lai ve_be_sung(); break; case 80://len tren ve_nong_sung(BLUE); goc_lech=90;// nong sung thang dung ve_nong_sung(7); //Ve lai ve_be_sung(); break; case 77://sang phai -> ve_nong_sung(BLUE); goc_lech=goc_lech-goctang; if (goc_lech<35) goc_lech+=goctang; ve_nong_sung(7); //Ve lai ve_be_sung(); break; case 72: case 32: if(!danbay) { yd=ys2; danbay=1; sound(7000); delay(60); nosound(); setcolor(9); itoa(ban1,cban,10); outtextxy(xx,ytach+35,cban); //xoa ban1+=1; itoa(ban1,cban,10); setcolor(WHITE); outtextxy(xx,ytach+35,cban); } break; case 61: // F3 (Option) option(350,180); break; case 68:case 27: case 107: //F10, ESC hoac ALT+F4 de thoat if (kt_thoat()) { tieptuc=0; ok=0; goto CONG_DON; } break; case 60: //F2 choi lai (New) ve_khung_game(); ve_khung_mess(); goto NEW; } // End switch } // End if (kbhit) if(tongtg==0) //het thoi gian if(trung1<demmb1/2) { // GAME OVER tieptuc=0; ok=0; thong_bao("Ban Da Thua!!",0); goto CONG_DON; } else if(dokho>1) { dokho=dokho-1;//giam thoi gian de tang do kho tieptuc=0; bai+=1; } else { //WINER tieptuc=0; ok=0; thong_bao("Ban La Nguoi Chien Thang!!",0); goto CONG_DON; } } // End While(tieptuc) ve_khung_game(); ve_khung_mess(); CONG_DON: demmb=demmb+demmb1; ban=ban+ban1; trung=trung+trung1; } //End of While(ok). free(pmb); free(pdan); } /*------------------------------------------*/ void tongket(void) { float tyletrung,tylechet; clrscr(); printf(" KET QUA CUA BAN\n\n\n"); printf("\n Tong So Diem Ban Dat Duoc : %d\n",trung); printf("\n Tong So Lan May Bay Xuat Hien : %d\n",demmb); printf("\n Tong So Lan Ban Dan : %d\n",ban); if (ban!=0) tyletrung=(float)trung/ban*100; else tyletrung=0; printf("\n Ty Le Ban Trung : %3.2f%\n",tyletrung); if (demmb!=0) tylechet=(float)trung/demmb*100; else tylechet=0; printf("\n Ty Le May Bay Bi Tieu Diet : %3.2f%",tylechet); } /*------------------------------------------*/ void button(int x,int y,int x1,int y1,char s[25], int mau) { setcolor(WHITE); line(x,y,x,y1); line(x,y,x1,y); setcolor(8); line(x1,y1,x,y1); line(x1,y1,x1,y); setcolor(mau); //Mau cua chu outtextxy(x+(x1-x-textwidth(s))/2,y+(y1-y-textheight(s))/2,s); } /*------------------------------------------*/ int getbox(int x,int y, int defau,int nhapso) // defau la gia tri mac dinh khi hien ra //nhapso = 1 thi se cho nhap so tu ban phim { char c, s1[1],s2[1],sele_key; int kq,trave,ok=1,mauchu=WHITE,n; s2[1]='\0';s1[1]='\0'; trave=defau; itoa(defau,s1,10); n=getcolor(); setcolor(mauchu); s2[0]='_'; outtextxy(x,y,s1); if(nhapso) { outtextxy(x+textwidth(s1),y,s2); while(ok) { sele_key=1; c=getch(); switch(c) { case 27: return(0); case 49: case 50: case 51:case 52:case 53:case 54: kq=c-48; trave=kq; setcolor(getpixel(x-3,y+2)); //Xoa phan so outtextxy(x,y,s1); itoa(kq,s1,10); s2[0]='_'; break; case 13:case 9: ok=0; break; case 8: //Backspace setcolor(getpixel(x-3,y+2)); s1[1]='\0'; //Xoa phan so outtextxy(x,y,s1); // Xoa '_' outtextxy(x+textwidth(s1),y,s2); trave=defau; s1[0]='_'; break; default: sele_key=0; break; } //End Switch if(sele_key) { s1[1]='\0'; setcolor(mauchu); //viet lai so moi outtextxy(x,y,s1); if (s1[0]!='_') outtextxy(x+textwidth(s1),y,s2); } } // End while setcolor(getpixel(x-3,y+2)); outtextxy(x,y,s1); //Xoa so ou

Các file đính kèm theo tài liệu này:

  • doctrochoi banMB-44.DOC