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

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.

 

 

doc44 trang | Chia sẻ: oanh_nt | Lượt xem: 1211 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Đề tài Lập trình trò chơi bắn máy bay viết bằng ngôn ngữ Turbo C, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Mục lục Lời nói đầu………………………………………...…………………………………..3 Phần I: Phân tích bài toán…………………………………………………………….4 Bài toán……………………………………………………………………...4 Phân tích bài toán…………………………………………………………...4 Phần II: Phân rã chức năng…………………………………………………...……….6 Mô tả trò chơi……………………………………………………………….6 Sơ đồ modul hoá…………………………………………………………….6 Phân rã chức năng………………………………………………………...…7 Phần III: Tổ chức dữ liệu cho chương trình……………………………………...……9 Các biến toàn cục……………………………………………………...……9 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 Tư tưởng của giải thuật…………………………………………...…11 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 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. 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. 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. 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 nhưng 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) Trò Bắn Máy Bay Vẽ giao diện Khởi tạo ban đầu Giới thiệu Xử lý các chương trình con Thông báo kết quả Vẽ khung chơi Game Vẽ khung thông báo Vẽ bệ súng Vẽ nòng súng Xử lý phím Kiểm tra bắn Đếm thời gian Kiểm tra chơi tiếp / thoát Vẽ lại nòng súng Vẽ lại bệ súng Kiểm tra chơi lại 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á 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: + 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, lưu 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à lưu 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. 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)

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

  • doctrochoi banMB-44.DOC
Tài liệu liên quan