Xác định yêu cầu Trải qua quá trình tìm hiểu, học tập dưới sự hướng dẫn của giảng viên Trương Toàn Thịnh, nhóm 3- 21CTT4 đã xây dựng thành công một phiên bản của Hunting Snake Game có c
Trang 1MỤC LỤC
I LỜI CẢM ƠN 3
II GIỚI THIỆU ĐỒ ÁN 3
A Xác định yêu cầu 3
B Yêu cầu chức năng 4
C Yêu cầu tin học 5
III MODULE SYSTEM: 5
A File System.h 5
B File System.cpp 6
1 Hàm FixConsoleWindow() 6
2 Hàm GotoXY() 7
3 Hàm ShowCur() 7
4 Hàm SetColor() 7
5 Hàm DisableSelection() 8
6 Hàm ShowScrollbar() 8
7 Hàm resizeConsole() 8
IV MODULE PREPARE 9
A File Prepare.h 9
B File Prepare.cpp 9
1 Hàm IsValidLevel1() 9
2 Hàm GenerateFood() 10
3 Hàm ResetDataLV1() 11
V MODULE PROCESSGAME 12
A File ProcessGame.h 12
B File ProcessGame.cpp 12
1 Hàm StartGame() 12
2 Hàm PauseGame(HANDLE t) 14
3 Hàm SaveGame() 14
4 Hàm LoadGame() 16
5 Hàm Eat() 18
6 Hàm ProcessDead() 20
7 Hàm MoveLeft(), MoveRight(), MoveUp(), MoveDown() 21
8 Hàm ThreadFunc() 22
9 Hàm Menu() 23
Trang 210 Hàm InGame(int oldgame=0) 23
11 Hàm GameOver() 23
12 Hàm QuitGame() 23
13 Hàm Information() 24
14 Hàm SetSnakeColor() 24
15 Hàm SetSpeed() 24
16 Hàm SetSound() 24
17 Hàm Setting() 24
VI MODULE DRAW 24
A File Draw.h 24
B File Draw.cpp 25
1 Hàm DrawBoard(int x, int y, int width, int height, int curPosX = 0, int curPosY = 0) 25
2 Hàm SmallBoard() 26
3 Hàm DrawSnakeAndFood(const char str, int start_char = 0) 26
4 Hàm DrawWallLevel2(), DrawWallLevel3(), DrawWallLevel(4) 26
5 Hàm DrawGateLevel1(), DrawGateLevel2(), DrawGateLevel3(), DrawGateLevel4() 27
6 Hàm DrawContinueGame() 27
VII MODULE DEAD 28
A File Dead.h 28
B File Dead.cpp 29
1 Các hàm ReachBodyLeft(), ReachBodyRight(), ReachBodyUp(), ReachBodyDown() 29
2 Các hàm LeftDeadLevel1(), RightDeadLevel1(), UpDeadLevel1(), DownDeadLevel1() 29
VIII TẬP TIN MAIN.CPP 30
Trang 3I LỜI CẢM ƠN
Trong suốt quá trình tìm hiểu và hoàn thành đồ án, nhóm 3 đã nhận được sự
hỗ trợ từ nhiều phía, nhóm xin gửi lời cảm ơn chân thành đến:
- Sự giúp đỡ và hỗ trợ của các giảng viên phụ trách giảng dạy về kiến thức
Xin chân thành cảm ơn!
Hoạt động về Game đã xuất hiện từ lâu tại Việt Nam Game bắt nguồn từ điện thoại và dần dần xuất hiện cả trên máy tính Game ngày càng phát triển và trở thành một hình thức giải trí cũng như một nền tảng để người chơi kiếm thêm thu nhập Hunting Snake cũng không ngoại lệ khi phát triển thành công và nổi tiếng trên điện thoại lẫn máy tính với nhiều phiên bản khác nhau thu hút người chơi Trong môn học Ký thuật lập trình của lớp 21CTT4, do Giảng viên- Tiến Sĩ Trương Toàn Thịnh hướng dẫn, trò chơi này là một đồ án thực hành cần thiết nhằm thúc đẩy sự tìm tòi và tư duy về kỹ năng lập trình cho các sinh viên ngành Công nghệ thông tin.
A Xác định yêu cầu
Trải qua quá trình tìm hiểu, học tập dưới sự hướng dẫn của giảng viên
Trương Toàn Thịnh, nhóm 3- 21CTT4 đã xây dựng thành công một phiên bản của Hunting Snake Game có các chức năng chính: Di chuyển con rắn bằng các phím điều hướng W, A, S, D; tăng chiều dài khi ăn được vật phẩm (Mỗi đốt thân rắn là một chữ số trong mã số sinh viên của các thành viên), lưu và tải game khi đang chơi, âm thanh phù hợp với các thao tác.
Trang 4Sự hoạt động và chức năng của từng hàm sẽ được giải thích chi tiết trong bản báo cáo này Các thông tin trên sẽ được trình bày ở mục III sau.
Danh sách thành viên tham gia đồ án:
ST
T
Xây dựng trò chơi Rắn săn mồi đơn giản với đồ họa là màn hình Console.
B Yêu cầu chức năng
- Di chuyển con rắn: bằng các phím ‘A’, ‘W’, ‘S’, ‘D’ để ăn vật phẩm
- Xử lý trường hợp đầu rắn chạm vào thân của nó: kết thúc trò chơi khi
trường hợp này xảy ra.
- Lưu/Tải (Save/ Load) trò chơi: Khi người chơi nhấn phím ‘T’, yêu cầu
người chơi cung cấp tên tệp để lưu Khi người chơi nhấn phím ‘L’, yêu cầu người chơi cung cấp tên tập để tải.
- Giữ độ dài thân rắn không đổi: Khi di chuyển tới cấp tiếp theo, độ dài
thân rắn sẽ được cài đặt lại theo mặc định Cần tìm hiểu và xử lý sao cho
độ dài thân rắn không đổi khi tới cấp tiếp theo, độ dài chỉ được cài đặt trở lại theo mặc định khi người chơi vượt qua hết 4 cấp độ và quay trở lại cấp 1 với tốc độ di chuyển nhanh hơn.
- Xử lý cổng: Khi con rắn ăn hết 8 vật phẩm, trên màn hình Console sẽ
hiện ra một cái cổng, con rắn sẽ di chuyển qua cổng này để đến cấp độ tiếp theo Tuy nhiên, con rắn phải di chuyển qua cổng hoàn toàn thì màn hình Console mới chuyển sang màn hình của cấp tiếp theo.
- Cung cấp hiệu ứng: Khi con rắn chạm vào tường, thân của nó hoặc
cổng, lập trình viên tạo các hiệu ứng sống động cho các quá trình này.
- Tạo menu: Để người chơi dễ dàng hơn trong việc chọn hoạt động tiếp
theo mà họ muốn.
Trang 5- Thân rắn: được hình thành từ mã số sinh viên của các thành viên trong
nhóm
C Yêu cầu tin học
- Ngôn ngữ lập trình: C/C++
- Môi trường lập trình: Visual Studio
- Đối tượng lập trình: Màn hình Console
III MODULE SYSTEM:
6 extern POINT snake[40];
7 extern POINT food[8];
Trang 63 void resizeConsole(int width, int height);
- Khai báo các biến toàn cục và các hàm xử lý thao tác trên màn hình Console được sử dụng trong suốt Project.
- Dòng 4 khai báo một chuỗi kí tự, đó là các chữ số trong mã số sinh viên của các thành viên trong nhóm.
Trang 7B File System.cpp
1 Hàm FixConsoleWindow()
Hàm này được dùng để cài đặt kích thước của màn hình Console, không cho phép người chơi thay đổi kích thước màn hình Console.
1 void FixConsoleWindow()
2 {
3 HWND consoleWindow = GetConsoleWindow();
4 LONG style = GetWindowLong(consoleWindow, GWL_STYLE);
5 style = style & ~(WS_MAXIMIZEBOX) & ~(WS_THICKFRAME);
7 }
2 Hàm GotoXY()
Hàm có đối số đầu vào là tọa độ một vị trí bất kỳ mà Lập trình viên muốn di chuyển đến đó và thực hiện các thao tác khác trên màn hình Console
1 void GotoXY(int x, int y)
Trong hàm ShowCur() có gọi hàm SetConsoleCursorInfo() với
chức năng cài đặt kích thước và khả năng hiển thị của con trỏ chuột (ẩn hay hiển thị) trên màn hình Console
1 void ShowCur(bool CursorVisibility)
2 {
3 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
4 CONSOLE_CURSOR_INFO cursor = { 1, CursorVisibility };
5 SetConsoleCursorInfo(handle, &cursor);
6 }
Trang 84 Hàm SetColor()
Hàm có chức năng thay đổi màu sắc của các kí tự khi in ra màn hình giúp cho trò chơi trở nên thú vị, đẹp mắt và thu hút người chơi hơn
1 void SetColor(WORD color)
Trang 94 bool IsValidLevel1(int x int y);
5 bool IsValidLevel2(int x int y);
6 bool IsValidLevel3(int x int y);
7 bool IsValidLevel4(int x int y);
9 void GenerateFood();
11 void ResetDataLV1();
1
2 void ResetDataLV2();
Trang 13Hàm GenerateFood() tạo thức ăn Tọa độ sẽ được random và kiểm tra có
trùng với thân rắn hay chướng ngại vật hay không, nếu hợp lệ tọa độ đó sẽ là tọa
Khởi động lại dữ liệu bao gồm độ dài thân rắn và tọa độ của các đốt thân rắn
khi bắt đầu một level mới Trong hàm ResetDataLV1() gọi hàm GenerateFood()
Trang 1527 STATE = 1; // Start running Thread
28 LEVELUP = 0; // Not levelup when starting new
29 }
- system("cls" ) được dùng để làm sạch màn hình
- Hàm SetColor(2) được dùng để thiết lập màu cho giao diện.
- Mỗi level khác nhau sẽ được gọi hàm ResetData() để khởi động lại
dữ liệu và hàm DrawWallLevel() để vẽ chướng ngại vật tương ứng.
- Hàm DrawBoard(1, 1, WIDTH_CONSOLE, HEIGH_CONSOLE)
dùng để vẽ khung hình chữ nhật cho trò chơi.
- Hàm GenerateFood() dùng để khởi tạo thức ăn.
- Khi STATE = 1, con rắn sẽ được vẽ lên màn hình.
- LEVELUP = 0: Thiết lập level khi bắt đầu game mới
Trang 168 for (int i = 0; i < 53; i++)
24 cout << " Enter file name: ";
25 // Print the filenames were saved
47 fopen_s(&file, "namesaved.txt", "at");
Trang 1757 MOVING, SPEED, STATE, LEVEL, LEVELUP,fprintf(file, "%d %d %d %d %d %d %d %d %d\n", CHAR_LOCK,
- Từ dòng 26 đến dòng 40: in ra màn hình danh sách tên các file game
cũ đã được lưu trước đó
- Từ dòng 42 đến dòng 76: lưu game đang chơi, màn hình trò chơi lúc này
sẽ dừng lại.
4 Hàm LoadGame()
Hàm dùng để tải dữ liệu game đã lưu trước đó.
Trang 1824 cout << " Enter file name: ";
25 // Print the filenames were saved
Trang 1941 // Load old game
51 &CHAR_LOCK, &MOVING, &SPEED, &STATE, &LEVEL, fscanf_s(file, "%d %d %d %d %d %d %d %d %d\n",
52 &LEVELUP, &temp, &SCORE, &SNAKE_COLOR);
- Từ dòng 3 đến dòng 24: vẽ giao diện khi người chơi chọn mục
LOADGAME, bao gồm khung màn hình chính – DrawBoard(), khung màn hình phụ - SmallBoard() và các dòng lệnh để người chơi chọn và
nhập tên file đã lưu trước đó.
- Từ dòng 26 đến dòng 40: in ra tên các file đã được lưu trước đó lên
màn hình.
Trang 20- Từ dòng 42 đến dòng 69: tải dữ liệu của tên file game cũ người chơi đã
nhập và vẽ lên màn hình hình ảnh lúc người chơi lưu game bằng hàm
Trang 21- Hàm PlaySound(L("tenfile.wav"), NULL, SND_SYNC): tạo
thêm âm thanh cho trò chơi.
- Dòng 5: Mỗi lần rắn ăn mồi là điểm số của người chơi được cộng thêm 5.
- Dòng 7 đến dòng 15: Khi rắn ăn đủ số thức ăn quy định của
mỗi màn (8 miếng), LEVELUP = 1 và rắn sẽ không thể ăn
thêm thức ăn Nếu chưa đủ số lượng yêu cầu, thức ăn sẽ tiếp tục in ra màn hình với vị trí ngẫu nhiên.
- Dòng 18 đến dòng 31: Khi LEVELUP=1, các hàm vẽ cổng tương
ứng của mỗi màn chơi sẽ được gọi Cổng qua màn chơi kế tiếp sẽ xuất hiện kèm theo âm thanh.
6 Hàm ProcessDead()
Hàm tạo hiệu ứng chết cho con rắn khi người chơi điều khiển con rắn đụng vào tường, đụng vào thành cổng hay đụng vào thân rắn.
Trang 22- SetColor(SNAKE_COLOR + 1): thay đổi màu của rắn.
- PlaySound(L"die.wav", NULL, SND_SYNC) tạo âm
thanh khi rắn chết.
- Từ dòng 13 đến dòng 26: tạo hiệu ứng rắn chết (toàn thân
lần lượt biến mất)
7 Hàm MoveLeft(), MoveRight(), MoveUp(), MoveDown()
Các hàm quản lí việc di chuyển sang trái, phải, lên xuống của con rắn.
7 LeftDeadLevel2()) || (LEVEL == 3 && LeftDeadLevel3())elseif ((LEVEL == 1 && LeftDeadLevel1()) || (LEVEL == 2 &&
8 || (LEVEL == 4 && LeftDeadLevel4()))
Trang 23- Dòng 3 đến dòng 11: kiểm tra xem con rắn có chạm vào thân
không bằng hàm ReachBodyLeft() hoặc đụng vào tường trong các màn chơi bằng các hàm LeftDeadLevel (), nếu có thì rắn chết (xử lí bằng hàm ProcessDead())
- Dòng 14 đến dòng 27: nếu tọa độ của đầu rắn trùng với tọa độ
thức ăn thì gọi hàm Eat() để thực hiện việc ăn mồi Đồng thời
thân rắn sẽ tăng lên một đơn vị.
Trang 24 New Game (bắt đầu vào trò chơi mới)
Load Game (Tải lại game đã được lưu)
Setting (Cài đặt màu sắc, âm thanh, tốc độ)
Introdution (Thông tin giảng viên và nhóm lập trình, hướng dẫn các phím điều khiển trong trò chơi)
Quit game (Thoát khỏi trò chơi).
Trang 25Hàm để thiết lập tổng thể trò chơi, trong đó bao gồm các hàm
SetSnakeColor(), SetSpeed(), SetSound().
VI MODULE DRAW
A File Draw.h
File Draw.h chứa khai báo các hàm dùng để vẽ giao diện, nhân vật chính (con rắn), thức ăn, chướng ngại vật và cổng ở mỗi level trong game.
Trang 26= 0); // Function to draw the board of game
5 void SmallBoard();// Function to draw board of score and length while playing
6 voiddraw snake and food DrawSnakeAndFood(constchar str, int start_char = 0); // Function to
7 void DrawWallLevel2();// Function to draw obstacles in level 2
8 void DrawWallLevel3();// Function to draw obstacles in level 3
9 void DrawWallLevel4();// Function to draw obstacles in level 4
10 void DrawGateLv1();// Function to draw gate in level 1
11 void DrawGateLv2();// Function to draw gate in level 2
12 void DrawGateLv3();// Function to draw gate in level 3
13 void DrawGateLv4();// Function to draw gate in level 4
14 void DrawContinueGame();// Function to draw board after saving and loading
B File Draw.cpp
1 Hàm DrawBoard(int x, int y, int width, int height, int curPosX = 0, int curPosY = 0)
Hàm vẽ khung chính của trò chơi.
1 void DrawBoard(int x, int y, int width, int height, int curPosX, int curPosY)
6 GotoXY(x y); cout << b;
7 for (int i = 1; i < width; i++)
8 cout << b;
9 cout << b;
10 GotoXY(x height + y); cout << a;
11 for (int i = 1; i < width; i++)
12 cout << a;
13 cout << a;
14 for (int i = y + 1; i < height + y; i++)
16 GotoXY(x, i); cout << c;
17 GotoXY(x + width, i); cout << c;
19
20 GotoXY(x + width + 2, y);
21 for (int i = 0; i < 30; i++)
22 cout << b;
Trang 2723 GotoXY(x + width + 2, y + height);
24 for (int i = 0; i < 30; i++)
Trang 28- Hàm kiểm tra xem con rắn đã ăn đủ lượng thức ăn chưa, nếu chưa, thức ăn (là một kí tự đặc biệt) sẽ được in ra màn hình với tọa độ ngẫu nhiên.
- Màu của con rắn sẽ được người chơi chọn trong phần Setting,
hàm sẽ in từng kí tự của con rắn lên trên màn hình.
4 Hàm DrawWallLevel2(), DrawWallLevel3(), DrawWallLevel(4)
Hàm thiết kế chướng ngại vật cho màn 2, 3, 4 Mỗi level sẽ được thiết kế với các chướng ngại vật khác nhau và độ khó tăng
dần Các hàm trên sử dụng hàm GotoXY(int x, int y) để đi đến
các tọa độ trên màn hình và in ra kí tự để làm chướng ngại vật.
5 Hàm DrawGateLevel1(), DrawGateLevel2(), DrawGateLevel3(), DrawGateLevel4()
Hàm thiết kế các cổng để qua màn kế tiếp xuất hiện khi người chơi điều khiển con rắn ăn đủ lượng thức ăn ở mỗi level Các
hàm sử dụng hàm GotoXY(int x, int y) để in ra kí tự tạo thành
Trang 29File chứa khai báo các hàm kiểm tra việc di chuyển của con rắn có
hợp lệ hay không (không đụng vào thân hay vào tường và các chướng
ngại vật trong màn chơi).
Trang 30Các hàm kiểm tra khi con rắn di chuyển trái, phải lên, xuống có chạm vào thân nó không Nếu có, hàm trả về giá trị “true”, còn không, hàm trả về giá trị “false”.
Ví dụ: hàm ReachBodyLeft() kiểm tra việc di chuyển sang trái
của con rắn trong quá trình người chơi điều khiển.
1 bool ReachBodyLeft()
3 int headX = snake[0].x - 1;
4 int headY = snake[0].y;
5 for (int i = 0; i < SIZE_SNAKE - 1; i++)
Trang 317 if (snake[i].x == headX && snake[i].y == headY)
Các hàm kiểm tra việc di chuyển trái, phải, lên xuống của con rắn trong màn 1; hàm trả về giá trị “true” khi con rắn đụng vào chướng ngại vật, trả về “false” cho các trường hợp di chuyển hợp lệ.
6 { // Processing hit the gate
7 for (int i = 14; i < 17; i++)
Trang 32Tương tự như vậy, mỗi level sẽ có các hàm kiểm tra việc di chuyển của con rắn tương ứng với các chướng ngại vật và cổng được thiết kế.
VIII TẬP TIN MAIN.CPP
Sau khi đã thiết lập xong các hàm cần thiết cho trò chơi, ta cần hàm Main
để liên kết các hàm ở trên, tạo thành một trò chơi “Rắn săn mồi” hoàn chỉnh
Mã nguồn của hàm Main() được khai báo như sau: