Contents
Giới thiệu
Bạn có nhớ tựa game Snake không? Hôm nay chúng ta sẽ cùng code lại game này trên console bằng ngôn ngữ lập trình C++. Việc lựa chọn console làm nền tảng chơi game đơn giản vì nó dễ tiếp cận và phù hợp cho những người mới học lập trình.
- Theoretical and Conceptual Framework
- Chuyên gia công nghệ vạch mặt 'Phần mềm định vị theo dõi' bán nhan nhản trên MXH, cảnh báo chiêu trò lừa đảo
- Pick up line là gì? Pickup lines – Nghệ thuật cưa cẩm “thả thính” phổ biến của giới trẻ hiện nay
- Lập trình viên là gì? Có gì khác so với Developer?
- So sánh học phí ngành Công nghệ thông tin
READ MORE:
Demo game
Trước khi bắt đầu, hãy xem qua thành phẩm sau khi code xong game:
Bạn đang xem: Code game rắn săn mồi trên console bằng C++
Con rắn săn mồi trên console
Đơn giản phải không? Chỉ cần sử dụng kiến thức cơ bản về C++ và tìm hiểu thêm một số hàm, thư viện hỗ trợ là có thể tạo ra trò chơi này. Bạn có thể xem chi tiết code trên Github.
Game hoạt động như thế nào?
Trong trò chơi này, bạn sẽ điều khiển con rắn để ăn các quả táo. Mỗi khi ăn được một quả táo, con rắn sẽ dài thêm một đốt. Bạn sẽ thua nếu con rắn đụng vào tường hoặc tự cắn chính bản thân.
Đơn giản chỉ vậy thôi! Chúng ta sẽ vẽ con rắn trên màn hình console bằng cách sử dụng các ký tự. Mỗi khi con rắn di chuyển, chúng ta sẽ vẽ lại con rắn để thể hiện sự di chuyển của nó. Vì con rắn di chuyển liên tục, chúng ta sẽ đặt nó trong một vòng lặp.
Tạo con rắn và vẽ lên màn hình
Xem thêm : Công thức, quy tắc tìm x lớp 2, 3, 4, 5 – 6 quy tắc tìm x có ví dụ.
Trước tiên, chúng ta sẽ xây dựng một struct Point
để biểu diễn một điểm trên màn hình. Con rắn của chúng ta sẽ được biểu diễn bằng một danh sách các điểm này. Để vẽ con rắn lên màn hình, chúng ta chỉ cần di chuyển con trỏ tới vị trí đó và in ra ký tự tương ứng. Đồng thời, chúng ta cần tạo một hàm để vẽ toàn bộ con rắn:
struct Point {
int x;
int y;
};
vector snake = {
{ WIDTH / 2 + 2, HEIGHT / 2 },
{ WIDTH / 2 + 1, HEIGHT / 2 },
{ WIDTH / 2, HEIGHT / 2 },
{ WIDTH / 2 - 1, HEIGHT / 2 },
{ WIDTH / 2 - 2, HEIGHT / 2 }
};
void drawSnakePart(Point p) {
gotoxy(p.x, p.y);
cout << BODY;
}
void drawSnake() {
for (size_t i = 0; i < snake.size(); i++)
drawSnakePart(snake[i]);
}
Di chuyển
Con rắn chỉ có thể di chuyển theo bốn hướng: lên, xuống, trái và phải. Chúng ta sẽ quy định các hướng di chuyển bằng enum class Direction
. Khi con rắn di chuyển, chúng ta sẽ cập nhật lại tọa độ các điểm của con rắn. Đồng thời, chúng ta cần thêm xử lý khi người dùng nhấn các phím điều khiển:
enum class Direction {
up,
right,
down,
left
};
Direction direction = Direction::right;
void move() {
for (size_t i = snake.size() - 1; i > 0; i--)
snake[i] = snake[i - 1];
if (direction == Direction::up)
snake[0].y -= 1;
else if (direction == Direction::down)
snake[0].y += 1;
else if (direction == Direction::left)
snake[0].x -= 1;
else if (direction == Direction::right)
snake[0].x += 1;
}
while (true) {
if (_kbhit()) {
char ch = _getch();
ch = tolower(ch);
if (ch == 'a' && direction != Direction::right)
direction = Direction::left;
else if (ch == 'w' && direction != Direction::down)
direction = Direction::up;
else if (ch == 's' && direction != Direction::up)
direction = Direction::down;
else if (ch == 'd' && direction != Direction::left)
direction = Direction::right;
else if (ch == 'q')
break;
}
move();
drawSnake();
Sleep(REFRESH_RATE);
system("cls");
}
Giới hạn khu vực chơi
Chúng ta cần giới hạn khu vực chơi bằng cách vẽ ra các bức tường. Để vẽ các bức tường này, chúng ta chỉ cần in ra các ký tự đại diện cho các bức tường. Chúng ta cũng cần gọi hàm vẽ các bức tường này trong vòng lặp để nó vẽ lại sau mỗi lần con rắn di chuyển:
void drawBox() {
for (size_t i = 0; i < WIDTH; i++)
cout << '=';
gotoxy(0, HEIGHT);
for (size_t i = 0; i < WIDTH; i++)
cout << '=';
for (size_t i = 1; i < HEIGHT; i++) {
gotoxy(0, i);
cout << '|';
}
for (size_t i = 1; i < HEIGHT; i++) {
gotoxy(WIDTH, i);
cout << '|';
}
}
while (true) {
move();
drawBox();
drawSnake();
if (isBiteItself())
break;
if (isHitWall())
break;
Sleep(REFRESH_RATE);
system("cls");
}
Tối ưu hiệu năng
Để tối ưu hiệu năng, chúng ta cần tránh việc xóa toàn bộ màn hình sau mỗi lần di chuyển con rắn. Thay vào đó, chúng ta sẽ chỉ cần vẽ box một lần duy nhất và vẽ thêm phần đầu mới của con rắn, đồng thời xóa phần đuôi cũ đi. Điều này sẽ giúp cải thiện hiệu năng của trò chơi:
Point prevTail;
void move() {
prevTail = snake.back();
// code goes here
}
void drawHeadnTail() {
gotoxy(snake[0].x, snake[0].y);
cout << BODY;
Point tail = snake.back();
gotoxy(prevTail.x, prevTail.y);
cout << ' ';
}
while (true) {
move();
if (isBiteItself())
break;
if (isHitWall())
break;
drawHeadnTail();
drawBox();
drawSnake();
Sleep(REFRESH_RATE);
}
Thêm logic cho game
Cuối cùng, chúng ta cần thêm một số logic cho trò chơi, bao gồm xử lý khi con rắn ăn quả táo và khi con rắn tự cắn chính mình.
Để xử lý khi con rắn ăn quả táo, chúng ta cần kiểm tra xem phần đầu của con rắn có trùng với quả táo hay không. Nếu có, chúng ta sẽ tăng chiều dài của con rắn lên một đốt và tạo một quả táo mới:
Point apple;
void genApple() {
srand(time(0));
int x = rand() % (WIDTH - 1) + 1;
int y = rand() % (HEIGHT - 1) + 1;
apple = { x, y };
gotoxy(x, y);
cout << APPLE;
}
bool isAteApple() {
return snake[0].x == apple.x && snake[0].y == apple.y;
}
void growing() {
snake.push_back(prevTail);
}
while (true) {
move();
if (isAteApple()) {
growing();
genApple();
}
if (isBiteItself())
break;
if (isHitWall())
break;
drawHeadnTail();
drawBox();
drawSnake();
Sleep(REFRESH_RATE);
}
READ MORE:
Lời kết
Xem thêm : Danh hiệu hoa hậu có dư vị dở khóc dở mếu
Như vậy, trong bài viết này chúng ta đã học cách code game Snake đơn giản trên console bằng ngôn ngữ lập trình C++. Mặc dù không phải là lựa chọn thực tế khi làm game, nhưng nó rất phù hợp cho những người mới học lập trình, đặc biệt là lập trình game.
Để tăng tính chuyên nghiệp và quản lý dễ dàng, bạn có thể xem xét refactor code theo hướng hướng đối tượng. Ngoài ra, bạn cũng có thể thêm các tính năng như hiển thị điểm số, menu bắt đầu, hiển thị kết quả sau khi chơi xong… Phần này bạn có thể tham khảo trong Github.
Nếu có bất kỳ thắc mắc hoặc góp ý, đừng ngần ngại để lại bình luận dưới bài viết của mình để mình có thể phát triển bài viết tốt hơn. Cảm ơn bạn đã đọc bài viết!
Được phép sử dụng bài viết từ khiemle.dev
Có thể bạn quan tâm:
- Hướng dẫn code game “Rắn săn mồi” bằng Python
- Console Javascript quá kinh khủng
- Console không chỉ có phương thức log!
Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!
Nguồn: https://ispacedanang.edu.vn
Danh mục: Học tập