Tải bản đầy đủ (.doc) (8 trang)

C#: Viết trò chơi xếp gạch (tetris) 3D

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (106.86 KB, 8 trang )

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.


Bạn có thể click các phím sau trên bàn phím số để di chuyển khối:
ð 4: di chuyển qua trái
ð 6: di chuyển qua phải.
ð 8: di chuyển ra sau.
ð 2: di chuyển tới trước.
ð , : Xoay trên trục Ox.
ð . : Xoay trên trục Oy.
ð / : Xoay trên trục Oz.
Bạn có thể kéo thả chuột trên màn hình để xoay góc nhìn.
Các thiết lập để chơi ván mới:
Trên GameBar >> chọn New Game >> xuất hiện hộp thoại New Game.
ð Trên các trackbar X, Y, Z cho phép bạn thiết lập độ rộng của không gian chơi.
ð Trong hộp Kill On bạn có thể chọn cho phép hủy hộp trên trục Ox, Oz, hay trên mặt xOz
khi nó đã được làm đầy.
ð Bạn chọn Ok để chấp nhận chơi ván mới.
ð Bạn chọn Cancel để tiếp tục chơi ván cũ.
Source code:
Đầu tiên, tôi xây dựng lớp điểm cho không gian 3D của mình ở tập tin point3d.cs, trong đó
bao gồm 3 số dạng float lưu vị trí theo trục x, y, z. Lớp này khởi tạo theo 2 cách khác nhau.
Mặc định là gốc tọa độ, hoặc theo 3 đối số truyền vào để tạo nên đối tượng.
class Point3d
{
public float X, Y, Z;
public Point3d()
{
X = Y = Z = 0.0f;
}
public Point3d(float fx, float fy, float fz)
{
X = fx; Y = fy; Z = fz;

}
}
Ở 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.

- Full: Có chứa hình khối.
- Out: Vượt khỏi biên của không gian trò chơi được tạo ra.
NodeID dùng để lưu chỉ số của một nút.
Tất cả các xử lý chính, tôi đặt nó trong lớp GameSize, kế thừa từ OpenGLControl.
class GameSize: OpenGLControl
{
// ****************** VARIABLE ***************************
public frmMain Parent;
public int X, Y, Z;
private MouseEventArgs preMouse = new MouseEventArgs(MouseButtons.Left, 0, 0, 0,
0);
private float dX = 0.0f, dY = 0.0f;
public NodeState[, ,] Room;
public CCube[, ,] Nodes;
// Luu danh sach cac nut dang hoat dong trong phong.
public NodeID[] ctrlNodes;
public uint CurrObject;
public bool OnMoveObj = false;
public bool EndGame = false;
public int Score = 0;
public bool OnErase = false;
public bool EnableTexture = false;
public float AlphaColor = 0.5f;
public float[] ObjectColor = new float[3] { 0.5f, 0.5f, 0.5f };
// Xac nhan: huy tren truc, X, Z, mat XOZ.
public bool KillX = true, KillZ = false, KillXOZ = false;
public OpenGLTexture2D texObject = new OpenGLTexture2D("..//..//bmpObject.bmp");
public OpenGLTexture2D texFloor = new OpenGLTexture2D("..//..//bmpFloor.bmp");
public OpenGLTexture2D texOut = new OpenGLTexture2D("..//..//bmpButton.bmp");
public float[] light_position = new float[4] { 0.0f, 1.0f, 0.0f, 1.0f };

// ****************** 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()

// Xu ly truong hop xoay theo truc Z.
public void RotateZ()
// Kiem tra tro choi co ket thuc chua.
public bool CheckEnd()
// Kiem tra de huy & tinh diem.
public void CheckErase()
// Huy mot hang tren truc Ox.
public void EraseX(int y, int z)
// Huy mot mat tren truc XOZ.
public void EraseXOZ(int y)
// Thiet lap den chieu.
public void EnableLighting()
// Tat den chieu.
public void DisableLighting()
// Thiet lap blend.
public void EnableBlending()
// Ve toan bo man hinh
public void DrawScreen()
}
Link download source code: (source code chạy
bằng Visual Studio 2005 hoặc SharpDevelop 2.2)
Bạn có thể chạy trực tiếp file ./bin/release/WallsGame.exe để chơi thử game.
Hy vọng source code này sẽ hữu ích cho các bạn!
• digg
• Facebook
• Twitter
• del.icio.us
• StumbleUpon
• reddit
C#: Mã hóa và giải mã dữ liệu bằng thuật toán blowfish

Comments

×