Luật lệ của trò chơi Hứng bóng như sau: người chơi dùng một miếng đệm hình chữ nhật để hứng quả bóng, không cho nó rơi xuống; quả bóng khi chạm vào miếng đệm và các bức tường sẽ dội ngược lại (giống trò chơi Breakout nhưng không có các miếng gạch). Nguyên tắc tạo trò chơi này cũng không mấy phức tạp. Khi đã nắm nguyên tắc, bạn có thể sử dụng bất cứ ngôn ngữ lập trình nào để viết chương trình, riêng bài viết sau minh họa bằng Visual Basic 6.
Thiết kế giao diện trò chơi
Bạn tạo một dự án mới dạng Standard EXE, thêm vào đó các đối tượng: 2 đối tượng Shape đặt tên là Ball và Pad, 1 Timer tên Timer1, 1 CommandButton tên cmdReset và thiết lập những thuộc tính cho các đối tượng này như sau:
(Name) | Ball |
BorderStyle | 0 – Transparent |
FillColor | (chọn màu quả bóng) |
FillStyle | 0 – Solid |
Height | 255 |
Shape | 3 – Circle |
Width | 255 |
Các thuộc tính của đối tượng Shape1
(Name) | Pad |
FillColor | (chọn màu miếng đệm) |
FillStyle | 0 – Solid |
Height | 210 |
Shape | 0 – Rectangle |
Width | 1500 |
Các thuộc tính của đối tượng Shape2
(Name) | Timer1 |
Interval | 1 |
Các thuộc tính của đối tượng Timer1
Thủ tục Timer1_Timer
Đây là thủ tục quan trọng của chương trình, gần như mọi phần xử lý chính sẽ nằm trong thủ tục này. Sau mỗi khoảng thời gian định bởi giá trị Interval của Timer1, thủ tục này làm các công việc sau:
- Di chuyển quả bóng đến vị trí mới theo hướng bóng đang di chuyển. Vị trí quả bóng được xác định bằng thuộc tính Top và Left của đối tượng Ball. Ta dùng hai biến integer dX, dY để ghi nhớ vận tốc và hướng di chuyển của bóng. Giá trị tuyệt đối của hai biến này là độ lớn quãng đường quả bóng di chuyển (theo hướng ngang, dọc) trong khoảng thời gian Timer1.Interval. Để đơn giản, ta cho quả bóng di chuyển theo góc 45 độ nên giá trị tuyệt đối của dX và dY bằng nhau. Còn dấu đại số của hai biến này xác định hướng di chuyển. Chẳng hạn khi quả bóng di chuyển về góc trên trái thì dX<0,>0.
- Kế tiếp, ta phải xác định sau khi di chuyển, quả bóng có đụng tường hay không. Khi bóng đụng tường sẽ đổi hướng di chuyển ngược lại. Bóng đụng tường bên phải, bên trái thì thay đổi giá trị dX (dX=dX*-1), đụng tường phía trên thì thay đổi giá trị dY (dY=dY*-1).
- Bước cuối cùng trong thủ tục Timer1_Timer là xác định nếu quả bóng tới vị trí miếng đệm thì người chơi có hứng được bóng không. Nếu hứng được bóng thì quả bóng sẽ dội ngược lại (dY<0) style=""> hướng sang trái (dX<0)>0) khi hứng bóng ở phần phải miếng đệm. Cách kiểm tra người chơi có hứng được bóng không như sau: khi một phần quả bóng vượt qua tọa độ dọc của miếng đệm (Ball.Top + Ball.Height >= Pad.Top) thì ta sẽ tiếp tục xét theo tọa độ ngang, nếu quả bóng ở hoàn toàn bên ngoài miếng đệm (Ball.Left + Ball.Width <> Pad.Left + Pad.Width) thì người chơi đã hứng hụt bóng. Sau khi chạm miếng đệm, tốc độ di chuyển của quả bóng sẽ tăng lên (tăng giá trị tuyệt đối của dX, dY).
Phần mã chương trình
Chuyển qua cửa sổ Code, bạn nhập vào phần mã chương trình như sau:
Option Explicit Dim dX As Integer, dY As Integer, Score As Integer
Private Sub Form_Load() ‘Thiết lập vị trí ban đầu của miếng đệm Pad.Top = Me.Height - Pad.Height – 900 ‘Thiết lập vị trí ban đầu của quả bóng Ball.Left = (Me.Width - Ball.Width) / 2 Ball.Top = (Me.Height - Ball.Height) / 2 ‘Xác định hướng di chuyển đầu tiên của quả bóng là theo hướng trên trái. Bạn có thể thiết lập hướng bóng là ngẫu nhiên. dX = -45 dY = -45 cmdReset.Visible = False End Sub
‘Di chuyển miếng đệm theo con trỏ chuột Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Pad.Left = X - Pad.Width / 2 End Sub
Private Sub Timer1_Timer() ‘Dùng phương thức Move để di chuyển đối tượng Ball sẽ nhanh hơn thay đổi thuộc tính Top và Left Ball.Move Ball.Left + dX, Ball.Top + dY ‘Khi bóng đụng tường sẽ đổi hướng If Ball.Top <= 0 Then dY = dY * -1 End If If Ball.Left <= 0 Then dX = dX * -1 End If If Ball.Left + Ball.Width >= Me.ScaleWidth Then dX = dX * -1 End If ‘Khi tung độ quả bóng vượt qua tung độ miếng đệm, xét xem người chơi có hứng được bóng không If Ball.Top + Ball.Height >= Pad.Top Then If (Ball.Left + Ball.Width <> Pad.Left + Pad.Width) Then 'Khi quả bóng rớt bên ngoài miếng đệm nghĩa là người chơi hứng hụt bóng Me.Caption = "Game Over - Score: " & Score ‘Thông báo “Game Over” cmdReset.Visible = True ‘Hiện nút Reset Timer1.Enabled = False ‘Ngưng trò chơi Else ‘Người chơi hứng được bóng dY = dY * -1.05 ‘Tăng tốc độ quả bóng dX = dX * 1.05 Score = Score + 1 ‘Tăng số điểm Me.Caption = "Score: " & Score If (Ball.Left + Ball.Width / 2) < (Pad.Left + Pad.Width / 2) Then 'Nếu quả bóng rớt trúng nửa bên trái miếng đệm If dX > 0 Then ‘Nếu quả bóng đang di chuyển theo hướng phải dX = dX * -1 ‘… thì đổi hướng quả bóng sang trái End If Else ‘Nếu quả bóng rớt trúng nửa bên phải miếng đệm If dX <>‘Nếu quả bóng đang di chuyển theo hướng trái dX = dX * -1 ‘… thì đổi hướng quả bóng sang phải End If End If End If End If
End Sub
‘Thiết lập các giá trị ban đầu của trò chơi khi người dùng nhấn nút Reset Private Sub cmdReset_Click() Ball.Left = (Me.Width - Ball.Width) / 2 Ball.Top = (Me.Height - Ball.Height) / 2 dX = -45 dY = -45 cmdReset.Visible = False Score = 0 Me.Caption = "Score: " & Score Timer1.Enabled = True ‘Bắt đầu trò chơi End Sub |
Bạn thấy đấy, chỉ hơn 50 dòng lệnh là ta đã tạo được một trò chơi thú vị. Bước tiếp theo, bạn hãy phát triển trò chơi cả về nội dung và hình thức sao cho thật hấp dấn, lôi cuốn. Chúc bạn thành công!
Ngô Bảo Khoa
Thế giới @ 141
cho mình hỏi tại sao đoạn code trên bóng chạm đến pad thì đứng im à ko nẩy lên nữa
Trả lờiXóacho hỏi me.height là chiều cao cái gì
Trả lờiXóa