Thứ Năm, 9 tháng 4, 2009

Lập trình trò chơi Hứng bóng bằng Visual Basic 6

Lập trình trò chơi Hứng bóng bằng Visual Basic 6

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

2 nhận xét:

  1. 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óa
  2. cho hỏi me.height là chiều cao cái gì

    Trả lờiXóa