C#: Viết trò chơi xếp gạch (tetris) 3D
Tuesday, 2. December 2008, 19:04:42
source code
WallsGame là trò chơi Xếp gạch không gian ba chiều (phát triển trên môi trường 3D), sử
dụng bộ thư viện CsGL (C Sharp OpenGL) của C#.
Với ý tưởng phát triển trò chơi Xếp gạch truyền thống (Tetris) lên một mức cao hơn là
thực hiện ở dạng 3D, hỗ trợ người dùng nhiều tiện ích hơn như:
- Cung cấp giao diện trực quan 3 chiều như thực tế
- Cho phép người chơi tùy chọn góc nhìn.
- Tùy chọn quy luật chơi.
- Tùy chọn cấu hình trong lúc chơi (ánh sáng, màu sắc, tốc độ…)
- Hướng dẫn chi tiết người chơi.
- Tạo lập bảng thành tích người chơi.
- …
Luật chơi:
+ Khi trò chơi bắt đầu, các hình khối ( dạng ngẫu nhiên ) sẽ rơi xuống, bạn phải sắp xếp
sao cho đầy các hàng trên trục Ox, Oz hoặc trên mặt phẳng xOz.
+ Khi đã đầy hàng hoặc mặt, các hộp trên hàng hoặc mặt đó sẽ bị hủy và điểm chơi sẽ tăng
lên.
+ Khi bạn chơi với tốc độ càng cao thì điểm cộng của bạn càng lớn ( vì độ khó tăng lên ).
+ Nếu bạn để cho các khối hộp chất đầy đến điểm cao nhất thì bạn sẽ bị thua và trò chơi
kết thúc => hãy chơi lại ván khác.
ð chúc bạn vui vẻ với trò chơi xếp gạch 3D này.
Cách chơi:
Làm cách nào để di chuyển khối ?
ð Bạn bấm F1 để dời hình khối qua trái, F2 để dời qua phải, F3 để di chuyển tới trước, F4
để di chuyển ra sau.
ð Bạn bấm F9 để xoay hình khối trên trục Ox, F10 để xoay trên trục Oy, F11 để xoay trên
trục Oz.
ð Nếu bạn muốn hình khối rơi xuống nhanh thì bấm Enter.
ð Nếu hình khối đã lấp đầy trục hoặc măt thì trục hoặc mặt đó sẽ tự động hủy.
}
}
Ở tập tin CCube.cs, tôi xây dựng nên hình khối lập phương qua lớp CCube, Các data field
của lớp gồm có:
public Point3d Pos;
public float Width = 0.3f;
public float[] color = new float[3] { 1.0f, 1.0f, 0.0f };
public float AlphaColor = 0.5f;
Pos – Lưu giữ điểm trong không gian, nơi mà tại đó, hình khối bắt đầu được vẽ.
Width – Độ dài cạnh hình khối
color – Mảng chứa giá trị màu theo RGB.
AlphaColor – Sắc độ Alpha của hình khối được vẽ (giá trị từ 0 đến 1).
Các constructor đảm bảo cho việc đối tượng CCube được tạo theo nhiều cách.
Ngoài ra, còn có 2 hàm draw, chuyên vẽ hình khối:
Draw() – vẽ hình khối thông thường
DrawTexture(OpenGLTexture2D texture) – vẽ có sử dụng textture
Ngoài ra, tôi còn định nghĩa một enum và struct NodeID
// Tap hop cac trang thai cua nut.
public enum NodeState { Empty, Full, Out }
// Luu chi so cua mot nut.
public struct NodeID
{
public int X, Y, Z;
public void SetID(int x, int y, int z)
{
X = x; Y = y; Z = z;
}
}
NodeState với:
- Empty: Nút đó chưa được vẽ hay chính xác là không gian tại đó không có hình khối nào.
// ****************** CONSTRUCTOR ************************
public GameSize()
// ****************** HANDLE EVENT ***********************
protected override void InitGLContext()
protected override void OnSizeChanged(EventArgs e)
public override void glDraw()
protected override void OnKeyDown(KeyEventArgs e)
// ****************** ADDING FUNCTION ********************
// Thiet lap lai can phong.
public void ResetTheRoom()
// Thiet lap lai do mo cho cac doi tuong.
public void ResetAlphaColor()
// Thiet lap lai mau vat the.
public void ResetObjectColor()
// Thiet lap lai toa do diem sang.
public void ResetLightPoint()
// Kiem tra vung trong de tao doi tuong.
public void CreateNewObject(uint type)
// Xu ly truong hop doi tuong roi xuong.
public void ObjectFall()
// Xu ly truong hop di chuyen qua trai.
public void MoveRight()
// Xu ly truong hop di chuyen qua phai.
public void MoveLeft()
// Xu ly truong hop di chuyen toi truoc.
public void MoveFront()
// Xu ly truong hop di chuyen ra sau.
public void MoveBack()
// xu ly truong hop xoay theo truc Y.
public void RotateY()
Comments