Lập trình

Lập trình

Thứ Sáu, 25 tháng 3, 2016

[Viết game PacMan] Game pacman bằng C++ Tut 1 - Ý tưởng.



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ó. 
  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
{
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:
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 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.

Không có nhận xét nào:

Đăng nhận xét