RSS

Tag Archives: game dev

[Làm game Tetris với C] Bài 1 : Hãy chuẩn bị nào !

Chắc các bạn ở đây ai cũng đã ít nhất một lần chơi qua game Tetris rồi . Một game mà khi nhắc đến chắc hẳn nhiều người trong chúng ta không khỏi bồi hồi nhớ lại ngày xưa … ngày còn điện tử bốn nút .

Nguồn : google.com

Như lời đã nói với mọi người ,

Mình sẽ bắt đầu viết một series bài viết hướng dẫn từng bước thực hiện một game Xếp hình trên nền console với ngôn ngữ cơ bản C.

Tại sao lại là Console ?

Nghe đến console với màn hình đen chắc không ít người cảm thấy nản . Nhưng đừng vội . Nếu để viết một bài làm game Tetris với hình ảnh sống động chắc có lẽ quá nhiều thứ phải nói đến . Và có lẽ OpenGL quá phức tạp cho những bạn mới nhập mon tiếp cận . Nên xin phép mình chỉ hướng dẫn trên Console .

Các bạn có thể download Demo để có thể xem trước sản phẩm chúng ta sẽ có sau khi đọc hết loạt bài này .  File có thể download ở đính kèm

Mình xin lưu ý một chút :

–         Vì game này mình viết đã lâu rồi nên khi thực hiện bài này mình không thể đi từng chút một . Vì vậy yêu cầu các bạn nắm một chút kiến thức lập trình c . game sẽ dùng các kiến thức cơ bản thôi .

–         Mình làm game này ngày trước quả thật là cứ cặm cụi code trong khoảng 4h . Nên quả thật không có phân tích bài toán trước khi làm .

–         Mình không dám chắc chắn thuật toán mình dùng là tối ưu nhất . Mong các bạn đọc xong có thể rút ra cho mỗi người một cách làm của riêng mình cho tối ưu hơn nhé .

Ok . Nào chúng ta sẽ bắt đầu nhé .

Trước tiên bạn nên chuẩn bị cài đặt

DEV C – Download

Mình khuyến khích sử dụng Dev C để đảm bảo không xảy ra vấn đề gì khi các bạn làm theo bài viết .

Chúng ta hãy mở Dev C và tạo một project mới tên là Tetris . Và sau đó mở file main.c lên chúng ta được như dưới đây :

1
2
3
4
5
6
7
8
9
#include
#include
 
int main(int argc, char *argv[])
{
 
  system("PAUSE");
  return 0;
}

Bây giờ chúng ta sẽ khởi tạo 3 biên lưu thông số mặc định ở ngoài hàm main

1
2
3
4
// Khoi tao 3 hang so luu buoc diem thuong , so luong dong va cot nhieu nhat
const int BONUS_SCORE = 100;
const int MAX_ROW = 24;
const int MAX_COL = 10;

BOUNUS_SCORE là số điểm mà khi ăn 1 dòng ta sẽ đạt được

MAX_ROW là số dòng của board

MAX_COL là số cột của board

Ok . Và đó là 3 biến toàn cục duy nhất trong game của chúng ta . Vì hạn chế sử dụng quá nhiều biến toàn cục và khi làm bài C này mình được yêu câu chỉ sử dụng không quá 3 biến toàn cục . Vậy nên chúng ta sẽ tạo một cấu trúc(struct) lưu trữ các biến dùng chung giữa các hàm .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
typedef struct
{
    // Khoi tao 1 mang 2 chieu la moi truong cho cac object trong game
    int board[24][10];
    // Khoi tao 1 mang 2 chieu luu nhung object se xuat hien
    int boardNO[4][4];
    // Khoi tao bien level luu level hien tai nguoi choi dang choi
    int level;
    // Khoi tao bien score luu diem cua nguoi choi
    int score;
       
    // Khoi tao bien luu gia tri neu quyet dinh chay cho vong lap game
    int playIngame;
   
    // Khoi tao bien luu gia tri khi duong dung nhan phim xuong thi chuyen sang trang thai roi nhanh
    int statusSpeedMove;
   
    // Khoi tao bien luu trang thai rotate cua object
    int statusRotate;
   
    // Khoi tao bien statusGame luu trang thai cua game
    int statusGame;
   
    // Khoi tao bien timeLevel luu so thoi gian delay giua 1 update
    int timeLevel;
} SysGame;

Ta đặt tên cho nó là SysGame. Các bạn thấy nhiều biến phải không . Mình sẽ giải thích từng thứ dưới đây . Nếu bạn không hiểu . Đừng lo . Khi dùng đến nó ta sẽ hiểu ngay thôi .

Ta khởi tạo mảng 2 chiều lưu trạng thái các khối hộp của game

1
int board[24][10];

Ta khởi tạo mảng 2 chiều lưu hình dạng khối hộp chuẩn bị rơi xuống

1
int boardNO[4][4];

Khởi tạo 2 biến lưu level và điểm của người chơi

1
2
int level;
int score;

Biến này ta sẽ lưu trạng thái có chạy vòng lặp hay là không

1
int playIngame;

Biến này ta sẽ lưu 2 trạng thai quyết định khi nào object sẽ rơi nhanh xuống

(ví dụ khi ta nhấn nút xuống)

1
int statusSpeedMove;

Biến này ta sẽ lưu trạng thái xoay của object hiện tại

1
int statusRotate;

Biến này lưu trạng thai của game (PLAY , PAUSE , vv..vv)

1
int statusGame;

Còn đây ta sẽ dùng lưu khoảng thời gian delay giữa mỗi bước di chuyển của object . Quyết định tốc độ rơi của từng Level

1
int timeLevel;

Ok . Và sau các bước trên ta sẽ được như sau .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Khoi tao 3 hang so luu buoc diem thuong , so luong dong va cot nhieu nhat
const int BONUS_SCORE = 100;
const int MAX_ROW = 24;
const int MAX_COL = 10;
       
typedef struct
{
    // Khoi tao 1 mang 2 chieu la moi truong cho cac object trong game
    int board[24][10];
    // Khoi tao 1 mang 2 chieu luu nhung object se xuat hien
    int boardNO[4][4];
    // Khoi tao bien level luu level hien tai nguoi choi dang choi
    int level;
    // Khoi tao bien score luu diem cua nguoi choi
    int score;
       
    // Khoi tao bien luu gia tri neu quyet dinh chay cho vong lap game
    int playIngame;
   
    // Khoi tao bien luu gia tri khi duong dung nhan phim xuong thi chuyen sang trang thai roi nhanh
    int statusSpeedMove;
   
    // Khoi tao bien luu trang thai rotate cua object
    int statusRotate;
   
    // Khoi tao bien statusGame luu trang thai cua game
    int statusGame;
   
    // Khoi tao bien timeLevel luu so thoi gian delay giua 1 update
    int timeLevel;
} SysGame;
 
int main(int argc, char *argv[])
{
 
  system("PAUSE");
  return 0;
}

Vậy là kết thúc bài 1 . Trong bài này chúng ta đã khởi tạo tất cả các biến để lưu các trạng thái của game . Trong bài 2 chúng ta sẽ đi đến tạo các hàm cần sử dụng trong game và chi tiết từng hàm .

Chắc các bạn chưa thấy hé lộ được điều gì . Đừng vội nhé .

 
Leave a comment

Posted by on 13/08/2012 in C/C++ Programming

 

Tags: , , ,