BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ
BÁO CÁO ĐỒ ÁN
MÔN: LẬP TRÌNH CĂN BẢN
Nhóm 05
ĐỀ TÀI: GAME SNAKE (RẮN SĂN MỒI)
GIÁO VIÊN HƯỚNG DẪN:
Phạm Duy Nghiệp
SINH VIÊN THỰC HIỆN:
Phạm Văn Phúc
Trần Hữu Nghị
Hồ Tuấn Kiệt
Lê Khánh Linh
Nguyễn Ngọc Tùng
Nguyễn Trọng Khánh
Lưu Thiện Phát
Nguyễn Dư Nguyên Chương
B1609409
B1609401
B1609171
B1609394
B1609503
B1609391
B1609476
B1609441
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
MỤC LỤC
I.
GIỚI
THIỆU
TÀI:.............................................................................................................3
ĐỀ
1.
Lí
do
chọn
tài..............................................................................................................3
đề
2. Mục tiêu..........................................................................................................................3
3. Yêu cầu...........................................................................................................................3
4. Giới hạn..........................................................................................................................3
5. Hướng giải quyết............................................................................................................3
II.
KẾ...............................................................................................................................3
THIẾT
1.
Giải
thuật
đồ..............................................................................................................3
lưu
2.
Chương
trình
tiết.....................................................................................................15
chi
III. KẾT LUẬN..........................................................................................................................29
1.
Kết
quả
được...........................................................................................................29
đạt
2. Ưu điểm........................................................................................................................30
3. Hạn chế cần khắc phục.................................................................................................30
IV. TÀI LIỆU THAM KHẢO..................................................................................................30
2
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
I. GIỚI THIỆU ĐỀ TÀI
1. Lí do chọn đề tài
Hoạt động về game đã xuất hiện ở Việt Nam rất lâu và nó bắt nguồn từ game trên
điện thoại và dần dần xuất hiện trên máy tính . Càng ngày nó càng thu hút người chơi và trở
thành một bộ môn thể thao điện tử của nước ta. Và Snake cũng không ngoại lệ cũng từng là 1
game đình đám cả trên điện thoại lẫn đến máy tính. Vì thế chúng em chọn nó để làm đề tài cho
đồ án này.
2. Mục tiêu
Mô phỏng trò chơi Snake (Rắn săn mồi) trên phần mềm Dev C++ bằng ngôn ngữ
C.
3. Yêu cầu
Gồm 8 công việc:
1. In ra số lần số lần đã chơi game khi mở chương trình.
2. Tạo menu game.
3. Khởi tạo , hiển thị con rắn và thức ăn.
4. Điền khiển con rắn theo các hướng (lên , xuống, qua trái , qua phải).
5. Xử lí tình huống rắn chạm biên và tự ăn chính mình.
6. Xử lí tốc độ và chiều dài của rắn khi ăn được hoa quả.
7. Trở về menu game khi người chơi thua cuộc.
8. Hiển thị số điểm người chơi sau mỗi lần ăn được thức ăn và mỗi màn chơi.
4. Giới hạn
-Một tuần lên ý tưởng và thực hiện.
-Số lượng thành viên trong nhóm: 8 người.
5. Hướng giải quyết
-Các thành viên ôn lại các kiến thức đã học trên lớp.
-Tham khảo tài liệu từ internet, giáo trình, sách tại trung tâm học liệu, thư viện
khoa,...
-Lên kế hoạch họp nhóm và phân công công việc cụ thể
II. THIẾT KẾ
1. Giải thuật lưu đồ
1.1. Chương trình chính
3
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
int maingame();
Bắt đầu
srand(time(NULL))
Snake snake; HoaQua hq;
KhoiTao(snake,hq)
int win=0, score=0, Delay=250;
while
TRUE
đúng
Win=XuLy(snake,hq,Delay,scor
HienThi(snake,hq,score);Control(snake);
e);
if
sai
win==-1
đúng
return 0;
gotoXY(92,15)
Kết thúc
printf ("Game Over!!Click
ENTER");
4
break;
Sleep(Delay);
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
5
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2. Chương trình con
1.2.1. Bộ đếm
if(a>0||a<8)
int i=1
ĐÚNG
SAI
fclose(file)
fseek(file,0,SEEK_END)
b=ftell(file)/sizeof(int)
file=fopen
fwrite(&a,sizeof(int),1,file)
TextColor(12)
printf("\n\n\n\n\n\n>>The Snake Game has run %d times!\n",b)
6
fclose(file)
Đồ án Lập Trình Căn Bản
1.2.2. Logo 1
Trường Đại học Cần Thơ
LOGO 1
Nocursortype();
TextColor(7);
i=0
SAI
i < 120
END
ĐÚNG
printf("%c",196);
i++
TextColor(values);
Values chạy từ 14
xuống 8 và trở lại 14
Lặp lại 13 lần
printf(“text”);
TextColor(7);
i=0
SAI
i < 120
END
ĐÚNG
printf("%c",196);
i++
7
Đồ án Lập Trình Căn Bản
1.2.3. Logo 2
Trường Đại học Cần Thơ
LOGO 2
Nocursortype();
TextColor(7);
i=0
SAI
i < 120
END
ĐÚNG
printf("%c",196);
i++
TextColor(values);
Values chạy từ 14 xuống
8 và trở lại 14
Lặp lại 13 lần
printf(“text”);
Sleep(50);
TextColor(7);
i=0
SAI
i < 120
ĐÚNG
printf("%c",196);
i++
8
END
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2.4. Hiển thị
Bắt đầu
TextColor(14);
void HienThi(Snake snake,HoaQua hq,int &score);
gotoXY(hq.td.x,hq.td.y)
clrscr;
printf("%c%c",219,219);
TextColor(14);
for
TextColor(13);
int i=0
gotoXY (snake.dot[0].x,
snake.dot[0].y);
i<30
printf("%c%c",219,219);
i++
gotoXY(91,i)
for
printf(“%c”,179);
int i=1
Kết thúc
i < snake.n
i++
gotoXY (snake.dot[i].x, snake.dot[i].y);
printf("%c%c",219,219);
9
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2.5. Control
Bắt đầu
int i = snake.n - 1
SAI
i>0
KẾT THÚC
snake.dot[i] = snake.dot[i-1]
1.2.6. Xử lí
i--
10
ĐÚNG
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
11
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
12
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
hq.td.y = rand() %
consoleHeight;
if
sai
Delay > 30
đúng
Delay -= 5;
return 0;
Kết thúc
13
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2.7. Menu
14
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2.8. int main
Int main
menu();
_getch();
return 0;
15
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
1.2.9. About
Bắt đầu
void about();
system(“cls”);
Lặp 2 lần, thay đổi
value và text
Sleep(400);
TextColor(values)
printf(“text”);
for
int i=0
i<120
i++
printf("%c",196);
Kết thúc
16
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
2. Chương trình chi tiết
/* Do an lap trinh ngon ngu C: Game SNAKE
Nhom 4:
TEN
MSSV
LOP
Tran Huu Nghi
B1609401 TN16Y8A1
Pham Van Phúc
B1609409 TN16Y8A1
Ho Tuan Kiet
B1609171 TN16Y5A2
Le Khanh Linh
B1609394 TN16Y8A1
Nguyen Ngoc Tung
B1609503 TN16Y8A2
Nguyen Trong Khanh
B1609391 TN16Y8A1
Luu Thien Phat
B1609476 TN16Y8A2
Nguyen Du Nguyen Chuong B1609441 TN16Y8A2
*/
//==========================INCLUDE LIBRARY=========================
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
//=========================KHAI BAO HANG SO=========================
#define consoleWidth 90
#define consoleHeight 29
#define MAX_LIST 3
//=========================KHAI BAO HAM SCREEN=====================
void clrscr() //XOA MAN HINH
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
COORD
Home = {0,0};
DWORD
dummy;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
FillConsoleOutputCharacter(hConsoleOut,' ',csbiInfo.dwSize.X *
csbiInfo.dwSize.Y,Home,&dummy);
17
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
csbiInfo.dwCursorPosition.X = 0;
csbiInfo.dwCursorPosition.Y = 0;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}
void gotoXY (int column, int line) //DUA CON TRO DEN TOA DO X,Y
{
COORD coord;
coord.X = column;
coord.Y = line;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
int whereX() //GET X
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
if(GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
return csbi.dwCursorPosition.X;
return -1;
}
int whereY() //GET Y
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
if(GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
return csbi.dwCursorPosition.Y;
return -1;
}
void TextColor(int color) // THAY DOI MAU VAN BAN
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , color);
}
void Nocursortype() //AN CON TRO
{
CONSOLE_CURSOR_INFO Info;
Info.bVisible = FALSE;
Info.dwSize = 20;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info);
18
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
}
//=================TAO BO DEM SO LAN THUC HIEN CHUONG TRINH========
void bodem()
{
int a,b;
FILE *file;
file=fopen("D:\\SnakeProject\\BODEM.dat","ab"); //TAO RA FILE DATA:
BODEM.DAT TRONG O DIA E ; ab: NOI VAO TAP TIN NHI PHAN
if(a>0||a<8)
{
int i=1;
i++;
fwrite(&a,sizeof(int),1,file); //GHI DU LIEU KHI THOA MAN DIEU KIEN
}
fclose(file); // FLUSH
file=fopen("D:\\SnakeProject\\BODEM.dat","rb"); //MO FILE DATA: BODEM.DAT
TRONG O DIA E, rb: MO TAP TIN NHI PHAN DE DOC
fseek(file,0,SEEK_END); // THIET LAP VI TRI FILE TOI OFFSET DA CHO: TEN,
SO BYTE DE OFFSET, VI TRI OFFSET THEM VAO: PHAN CUOI FILE
b=ftell(file)/sizeof(int); //TRA VE VI TRI FILE HIEN TAI
fclose(file);
TextColor(12);
printf("\n\n\n\n\n\n>>The Snake Game has run %d times!\n",b);
}
//==========================TAO LOGO CUA GAME======================
void logo1() //LOGO TINH
{
Nocursortype(); //AN CON TRO
TextColor(7);
for(int i=0; i<120; i++)
{
printf("%c",196);
}
TextColor(14);
printf("\n
ssssssssssss
nnnnn nnnnnn
aaaaaa
kkkkkk kkkkkk
ssssssssssssssssss ");
TextColor(13);
19
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
printf("\n ssssssssssssssss nnnnnn nnnnnn
aaaaaaaa
kkkkkk
kkkkkk ssssssssssssssssss ");
TextColor(12);
printf("\n ssssssssssssssssss nnnnnnn nnnnnn
aaaaaaaaaa
kkkkkk
kkkkkk
ssssssssssssssssss ");
TextColor(11);
printf("\n ssssss ssssss nnnnnnnn nnnnnn
aaaaa aaaaa
kkkkkk
kkkkkk
ssssss
");
TextColor(10);
printf("\n ssssss ssssss nnnnnnnnn nnnnnn
aaaaa aaaaa
kkkkkk
kkkkkk
ssssss
");
TextColor(9);
printf("\n
ssssss
nnnnnnnnnn nnnnnn aaaaaaaaaaaaaaaa kkkkkk
kkkkkk
ssssssssssssss
");
TextColor(8);
printf("\n
ssssss
nnnnnnnnnnnnnnnnn aaaaaaaaaaaaaaaaaa
kkkkkkkkkkkk
ssssssssssssss
");
TextColor(9);
printf("\n
ssssss
nnnnnn nnnnnnnnnn aaaaaaaaaaaaaaaaaa kkkkkk
kkkkkk
ssssssssssssss
");
TextColor(10);
printf("\n
ssssss
nnnnnn nnnnnnnnn aaaaaa aaaaaa kkkkkk kkkkkk
ssssss
");
TextColor(11);
printf("\n ssssss ssssss nnnnnn nnnnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk
ssssss
");
TextColor(12);
printf("\n ssssss ssssss nnnnnn nnnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk
ssssssssssssssssss ");
TextColor(13);
printf("\n ssssssssssssssss nnnnnn nnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk ssssssssssssssssss ");
TextColor(14);
printf("\n
ssssssssssss
nnnnnn nnnnn aaaaaa aaaaaa kkkkkk
kkkkkk ssssssssssssssssss \n");
TextColor(7);
for(int i=0; i<120; i++)
{
printf("%c",196);
}
20
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
printf("\n\n");
}
void logo2() //LOGO HIEU UNG DONG
{
Nocursortype(); //AN CON TRO
TextColor(14);
printf("\n
ssssssssssss
nnnnn nnnnnn
aaaaaa
kkkkkk kkkkkk
ssssssssssssssssss ");
Sleep(50);
TextColor(13);
printf("\n ssssssssssssssss nnnnnn nnnnnn
aaaaaaaa
kkkkkk
kkkkkk ssssssssssssssssss ");
Sleep(50);
TextColor(12);
printf("\n ssssssssssssssssss nnnnnnn nnnnnn
aaaaaaaaaa
kkkkkk
kkkkkk
ssssssssssssssssss ");
Sleep(50);
TextColor(11);
printf("\n ssssss ssssss nnnnnnnn nnnnnn
aaaaa aaaaa
kkkkkk
kkkkkk
ssssss
");
Sleep(50);
TextColor(10);
printf("\n ssssss ssssss nnnnnnnnn nnnnnn
aaaaa aaaaa
kkkkkk
kkkkkk
ssssss
");
Sleep(50);
TextColor(9);
printf("\n
ssssss
nnnnnnnnnn nnnnnn aaaaaaaaaaaaaaaa kkkkkk
kkkkkk
ssssssssssssss
");
Sleep(50);
TextColor(8);
printf("\n
ssssss
nnnnnnnnnnnnnnnnn aaaaaaaaaaaaaaaaaa
kkkkkkkkkkkk
ssssssssssssss
");
Sleep(50);
TextColor(14);
printf("\n
ssssss
nnnnnn nnnnnnnnnn aaaaaaaaaaaaaaaaaa kkkkkk
kkkkkk
ssssssssssssss
");
Sleep(50);
TextColor(13);
21
Đồ án Lập Trình Căn Bản
printf("\n
Trường Đại học Cần Thơ
ssssss
nnnnnn nnnnnnnnn
ssssss
aaaaaa
aaaaaa
kkkkkk kkkkkk
");
Sleep(50);
TextColor(5);
printf("\n ssssss ssssss nnnnnn nnnnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk
ssssss
");
Sleep(50);
TextColor(4);
printf("\n ssssss ssssss nnnnnn nnnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk
ssssssssssssssssss ");
Sleep(50);
TextColor(3);
printf("\n ssssssssssssssss nnnnnn nnnnnn aaaaaa aaaaaa kkkkkk
kkkkkk ssssssssssssssssss ");
Sleep(50);
TextColor(2);
printf("\n
ssssssssssss
nnnnnn nnnnn aaaaaa aaaaaa kkkkkk
kkkkkk ssssssssssssssssss \n");
Sleep(50);
TextColor(1);
}
//=============THONG TIN TRO CHOI, DIEU KHIEN, NGUOI LAP TRINH========
void about()
{
system("cls");
Sleep(400);
TextColor(9);
printf("\n\n\n\t\t\t\t\t\t\t[CONTROL]"); // HUONG DAN DIEU KHIEN
Sleep(400);
TextColor(7);
printf("\n\t\t\t\t\t\t\tA to LEFT");
Sleep(400);
printf("\n\t\t\t\t\t\t\tD to RIGHT");
Sleep(400);
printf("\n\t\t\t\t\t\t\tW to UP");
Sleep(400);
printf("\n\t\t\t\t\t\t\tS to DOWN\n\n");
Sleep(400);
TextColor(5);
for(int i=0;i<120;i++)
22
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
{
printf("%c",196);
}
TextColor(10);
printf("\n\n\t\t\t\t\t The Snake Game is written by 5Team!"); // THONG CO BAN CUA
GAME: NHOM LAP TRINH, TEN GAME, CHUONG TRINH HO TRO, NGUOI HUONG
DAN
Sleep(400);
TextColor(11);
printf("\n\t\t\t\t\t\tProject Name: SNAKE GAME");
Sleep(400);
printf("\n\t\t\t\t\t
The Source Program: Dev C++");
Sleep(400);
TextColor(14);
printf("\n\t\t\t\t\t Adviser: M.S. Pham Duy Nghiep\n\n");
Sleep(400);
TextColor(5);
for(int i=0;i<120;i++)
{
printf("%c",196);
}
TextColor(14);
printf("\n\n\t\t\t\t\t\tThe members of 5Team:"); // THONG TIN THANH VIEN NHOM
LAP TRINH
TextColor(7);
Sleep(400);
printf("\n\t\t\t\t\t\tTran Huu Nghi");
Sleep(400);
printf("\n\t\t\t\t\t\tPham Van Phuc");
Sleep(400);
printf("\n\t\t\t\t\t\tHo Tuan Kiet");
Sleep(400);
printf("\n\t\t\t\t\t\tLe Khanh Linh");
Sleep(400);
printf("\n\t\t\t\t\t\tNguyen Ngoc Tung");
Sleep(400);
printf("\n\t\t\t\t\t\tNguyen Trong Khanh");
Sleep(400);
printf("\n\t\t\t\t\t\tLuu Thien Phat");
Sleep(400);
23
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
printf("\n\t\t\t\t\t\tNguyen Du Nguyen Chuong\n");
system("pause");
}
//=====================KHOI TAO MAINGAME===========================
enum status {UP, DOWN, LEFT, RIGHT};
struct ToaDo
{
int x,y;
//X LA HOANH DO, Y LA TUNG DO
};
struct HoaQua
{
ToaDo td;
};
struct Snake
{
ToaDo dot[65]; //GIOI HAN CON RAN CO 65 DOT
int n;
status tt;
};
void KhoiTao (Snake &snake, HoaQua &hq) //KHOI TAO CON RAN VA THUC AN
{
snake.n = 3; // KHOI TAO CON RAN BAN DAU CO 3 DOT
snake.dot[0].x = 46; //VI TRI BAN DAU CUA CON RAN TREN TRUC X
snake.dot[0].y = 13; //VI TRI BAN DAU CUA CON RAN TREN TRUC X
snake.tt = RIGHT; //CON RAN DI CHUYEN SANG PHAI KHI CHAY CHUONG
TRINH
hq.td.x = 62; //TOA DO BAN DAU CUA THUC AN
hq.td.y = 23;
}
void HienThi (Snake snake, HoaQua hq,int &score) //HIEN THI CON RAN VA THUC AN
LEN MAN HINH
{
//*******************************HIEN THI KHUNG GIOI HAN******************
clrscr();
24
Đồ án Lập Trình Căn Bản
Trường Đại học Cần Thơ
TextColor(14);
for (int i = 0; i < 30; i++) //CANH BIEN
{
gotoXY (91, i);
printf("%c",179);
}
//**************************HIEN THI THUC AN LEN MAN HINH***************
TextColor (14);
gotoXY (hq.td.x, hq.td.y);
printf("%c%c",219,219);
gotoXY(92,5);
printf("SCORE: ",score);
//**************************HIEN THI CON RAN LEN MAN HINH****************
TextColor (13);
gotoXY (snake.dot[0].x, snake.dot[0].y); //DAU CON RAN
printf("%c%c",219,219);
for (int i = 1; i < snake.n; i++)
{
gotoXY (snake.dot[i].x, snake.dot[i].y); //THAN VA DUOI CON RAN
printf("%c%c",219,219);
}
}
//**************************DIEU KHIEN CON RAN****************************
void Control (Snake &snake)
{
for (int i = snake.n - 1; i > 0; i--) // TRUYEN TRANG THAI CHO DOT CU
snake.dot[i] = snake.dot[i-1];
if (_kbhit()) // PHAT HIEN PHIM AN VAO, LUU LAI DE XU LY
{
int key = _getch();
if (key == 'A' || key == 'a') //DIEU KHIEN DAU CON RAN
snake.tt = LEFT;
else if (key == 'D' || key == 'd')
snake.tt = RIGHT;
else if (key == 'W' || key == 'w')
snake.tt = UP;
else if (key == 'S' || key == 's')
snake.tt = DOWN;
}
if (snake.tt == UP)
25