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

Ứng dụng ngôn ngữ C/C++ xây dụng Game Snake

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 (1.23 MB, 33 trang )

MỤC LỤC
1
A. LỜI MỞ ĐẦU
I. Giới thiệu khái quát về đề tài:
Trong thời đại công nghệ thông tin ngày càng phát triển như ngày nay, nhiều ngành
tin học đã được ứng dụng rộng rãi trong cuộc sống. Nhờ đó con người giải quyết nhiều công
việc một cách dễ dàng, nhanh chóng, chính xác, tiết kiệm thời gian và tiền bạc. Hàng ngày,
hàng giờ, hàng phút, thậm chí là hàng giây, thế giới cho ra nhiều phần mềm vô cùng tiện ích,
đáp ứng nhu cầu giải trí ngày càng cao của con người. Với mơ ước muốn trở thành nhà lập
trình viên trong tương lai tạo ra các phần mềm phục vụ cuộc sống, vì thế nhóm chúng tôi đã
quyết định chọn đề tài dùng ngôn ngữ lập trình C/C++ để làm ra một trò chơi với mục đích
trước tiên là kiểm tra tư duy lập trình, ôn lại những kiến thức đã học và kỹ năng lập trình, qua
đó học hỏi thêm những kiến thức mới, và từ những cái mà mình đã làm được nhóm chúng tôi
sẽ phát triển cao hơn nữa, tạo ra những sản phẩm hoàn thiện hơn.
Nhóm đã chọn đề tài Game Rắn Săn Mồi được viết trên ngôn ngữ lập trình C/C++
giúp mọi người giảm stress sau những giờ làm việc, học tập căng thẳng.
Phần mềm sử dụng cho đề tài này là phần mềm Turbo C với ngôn ngữ lập trình C/C+
+. Nhóm chúng tôi đã dùng các chương trình âm thanh, đồ họa và một số chương trình hỗ trợ
khác có trong ngôn ngữ để hoàn thành đề tài này.
II. Trình bày khái quát kế hoạch kiến tập của nhóm:
1. Mục đích kiến tập:
Nhằm kiểm tra kết quả, đánh giá trình độ học tập, khả năng tiếp thu kiến thức của sinh
viên trong khoảng thời gian học tại trường, khả năng vận dụng kiến thức đã học vào trong
thực tế, đánh giá chất lượng giảng dạy của giảng viên. Trong quá trình nghiên cứu, hoàn
thiện đề tài, sinh viên ít nhiều cũng gặp những khó khăn để từ đó có biện pháp giải quyết
vấn đề linh hoạt, nhanh chóng, có hiệu quả, tìm cách vượt qua khó khăn, đồng thời tích lũy
thêm nhiều kinh nghiệm, học hỏi, chiếm lĩnh thêm nhiều kiến thức mới cho bản thân. Bên
cạnh đó, việc được tiếp xúc với thực tế nhiều hơn sẽ tạo cho sinh viên một tác phong làm
việc có khoa học và trong quá trình làm việc theo nhóm sinh viên ý thức được vai trò của
mỗi thành viên trong nhóm, thể hiện tinh thần tự giác, tích cực, quyền tự do sáng tạo, bày tỏ
quan điểm, đóng góp ý kiến của mỗi cá nhân. Trang bị cho sinh viên một nền tảng kiến thức


khoa học, kinh nghiệm làm việc vững chắc khi ra trường có thể áp dụng ngay vào trong
cuộc sống.
2. Địa điểm kiến tập:
Nhóm chúng tôi tiến hành tìm hiểu thực tế và tiến hành làm đề tài tại trường Cao
Đẳng Bình Định dưới sự chỉ dẫn của giảng viên bộ môn – thầy Nguyễn Dư Nghĩa.
3. Thời gian kiến tập:
Thời gian bắt đầu từ ngày 10/02/2013 đến hết ngày 01/05/2013
4. Nội dung hoạt động kiến tập:
Nhóm chúng tôi đã đi tìm hiểu thực tế về nội dung, mục đích, yêu cầu của đề tài, tìm
hiểu thêm những kiến thức về ngôn ngữ C trên Ebook, sách tham khảo trên thư viện trường.
Sau đó tiến hành họp nhóm cùng nhau phân tích đề tài, định hướng công việc cần làm, đưa
ra thuật toán cụ thể cho đề tài. Để đồng nhất dữ liệu nhóm, nhóm trưởng phân công công
việc cụ thể cho từng thành viên trong nhóm. Trong quá trình tiến hành công việc đã được
phân công, các thành viên trong nhóm nếu gặp phải những khó khăn, thắc mắc thì tiến hành
2
thảo luận nhóm, cùng nhau giải quyết vấn đề. Nếu không giải quyết được thì nhờ đến giáo
viên hướng dẫn để phân tích, đưa ra biện pháp tốt nhất.
5. Lịch trình hoạt động kiến tập:
Do nhóm làm đề tài trong thời gian cả nhóm đi thực tập sư phạm 2 nên nhóm ít tổ
chức họp nhóm, làm việc thường xuyên với nhau được, nhóm trưởng phân công công việc
cụ thể cho từng thành viên trong nhóm về nhà tự làm và trao đổi với nhau chủ yếu qua
Email và điện thoại. Hai tuần một lần nhóm tiến hành họp nhóm cùng nhau nhận xét công
việc của mỗi thành viên, góp ý kiến, chia sẻ kinh nghiệm và các kiến thức cho nhau, cùng
nhau giải quyết những thắc mắc liên quan đến đề tài.
6. Cán bộ hướng dẫn kiến tập:
Họ và tên: Nguyễn Dư Nghĩa.
Chức danh: Giảng viên bộ môn Lập trình C, khoa CNTT, trường Cao Đẳng Bình
Định.
B. NỘI DUNG BÁO CÁO
I. Cơ sở lý thuyết:

1. Ngôn ngữ sử dụng:
- Ngôn ngữ sử dụng để thực hiện đề tài game Rắn Săn Mồi là ngôn ngữ lập trình C.
- Tài liệu tham khảo: Giáo trình Turbo C/C++ của PGS.TS Bùi Thế Tâm – Nhà xuất
bản giao thông vận tải Hà Nội, 2003.
2. Những kiến thức mới mà nhóm hoặc cá nhân nghiên cứu tìm hiểu được ngoài bài
giảng của giáo viên:
- Các hàm ngắt của Bios, Dos.
- Tạm dừng và thoát khi đang chơi.
- Lưu tên người chơi.
- Tạo logo SNAKE và YOU LOST trên giao diện trò chơi.
- Tạo các Menu GameLoad, SaveGame, About,….
II. Những việc đã làm và kết quả đạt được trong thời gian kiến tập:
1. Nhiệm vụ được phân công trong thời gian kiến tập:
1.1. Nguyễn Thị Bích Trầm (Trưởng nhóm), đảm nhận công việc:
a. Modul LayKeyBanPhim():
Lấy key của bàn phím cho các phím di chuyển rắn: lên, xuống, trái, phải và
một số nút chức năng khác: Space, Enter.
Dùng hàm Toupper () dùng để chuyển đổi chữ thường sang chữ hoa.
b. Modul HienThiKyTu():
Sau khi lấy key từ bàn phím, hàm HienThiKyTu sẽ giúp in ra các ký tự vừa
được lấy.
Case 32: /*Mã của phím Space*/ cho phép người chơi dừng trò chơi lại khi
đang chơi.
Case 13: /*Mã của phím Enter*/ cho phép người chơi tiếp tục trò chơi khi đang
dừng trò chơi.
Case 72: /*Mã của phím mũi tên lên*/ cho phép người chơi điều khiển rắn lên
trên.
Case 75: /*Mã của phím mũi tên trái*/ cho phép người chơi điều khiển rắn về
bên trái.
Case 77: /*Mã của phím mũi tên phải*/ cho phép người chơi điều khiển rắn về

bên phải.
3
Case 80: /*Mã của phím mũi tên xuống*/ cho phép người chơi điều khiển rắn
xuống dưới.
c. Modul Save():
Lưu trạng thái con rắn và thông tin game vào file có đường dẫn link (bao gồm
tên). Có sử dụng hàm fprintf() để ghi ra tệp văn bản, nếu thành công hàm trả về số
byte ghi ra tệp.
Có sử dụng hàm fopen() mở một tệp. Kiểu truy nhập là một xâu có dạng: r+b:
mở tệp mới đã đọc/ghi theo kiểu nhị phân nếu tệp tồn tại sẽ bị xóa.
Hàm fclose() hàm đóng tệp: hàm cho 0 nếu thành công, cho EOF nếu có lỗi.
d. Modul Load():
Load các thông tin vừa lưu vào file có đường dẫn link (bao gồm các thông tin
có trong Save()).
Có sử dụng hàm fopen() mở một tệp. Kiểu truy nhập là một xâu có dạng: r+b:
mở tệp mới đã đọc/ghi theo kiểu nhị phân, tệp cần tồn tại nếu không sẽ báo lỗi.
Hàm fclose() hàm đóng tệp: hàm cho 0 nếu thành công, cho EOF nếu có lỗi.
Có sử dụng hàm fprintf() để ghi ra tệp văn bản, nếu thành công hàm trả về số
byte ghi ra tệp.
e. Modul ShowMessenger():
Hiển thị thông báo khi rắn chết: YOU LOST.
f. Modul HideMessenger():
Ẩn thông báo YOU LOST khi đang chơi.
g. Modul MenuWinLose():
Hiển thị hệ thống các nút again, exit khi chơi thắng hoặc game over.
Có sử dụng hàm unsigned char() dùng để lưu các số nguyên dương từ 0 đến
255.
h. Modul ThuTucChucNangGame():
Tạo, biểu diễn và tắt các nút resume, save, load, control, help, about, exit thông
qua việc kế thừa các hàm VarButton(), ShowButton(), ClickButton(),

EffectClick() và các hàm tạo Menu
i. Modul KhoiDongGame():
Khởi động game trước khi chơi bằng cách click chuột vào nút Start Game.
j. Modul ResetGame():
Tạo chương trình con hỗ trợ chức năng chơi lại từ đầu khi hết màn hoặc rắn
chết.
1.2. Nguyễn Thị Diễm, đảm nhận công việc:
a. Modul KhoiTaoConRan():
Khởi tạo con rắn ban đầu với 1 đốt.
b. Modul KiemTraThuocThanConRan():
Kiểm tra kích thước của con rắn hiện tại trước khi rắn ăn được mồi.
c. Modul VeConRan():
Vẽ và tô màu cho con rắn (đầu rắn là chữ @, thân rắn là các khối hình chữ nhật
màu xanh).
d. Modul XoaConRan():
Xóa rắn khi rắn di chuyển tới tọa độ tiếp theo.
e. Modul KiemTraRanDungThanRan():
Kiểm tra nếu đầu rắn đụng thân rắn thì rắn chết.
4
f. Modul KiemTraRanDie():
Kiểm tra nếu KiemTraRanDungThanRan là True thì rắn chết, ngược lại False
thì rắn không chết.
g. Modul DieuChinhToaDoConRan():
Điều chỉnh lại tọa độ con rắn khi rắn di chuyển.
h. Modul MenuSaveGame():
Trong Menu này gồm có các mục dùng để lưu thông tin của người chơi bao
gồm các mục Ổ đĩa, SaveName, Ok, Cancel.
Sử dụng hàm unsigned char() dùng để lưu các số nguyên dương từ 0 đến 255.
Hàm setcursortype() dùng để thiết lập kiểu con trỏ.
Sử dụng các hàm VarButton(), ShowButton(), ClickButton(), EffectClick() để

xây dựng các nút.
Sử dụng hàm strcat nối các chuỗi thành phần thành chuỗi chung.
Thủ tục clreol(): Xóa các ký tự từ vị trí con trỏ đến hết dòng.
i. Modul MenuLoadGame():
Trong Menu này gồm có các mục dùng để load thông tin của người chơi đã
được tạo trong Save bao gồm các mục Ổ đĩa, SaveName, Ok, Cancel.
j. Modul MenuAbout():
Thông tin chương trình gồm có: người viết, tên chương trình, chức năng kèm
theo (save, load, pause, resume game).
k. Modul MenuControl():
Gồm có các phím xử lý trong game: M_UP, M_DOWN, M_LEFT, M_RIGHT
và các nút chọn save all, default, cancel.
l. Modul MenuHelp():
Trợ giúp cách chơi.
1.3. Đặng Thị Mai Hồng, đảm nhận công việc:
a. Modul GanToaDo():
Gán tọa độ cho rắn.
b. Modul HienThiLogo():
Hiển thị logo của trò chơi SNAKE.
c. Modul VeBanDo():
Vẽ bốn bức tường giới hạn phạm vi di chuyển của rắn.
d. Modul TaoThucAn():
Tạo thức ăn ngẫu nhiên sử dụng hàm randomize().
e. Modul VeThucAn():
Vẽ thức ăn ra màn hình.
f. Modul XoaThucAn():
Xóa thức ăn ra khỏi màn hình.
g. Modul AnThucAn():
Biểu diễn rắn ăn thức ăn, mỗi lần rắn ăn được thức ăn kích thước rắn, số điểm
tăng lên. Tạo thức ăn mới ngẫu nhiên.

1.4. Hà Thị Bích Liễu, đảm nhận công việc:
a. Modul VarButton():
Hàm tạo các nút.
b. Modul ShowButton():
Hiển thị các nút vừa tạo ở hàng VarButton().
c. Modul EnableButton():
Kích hoạt các nút vừa tạo ở hàng VarButton().
5
d. Modul DisableButton():
Tắt các nút vừa tạo ở hàng VarButton().
e. Modul ClickButton():
Hàm xác nhận để Click chuột.
f. Modul EffectClick():
Hiệu ứng các nút khi rê chuột vào đổi màu.
g. Modul EffectClickNonButton():
Tắt hiệu ứng của các nút.
h. Modul SetLevelScore():
Có 7 cấp độ, khi người chơi đạt được 10 điiểm qua mỗi level thì điểm sẽ tăng
dần.
i. Modul BangBaoLevel():
Bao gồm level, số điểm và tốc độ.
2. Đánh giá kết quả: (đoạn code)
2.1. Đoạn kết cụ thể cho sản phẩm:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<dos.h>
#include<stdlib.h>
#include<ctype.h>

#include"mouse.inc"
#define LEFT 5
#define RIGHT 75
#define TOP 6
#define BOTTOM 36
#define M_LEFT 1
#define M_RIGHT 2
#define M_UP 3
#define M_DOWN 4
int KetThucGame=0;
typedef struct
{
int x,y;
}Point;
char KLEFT=75, KRIGHT=77, KUP=72, KDOWN=80, PAUSE=59;
int KL=0, KR=0, KU=0, KD=0, P=0;
Point SNACK[100];
Point ThucAn;
int len;
int head,tail;
int score=0;
int level=1;
int speed=300;
int DiemTangLevel=10;
int HuongDi=2;
typedef struct
6
{
int xbutton;
int ybutton;

char *name;
int statusbutton;
}Button;
void VarButton(Button &B,char *s,int x,int y)
{
B.xbutton=x;
B.ybutton=y;
B.statusbutton=1;
B.name=s;
}
void ShowButton(Button B)
{
if(B.statusbutton==1)
{
textbackground(15);
gotoxy(B.xbutton,B.ybutton);
textcolor(LIGHTRED);
cprintf("%s",B.name);
textbackground(BLACK);
}
}
void EnableButton(Button& B)
{
B.statusbutton=1;
}
void DisableButton(Button& B)
{
textbackground(15);
gotoxy(B.xbutton,B.ybutton);
textcolor(LIGHTGRAY);

cprintf("%s",B.name);
B.statusbutton=0;
textbackground(BLACK);
}
int ClickButton(Button B, int xchuot, int ychuot)
{
if(B.statusbutton==1)
{
if(xchuot>=(B.xbutton-1)*8&&xchuot<=(B.xbutton+strlen(B.name)-1-
1)*8&&ychuot==(B.ybutton-1)*8)
return 1;
7
}
return 0;
}
void EffectClick(Button B)
{
gotoxy(B.xbutton, B.ybutton);
textcolor(LIGHTCYAN+BLINK);
cprintf("%s",B.name);
delay(200);
ShowButton(B);
}
void EffectClickNonButton(int x, int y)
{
gotoxy(x, y);
textbackground(WHITE);
textcolor(WHITE);
cprintf(".");
textbackground(BLACK);

delay(200);
}
void GanToaDo(Point &P, int xx, int yy)
{
P.x=xx;
P.y=yy;
}
void HienThiLoGo(int x, int y, int color)
{
gotoxy(x,y);
textcolor(color);
cprintf("ÛßßßßÛ Û Û ÛßßÛ Ûßßß Û Üß Ûßßß");
gotoxy(x,y+1);
textcolor(LIGHTRED);
cprintf("ÈÍÍÍÍ» ºßÜ º ÌÍ͹ Û ºÛ ÌÍ");
gotoxy(x,y+2);
textcolor(color);
cprintf("ÛÜÜÜÜÛ Û ßÛ Û Û ÛÜÜÜ Û ßÜ ÛÜÜÜ");
}
void VeBanDo()
{
int i,j;
for(i=LEFT; i<=RIGHT; i++)
for(j=TOP; j<=BOTTOM; j++)
8
{
if((j==TOP||j==BOTTOM)&&i>LEFT&&i<RIGHT)
{
gotoxy(i,j);
textcolor(7);

cprintf("%c",205);
}
if((i==LEFT||i==RIGHT)&&j>TOP&&j<BOTTOM)
{
gotoxy(i,j);
textcolor(7);
cprintf("%c",186);
}
}
gotoxy(LEFT,TOP);
textcolor(LIGHTRED);
cprintf("%c", 219);
gotoxy(RIGHT,TOP);
textcolor(LIGHTRED);
cprintf("%c", 219);
gotoxy(LEFT,BOTTOM);
textcolor(LIGHTRED);
cprintf("%c", 219);
gotoxy(RIGHT,BOTTOM);
textcolor(LIGHTRED);
cprintf("%c", 219);
}
void KhoiTaoConRan()
{
len=2;
head=0;
tail=len-1;
GanToaDo(SNACK[tail],LEFT+1, TOP+1);
GanToaDo(SNACK[head],LEFT+2, TOP+1);
}

int KiemTraThuocThanConRan(Point P)
{
int i;
i=1;
for(i=1; i<=tail; i++)
{
if(P.x==SNACK[i].x&&P.y==SNACK[i].y)
{
return 1;
break;
9
}
}
return 0;
}
void TaoThucAn()//tao thuc an va ve thuc an ra man hinh
{
ThucAn=SNACK[head];
randomize();
while(KiemTraThuocThanConRan(ThucAn)==1||
(ThucAn.x==SNACK[head].x&&ThucAn.y==SNACK[head].y))
{
GanToaDo(ThucAn,LEFT+1+random(RIGHT-1-LEFT-
2),TOP+1+random(BOTTOM-1-TOP-2));
}
}
void VeThucAn()
{
gotoxy(ThucAn.x,ThucAn.y);
textcolor(LIGHTRED);

cprintf("%c",3);
}
void XoaThucAn()
{
gotoxy(ThucAn.x, ThucAn.y); textcolor(BLACK); cprintf(" ");
}
void VeConRan()
{
int i;
for(i=head; i<=tail; i++)
{
if(i==head)
{
gotoxy(SNACK[i].x,SNACK[i].y);textcolor(LIGHTRED);cprintf("@");
}
else
{
gotoxy(SNACK[i].x,SNACK[i].y);
if(i%2==0) textcolor(15);
if(i%2!=0) textcolor(LIGHTBLUE);
cprintf("%c",254);
}
}
}
10
void XoaConRan()
{
int i;
for(i=head;i<=tail;i++)
{

gotoxy(SNACK[i].x,SNACK[i].y);textcolor(BLACK);cprintf(" ");
}
}
int KiemTraRanDungThanRan()
{
int i;
for(i=1;i<len;i++)
{
if(SNACK[0].x==SNACK[i].x&&SNACK[0].y==SNACK[i].y) break;
}
if(i<len-1) return 1;
else return 0;
}
int KiemTraRanDie()
{
if(SNACK[head].x>LEFT&&SNACK[head].x<RIGHT&&SNACK[head].y>
TOP&&SNACK[head].y<BOTTOM&&KiemTraRanDungThanRan()==0) return
0;//khong chet
else return 1;//rắn chết
}
void DieuChinhToaDoConRan()
{
int i;
for(i=len-1;i>0;i )
{
SNACK[i]=SNACK[i-1];
}
}
void SetLevelScore()
{

score++;
if(score>=DiemTangLevel&&level<10)
{
level++;
DiemTangLevel+=10;
if(level<7) speed-=50;
if(level==7) speed-=15;
if(level==8) speed-=10;
if(level==9) speed-=15;
}
}
11
void BangBaoLevel(int x,int y,int z)
{
gotoxy(1,38);textcolor(GREEN); cprintf("LEVEL: %3d",x);
gotoxy(1,39);textcolor(GREEN); cprintf("SCORE: %3d",y);
gotoxy(1,40);textcolor(GREEN);cprintf("SPEED: %3d",z);
}
void AnThucAn()
{
Point temp;
GanToaDo(temp,SNACK[tail].x-1,SNACK[tail].y);
len++;
tail=len-1;
SNACK[tail]=temp;
SetLevelScore();
TaoThucAn();
}
void ResetGame()
{

KhoiTaoConRan();
TaoThucAn();
score=0;
level=1;
DiemTangLevel=10;
HuongDi=2;
speed=300;
}
//============CAC CHUC NANG CAP CAO CHO GAME.
int LayKeyBanPhim(char &c)
{
do
{
c=toupper(getch());
if(c==0)
{
c=getch();
if(c==75||c==77||c==72||c==80)
{
return 0;
break;
}
}
else
{
if((c>=65&&c<=90)||c==32||c==13)
{
12
return 1;
break;

}
}
}while(1);
}
void HienThiKiTu(char c)
{
switch(c)
{
case 32:cprintf("SPACE");break;
case 13:cprintf("ENTER");break;
case 72:cprintf("KEYUP");break;
case 80:cprintf("KEYDOWN");break;
case 75:cprintf("KEYLEFT");break;
case 77:cprintf("KEYRIGHT");break;
default:cprintf("%c",c);
}
}
int Save(char* link)//luu trang thai con ran va thong tin game vao file co duong
dan link (bao gom ten)
{
FILE* file=fopen(link,"w+b");
if(file!=NULL)
{
fprintf(file,"%d %d %d %d %d %d %d %d
",level,score,speed,HuongDi,DiemTangLevel,ThucAn.x,ThucAn.y,len); //luu giu
cac bien trang thai.
for(int i=0;i<len;i++)
{
fprintf(file,"%d %d ",SNACK[i].x,SNACK[i].y);
}

fclose(file);
return 1;
}
return 0;
}
int Load(char* link)
{
int i,ii;
FILE* file=fopen(link,"r+b");
if(file==NULL){ fclose(file);return 0;}//khong luu dc.
else
{
XoaConRan();
XoaThucAn();
13
//luu giu cac bien trang thai.
fscanf(file,"%d%d%d%d%d%d%d
%d",&level,&score,&speed,&HuongDi,&DiemTangLevel,&ThucAn.x,&ThucAn.
y,&len);
for(i=0;i<len;i++)
{
fscanf(file,"%d%d",&SNACK[i].x,&SNACK[i].y);
}
head=0;
tail=len-1;
fclose(file);
return 1;
}
}
void MenuSaveGame(int x,int y)

{
unsigned char lbutton,rbutton;
int xmouse,ymouse;
char c;
char tenodia[2];
char tenfile[6];
int i,j;
_setcursortype(0);
MOUSE_THERE=1;
Button ODIA,SAVENAME,CANCEL,OK;
VarButton(ODIA,"O Dia:",x,y);
VarButton(SAVENAME,"SaveName:",x,y+2);
VarButton(OK,"[OK]",x+25,y+3);
VarButton(CANCEL,"[CANCLE]",x+30,y+3);
//=======phan do hoa giao dien========================
for(i=x-1;i<=x+38;i++)
{
if(i==x-1)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",201);
gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",200);
}
if(i==x+38)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",187);
gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",188);
}
if(i!=(x-1)&&i!=(x+38))
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",205);

gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",205);
}
}
14
gotoxy((39-strlen("Save Game Menu"))/2+x-1,y-
1);textcolor(YELLOW);cprintf("Save Game Menu");
//

do
{
ShowButton(ODIA);
ShowButton(SAVENAME);
ShowButton(OK);
ShowButton(CANCEL);
do
{
if(kbhit()) getch();
get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
}while(lbutton==0);
if(ClickButton(ODIA,xmouse,ymouse))
{
_setcursortype(1);
EffectClick(ODIA);
do{
c=toupper(getch());
}while(c<=65&&c>=90);
tenodia[0]=c;tenodia[1]=NULL;
gotoxy(x+6,y);textcolor(YELLOW);cprintf("%s",tenodia);
_setcursortype(0);
}

if(ClickButton(SAVENAME,xmouse,ymouse))
{
_setcursortype(1);
EffectClick(SAVENAME);
gotoxy(x+9,y+2);textcolor(15);
i=-1;
int DaGoXong=0;
do
{
do
{
c=toupper(getch());
j=1;
if((c>=65&&c<=90&&j==1)||
(c>=48&&c<=57&&j==1)||((c==13||c==8)&&j==1)) break;
}while(1);
if(((c>=65&&c<=90&&j==1)||
(c>=48&&c<=57&&j==1))&&i<1) //go ki tu abcdef w z
{
tenfile[++i]=c;
gotoxy(x+9+i,y+2);textcolor(15);cprintf("%c",tenfile[i]);
}
if(c==8&&j==1&&i!=-1)
15
{
gotoxy(x+9+i,y+2);textcolor(15);cprintf("%c",32);gotoxy(x+9+i,y+2);
tenfile[i]=NULL;
i;
}
if(c==13&&j==1&&i>=0)

{
tenfile[++i]=NULL;
DaGoXong=1;
}
}while(DaGoXong==0);
gotoxy(x+9,y+2);textcolor(YELLOW);cprintf("%s",tenfile);
_setcursortype(0);
}
if(ClickButton(OK,xmouse,ymouse))
{
EffectClick(OK);
char* s1="";
char* s="";
s1=strcat((char*)tenodia,":\\");
s=strcat(s1,tenfile);
s=strcat(s,".RTA");
gotoxy(1,50);clreol();
if(Save(s)==1)
{
gotoxy((80-strlen("Save Thanh
Cong"))/2,50);textcolor(BLUE);cprintf("Save Thanh Cong");
}
else
{
gotoxy((80-strlen("Save That
Bai"))/2,50);textcolor(BLUE);cprintf("Save That Bai");
}
delay(500);
break;
}

if(ClickButton(CANCEL,xmouse,ymouse))
{
EffectClick(CANCEL);
break;
}
}while(1);
gotoxy(x-1,y-1);clreol();
gotoxy(x,y);clreol();
gotoxy(x,y+2);clreol();
gotoxy(x,y+3);clreol();
gotoxy(x-1,y+4);clreol();
gotoxy(1,50);clreol();
16
}
void MenuLoadGame(int x,int y)
{
unsigned char lbutton,rbutton;
int i,j,xmouse,ymouse;
char c;
char tenodia[2];
char tenfile[6];
_setcursortype(0);
MOUSE_THERE=1;
Button ODIA,SAVENAME,CANCEL,OK;
VarButton(ODIA,"O Dia:",x,y);
VarButton(SAVENAME,"SaveName:",x,y+2);
VarButton(OK,"[OK]",x+20,y+3);
VarButton(CANCEL,"[CANCLE]",x+27,y+3);
//=======phan do hoa giao dien========================
for(i=x-1;i<=x+35;i++)

{
if(i==x-1)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",201);
gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",200);
}
if(i==x+35)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",187);
gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",188);
}
if(i!=(x-1)&&i!=(x+35))
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",205);
gotoxy(i,y+4);textcolor(WHITE);cprintf("%c",205);
}
}
gotoxy((36-strlen("Load Game Menu"))/2+x-1,y-
1);textcolor(YELLOW);cprintf("Load Game Menu");
//

do
{
ShowButton(ODIA);
ShowButton(SAVENAME);
ShowButton(OK);
ShowButton(CANCEL);
do
{
if(kbhit()) getch();

get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
17
}while(lbutton==0);
if(ClickButton(ODIA,xmouse,ymouse))
{
_setcursortype(1);
EffectClick(ODIA);
do{
c=toupper(getch());
}while(c<=65&&c>=90);
tenodia[0]=c;tenodia[1]=NULL;
gotoxy(x+6,y);textcolor(YELLOW);cprintf("%s",tenodia);
_setcursortype(0);
}
if(ClickButton(SAVENAME,xmouse,ymouse))
{
_setcursortype(1);
EffectClick(SAVENAME);
gotoxy(x+9,y+2);textcolor(LIGHTBLUE);
i=-1;
int DaGoXong=0;
do
{
do
{
c=toupper(getch());
if(c==0){ c=getch();j=0;}
else j=1;
if((c>=65&&c<=90&&j==1)||
(c>=48&&c<=57&&j==1)||((c==13||c==8)&&j==1)) break;

}while(1);
if(((c>=65&&c<=90&&j==1)||
(c>=48&&c<=57&&j==1))&&i<1) //go ki tu abcdef w z
{
tenfile[++i]=c;
gotoxy(x+9+i,y+2);textcolor(15);cprintf("%c",tenfile[i]);
}
if(c==8&&j==1&&i>=0)
{
gotoxy(x+9+i,y+2);textcolor(15);cprintf("%c",32);gotoxy(x+9+i,y+2);
tenfile[i]=NULL;
i=i-1;
}
if(c==13&&j==1&&i>=0)
{
tenfile[++i]=NULL;
DaGoXong=1;
}
}while(DaGoXong==0);
gotoxy(x+9,y+2);textcolor(YELLOW);cprintf("%s",tenfile);
18
_setcursortype(0);
}
if(ClickButton(OK,xmouse,ymouse))
{
EffectClick(OK);
char* s1="";
char* s="";
s1=strcat(tenodia,":\\");
s=strcat(s1,tenfile);

s=strcat(s,".RTA");
gotoxy(1,50);clreol();
if(Load(s)==1)
{
BangBaoLevel(level,score,speed);
VeThucAn();
gotoxy((80-strlen("Load Game Thanh
Cong"))/2,50);textcolor(BLUE);cprintf("Load Game Thanh Cong");
}
else
{
gotoxy((80-strlen("Load Game That
Bai"))/2,50);textcolor(BLUE);cprintf("Load Game That Bai");
}
delay(500);
break;
}
if(ClickButton(CANCEL,xmouse,ymouse))
{
EffectClick(CANCEL);
break;
}
}while(1);
gotoxy(x-1,y-1);clreol();
gotoxy(x,y);clreol();
gotoxy(x,y+2);clreol();
gotoxy(x,y+3);clreol();
gotoxy(x-1,y+4);clreol();
gotoxy(1,50);clreol();
}

void MenuControl(int x,int y)
{
unsigned char lbutton,rbutton;
int xmouse,ymouse;
char
tempUP=KUP,tempDOWN=KDOWN,tempLEFT=KLEFT,tempRIGHT=KRIGH
T;
int tempu=KU,tempd=KD,templ=KL,tempr=KR,i;
MOUSE_THERE=1;
19
Button U,D,L,R,OK,DEFAULT,CANCEL;
VarButton(U,"[ M_UP ]",x,y);
VarButton(D,"[ M_DOWN ]",x,y+2);
VarButton(L,"[ M_LEFT ]",x,y+4);
VarButton(R,"[M_RIGHT ]",x+25,y+2);
VarButton(OK,"[SAVE ALL]",x+25,y+4);
VarButton(DEFAULT,"[DEFAUTL]",x+36,y+4);
VarButton(CANCEL,"[CANCEL]",x+46,y+4);
//=======phan do hoa giao dien========================
_setcursortype(0);
for(i=x-1;i<=x+54;i++) {
if(i==x-1)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",201);
gotoxy(i,y+5);textcolor(WHITE);cprintf("%c",200);
}
if(i==x+54)
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",187);
gotoxy(i,y+5);textcolor(WHITE);cprintf("%c",188);

}
if(i!=(x-1)&&i!=(x+54))
{
gotoxy(i,y-1);textcolor(WHITE);cprintf("%c",205);
gotoxy(i,y+5);textcolor(WHITE);cprintf("%c",205);
}
}
gotoxy((55-strlen("Menu CONTROL"))/2+x-1,y-
1);textcolor(YELLOW);cprintf("Menu Control");
//

do
{
ShowButton(U);
ShowButton(D);
ShowButton(L);
ShowButton(R);
ShowButton(OK);
ShowButton(DEFAULT);
ShowButton(CANCEL);
do
{
if(kbhit()) getch(); //chan fim rac
get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
}while(lbutton==0);
if(ClickButton(U,xmouse,ymouse))
{
EffectClick(U);
_setcursortype(1);
20

gotoxy(x+12,y);textcolor(BLACK);cprintf(" ");
gotoxy(x+12,y);textcolor(YELLOW);
KU=LayKeyBanPhim(KUP);
HienThiKiTu(KUP);
}
if(ClickButton(D,xmouse,ymouse))
{
EffectClick(D);
_setcursortype(1);
gotoxy(x+12,y+2);textcolor(BLACK);cprintf(" ");
gotoxy(x+12,y+2);textcolor(YELLOW);
KD=LayKeyBanPhim(KDOWN);
HienThiKiTu(KDOWN);
}
if(ClickButton(L,xmouse,ymouse))
{
EffectClick(L);
_setcursortype(1);
gotoxy(x+12,y+4);textcolor(BLACK);cprintf(" ");
gotoxy(x+12,y+4);textcolor(YELLOW);
KL=LayKeyBanPhim(KLEFT);
HienThiKiTu(KLEFT);
}
if(ClickButton(R,xmouse,ymouse))
{
EffectClick(R);
_setcursortype(1);
gotoxy(x+37,y+2);textcolor(BLACK);cprintf(" ");
gotoxy(x+37,y+2);textcolor(YELLOW);
KR=LayKeyBanPhim(KRIGHT);

HienThiKiTu(KRIGHT);
}
if(ClickButton(OK,xmouse,ymouse))
{
EffectClick(OK);
_setcursortype(0);
break;
}
if(ClickButton(DEFAULT,xmouse,ymouse))
{
EffectClick(DEFAULT);
_setcursortype(0);
KLEFT=75;KRIGHT=77;KUP=72;KDOWN=80;
KL=0,KR=0,KU=0,KD=0;
break;
}
if(ClickButton(CANCEL,xmouse,ymouse))
{
EffectClick(CANCEL);
21
_setcursortype(0);
KLEFT=tempLEFT;KRIGHT=tempRIGHT;KUP=tempUP;KDOWN=tempDOW
N;
KL=templ,KR=tempr,KU=tempu,KD=tempd;
break;
}
_setcursortype(0);
}while(1);
gotoxy(x-10,y-1);clreol();
gotoxy(x,y);clreol();

gotoxy(x,y+2);clreol();
gotoxy(x,y+4);clreol();
gotoxy(x-1,y+5);clreol();
}
void MenuAbout()
{
unsigned char lbutton,rbutton;
int i,j,xmouse,ymouse;
char c;
char tenodia[2];
char tenfile[10];
MOUSE_THERE=1;
Button BACK;
VarButton(BACK,"BACK TO MAIN MENU",6,48);
_setcursortype(0);
//=======phan do hoa giao dien========================
for(i=5;i<=75;i++)
{
if(i==5)
{
gotoxy(i,41);textcolor(WHITE);cprintf("%c",201);
gotoxy(i,49);textcolor(WHITE);cprintf("%c",200);
}
if(i==75)
{
gotoxy(i,41);textcolor(WHITE);cprintf("%c",187);
gotoxy(i,49);textcolor(WHITE);cprintf("%c",188);
}
if(i!=5&&i!=75)
{

gotoxy(i,41);textcolor(WHITE);cprintf("%c",205);
gotoxy(i,49);textcolor(WHITE);cprintf("%c",205);
}
}
gotoxy((70-strlen("Thong Tin Chuong
Trinh"))/2+5,41);textcolor(YELLOW);cprintf("Thong Tin Chuong Trinh");
22
//

textcolor(LIGHTGREEN);
gotoxy(6,43);cprintf("Nguoi viet:NHOM SINH VIEN LOP CT9B");
gotoxy(6,44);cprintf("CAO DANG BINH DINH");
gotoxy(6,46);cprintf("Ten chuong trinh:SNAKE - Ran San Moi");
gotoxy(6,47);cprintf("Chuc nang kem theo:save,load
game,pause,resumegame ");
d
{
ShowButton(BACK);
do
{
if(kbhit()) getch();
get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
}while(lbutton==0);
if(ClickButton(BACK,xmouse,ymouse))
{
EffectClick(BACK);
break;
}
}while(1);
gotoxy(1,41);clreol();

gotoxy(1,43);clreol();
gotoxy(1,44);clreol();
gotoxy(1,45);clreol();
gotoxy(1,46);clreol();
gotoxy(1,47);clreol();
gotoxy(1,48);clreol();
gotoxy(1,49);clreol();
}
void MenuHelp()
{
unsigned char lbutton,rbutton;
int i,j,xmouse,ymouse;
MOUSE_THERE=1;
Button BACK;
VarButton(BACK,"BACK TO MAIN MENU",20,49);
_setcursortype(0);
//=======phan do hoa giao dien========================
for(i=5;i<=75;i++)
{
if(i==5)
{
gotoxy(i,41);textcolor(WHITE);cprintf("%c",201);
gotoxy(i,50);textcolor(WHITE);cprintf("%c",200);
}
if(i==75)
23
{
gotoxy(i,41);textcolor(WHITE);cprintf("%c",187);
gotoxy(i,50);textcolor(WHITE);cprintf("%c",188);
}

if(i!=5&&i!=75)
{
gotoxy(i,41);textcolor(WHITE);cprintf("%c",205);
gotoxy(i,50);textcolor(WHITE);cprintf("%c",205);
}
}
gotoxy((70-strlen("Tro Giup
CachChoi"))/2+5,41);textcolor(YELLOW);cprintf("Tro Giup Cach Choi");
//

textcolor(LIGHTGREEN);
gotoxy(6,43);cprintf("Su dung 4 phim:%c %c %c %c de di chuyen con ran.Ban
co the chinh",24,25,26,27);
gotoxy(6,44);cprintf("lai phim khac neu ban muon.Trong luc choi game F1 de
pause game lai ");
gotoxy(6,45);cprintf("Tren thanh Menu co 1 so tinh nang
nhu:save,load,control,resume ");
gotoxy(6,46);cprintf("Nhan Resume de tiep tuc choi game.");
gotoxy(6,47);cprintf("Game co tat ca 7 cap do choi.Hihi.Chuc vui ve nha.");
do
{
ShowButton(BACK);
do
{
if(kbhit()) getch();
get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
}while(lbutton==0);
if(ClickButton(BACK,xmouse,ymouse))
{
EffectClick(BACK);

break;
}
}while(1);
gotoxy(1,41);clreol();
gotoxy(1,43);clreol();
gotoxy(1,44);clreol();
gotoxy(1,45);clreol();
gotoxy(1,46);clreol();
gotoxy(1,47);clreol();
gotoxy(1,48);clreol();
gotoxy(1,49);clreol();
gotoxy(1,50);clreol();
}
void ShowMessenger(int x,int y,int loai)
24
{
switch(loai)
{
case 1:
textcolor(LIGHTGREEN);
gotoxy(x+3,y);cprintf("Û Û ÛßßßÛ Û Û Û Û Û Û Û");
gotoxy(x+3,y+1);cprintf(" ßÜß º º º º ºÜßܺ º ºßÜ º");
gotoxy(x+3,y+2);cprintf(" Û ÛÜÜÜÛ ÛÜÜÜÛ Ûß ßÛ Û Û ßÛ");
break;
case 0:
textcolor(LIGHTGREEN);
gotoxy(x,y);cprintf("Û Û ÛßßßÛ Û Û Û ÛßßßÛ ÛßßßÛ Ûßß");
gotoxy(x,y+1);cprintf(" ßÜß º º º º º º º ÈÍÍÍ» ÌÍ");
gotoxy(x,y+2);cprintf(" Û ÛÜÜÜÛ ÛÜÜÜÛ ÛÜÜ ÛÜÜÜÛ ÛÜÜÜÛ
ÛÜÜ");

break;
}
}
void HideMessenger(int x,int y)
{
textcolor(BLACK);
gotoxy(x,y);clreol();
gotoxy(x,y+1);clreol();
gotoxy(x,y+2);clreol();
}
int MenuWinLose(int x,int y,int loai)
{
unsigned char lbutton,rbutton;
int xmouse,ymouse;
Button AGAIN,EXIT;
VarButton(AGAIN,"[PLAY AGAIN]",x+8,y+5);
VarButton(EXIT,"[EXIT GAME]",x+5+18,y+5);
ShowMessenger(x,y,loai);
do
{
ShowButton(AGAIN);
ShowButton(EXIT);
do
{
MOUSE_THERE=1;
if(kbhit()) getch();
get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
}while(lbutton==0);
MOUSE_THERE=0;
if(ClickButton(AGAIN,xmouse,ymouse))

{
EffectClick(AGAIN);
25

×