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
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ứclập trình
- Những người bạn đã giúp nhóm có thêm nhiều ý tưởng mới trong quá trình thực hiện đồ án
- Những người đã ủng hộ và hộ trợ tinh thần cho nhóm trong quá trình thực hiện đồ án
Xin chân thành cảm ơn!
II GIỚI THIỆU ĐỒ Á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êmthu 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ếtnhằ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ànhCông nghệ thông tin
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:
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
- 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 độ
Trang 5tiế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
- 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:
Trang 73
- 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
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
3 HWND consoleWindow = GetConsoleWindow();
4 LONG style = GetWindowLong(consoleWindow, GWL_STYLE);
6 SetWindowLong(consoleWindow, GWL_STYLE, style);
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
3 COORD coord{ x y };
Trang 85 }
3 Hàm ShowCur()
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
3 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
4 CONSOLE_CURSOR_INFO cursor = { 1, CursorVisibility };
Trang 95 Hàm DisableSelection()
Hàm ngăn chặn việc người chơi thao tác chuột lên các phần tử đang hoạt động trên màn hình Console và hạn chế gây khó chịu cho người chơi
Trang 10IV MODULE PREPARE
Trang 11tại các chướng ngại vật, dựa vào IsValidLevel1() và kiểm tra thêm tọa độ đượcrandom có trùng với chướng ngại vật hay không để phù hợp với từng level.
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
Trang 14Khở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 15- 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.
Trang 16- 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 1720 cout << " YOUR SAVED GAME " << (char)2;
22 cout << " ENTER NAME TO SAVE " << (char)1;
24 cout << " Enter file name: ";
46 PlaySound(L"enter.wav", NULL, SND_ASYNC);
47 fopen_s(&file, "namesaved.txt", "at");
57 SPEED, STATE, LEVEL, LEVELUP,fprintf(file, "%d %d %d %d %d %d %d %d %d\n", CHAR_LOCK, MOVING,
Trang 1860 for (int i = 0; i < SIZE_SNAKE; i++)
- 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
Trang 1911 for (int i = 0; i < 53; i++)
24 cout << " Enter file name: ";
Trang 2051 &MOVING, &SPEED, &STATE, &LEVEL, fscanf_s(file, "%d %d %d %d %d %d %d %d %d\n", &CHAR_LOCK,
- 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
- 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
Trang 22thê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 23- 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 (LEVEL == 3 && LeftDeadLevel3())else if ((LEVEL == 1 && LeftDeadLevel1()) || (LEVEL == 2 && LeftDeadLevel2()) ||
Trang 2427 }
- 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 25 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)
10 Hàm InGame(int oldgame=0)
Hàm này sử dụng thêm các hàm khác để hỗ trợ cho việc quản lí game như PauseGame(HANDLE t), SaveGame(), LoadGame()
Trang 26Hà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
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
1 #pragma once
2 #include "System.h"
3
Trang 278 void DrawWallLevel3(); // Function to draw obstacles in level 3
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
10 GotoXY( x height + y ); cout << a;
23 GotoXY( x + width + 2, y + height );
27
Trang 2828 GotoXY( x + width + 2, y + i);
- 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
Trang 294 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.
Trang 30File 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 31Ví 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
Trang 322 Các hàm LeftDeadLevel1(), RightDeadLevel1(),
UpDeadLevel1(), DownDeadLevel1()
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ệ
Trang 33VIII.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: