Hôm nay
chúng ta cùng tìm hiểu cách viết game Pacman bằng C++, nó thực sự rất đơn giản
khi ta phân nhỏ việc nó ra. Trước tiên ta cùng lên ý tưởng cho file Matrix.h: http://ghinhap.com/Matrix.h
I. Để có pacman ý tưởng của ta là: vẽ đồ họa,
tạo map, một con pacman do người điều khiển, và vài con pacman random chạy.
Trong phần vẽ ta cần vẽ tường – pacman gặp nó
thì không thể đi tiếp, các dấu chấm – pacman ăn trong quá trình đi.
Pacman cần người điều khiển từ việc ấn bàn
phím .
Còn pacman máy thì random việc nhập từ bàn phím của con người để tự chạy, hoặc mình cài đặt sẵn đường chạy cho nó.
Còn pacman máy thì random việc nhập từ bàn phím của con người để tự chạy, hoặc mình cài đặt sẵn đường chạy cho nó.
Ta thấy rằng để mọi việc dễ dàng cho biểu diễn
các đối tượng và xử lý, ta cài đặt một mảng 2 chiều đặt là matrix vì nếu ta coi
màn hình là một mảng 2 chiều thì rõ ràng mọi phần tử trên màn hình đều có thể
biểu diễn được trong mảng đó bằng các giá trị, cho nó vào một lớp:
Ta tạo file header chứa class Matrix biểu diễn tất cả những gì trên màn hình thông qua một mảng 2 chiều.
class Matrix
Ta tạo file header chứa class Matrix biểu diễn tất cả những gì trên màn hình thông qua một mảng 2 chiều.
class Matrix
{
private:
int matrix[XMAX + 3][YMAX + 3];
ToaDo pacman;
computer m_com1, m_com2, m_com3,
m_com4;
}
- Dễ thấy
ngoài tạo map thì ToaDo pacman là ta thiết lập tọa độ cho PacMan với kiểu dữ liệu
do ta tạo : ToaDo
struct ToaDo{
int x;
int y;
int prevKey;
int Score;
int live;
};
Các biến
trên lần lượt có tác dụng như sau: x, y là xác định tọa độ để xử lý vị trí của
PacMan, prevKey lưu trữ giá trị giá trị key mà đã ấn vào trước. Cụ thể như sau:
Trong thân Game, nó chạy một vòng lặp, trong vòng lặp đó nó bắt xem ta có ấn
nút gì không, nếu ấn sang trái thì pacman sang trái,… Trong trường hợp ta không
bấm key nào thì nó chạy với giá trị prevKey tức là key lần trước.
- Score là
lưu điểm mà pacman đã ăn được.
- Ngoài ra để xử lý PacMan hiệu quả và dễ dàng hơn ta đặt thêm một enum:
- Ngoài ra để xử lý PacMan hiệu quả và dễ dàng hơn ta đặt thêm một enum:
enum movePacman {LEFT = 0, RIGHT, UP, DOWN, NO};
Cái enum này cần về sau để tượng trương cho giá trị
prevKey: nếu bằng LEFT (0) thì cứ sang trái, RIGHT(1) thì cứ sang phải, …
- Bên cạnh đó, như ở trên ta đã nói, nếu coi các phần tử xuất hiện trên
màn hình cho vào một mảng thì có thể dễ dàng biểu diễn nó thong qua các giá trị.
Vì vậy ta đặt một vài macro để định nghĩa các giá trị sau cho tiện sử dụng cũng
như dễ đọc:
#define XMAX 30
#define XMAX 30
#define YMAX 30
#define XMIN 0
#define YMIN 0
#define WALL 1
#define SPACE 0
Trong đó XMAX biểu thị số hàng max của mảng để biểu diễn
màn hình, YMAX là số cột max, XMIN và YMIN là số hàng, cột min. Trong mảng Matrix
thì ta qui định WALL (1) là giá trị tượng trương cho tường, nếu pacman gặp tường
thì sẽ không đi được nữa. Giá trị SPACE(0) tượng trương là tượng trưng cho chỗ
đường không có gì, mà sau này ta đặt nó là một dấu chấm, khi pacman ăn thì sẽ
tăng điểm.
Ngoài ra
chúng ta cần một vài hàm sau trong thư viện
GameLib.h
để dùng cho việc vẽ các đối tượng ra màn hình cho đẹp:
#include <Windows.h>
#ifndef GAMELIB_H
#define GAMELIB_H
//
Hàm thay d?i kích c? c?a khung cmd.
void resizeConsole(int width, int height)
{
HWND console = GetConsoleWindow();
RECT r;
GetWindowRect(console, &r);
MoveWindow(console, r.left, r.top, width, height, TRUE);
}
//
Hàm tô màu.
void textcolor(int x)
{
HANDLE mau;
mau = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(mau, x);
}
//
Hàm d?ch chuy?n con tr? d?n t?a d? x, y.
void gotoxy(int x, int y)
{
HANDLE hConsoleOutput;
COORD Cursor_an_Pos = { x - 1, y - 1 };
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput, Cursor_an_Pos);
}
//
Hàm xóa màn hình.
void XoaManHinh()
{
HANDLE hOut;
COORD Position;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
Position.X = 0;
Position.Y = 0;
SetConsoleCursorPosition(hOut, Position);
}
#endif
Vậy việc lên
ý tưởng đã xong. Tut sau ta bắt tay vào viết game nhé.
Cảm ơn các bạn
đã xem.
Bên tôi đang cần viết trò chơi cổ điển Pacman trên PC, nhưng điều khiển pacman bằng cách di chuột. Di chuột đến đâu thì pacman chạy đến đó. Anh em coder nào làm được inbox nhé. Thank you!
Trả lờiXóa