1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Lập trình trò chơi Minesweeper với VB6 doc

7 619 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập trình trò chơi minesweeper với vb6
Trường học Trường Đại Học
Thể loại Bài viết
Định dạng
Số trang 7
Dung lượng 212,7 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lập trình trò chơi Minesweeper với VB6 Hẳn các bạn không xa lạ gì với Minesweeper, một trong những trò chơi gắn liền với hệ điều hành Windows người Việt mình thường gọi là trò Dò mìn ha

Trang 1

Lập trình trò chơi Minesweeper với VB6 Hẳn các bạn không xa lạ gì với Minesweeper, một trong những trò chơi gắn liền với hệ điều hành Windows (người Việt mình thường gọi là trò Dò mìn hay

Gỡ mìn) Do vậy tôi nghĩ không cần thiết giới thiệu lại cách chơi Trong bài viết này tôi muốn giới thiệu đến các bạn chương trình VB6 "cover" lại trò Minesweeper

Tổ chức dữ liệu

Gọi số hàng và số cột lần lượt là Rows và Cols Chúng ta sẽ dùng các mảng hai chiều kích thước Rows x Cols để đại diện cho các ô vuông Mỗi phần tử của mảng sẽ tượng trưng cho một ô ở vị trí tương ứng

Ta tạo một mảng Field (Rows x Cols), kiểu dữ liệu là Integer Phần tử Field(Row, Col) của mảng Field đại diện cho ô (Row, Col) Giá trị của phần tử này ở trong khoảng 0-8 cho biết số ô xung quanh có chứa mìn (một ô có tối đa 8 ô khác bao quanh) Riêng giá trị 9 chỉ ra là ô này có chứa mìn

Ta cần một mảng Flag (Rows x Cols), kiểu dữ liệu Integer, để cho biết trạng thái đánh dấu của một ô Một phần tử của mảng Flag sẽ mang giá trị 0 nếu ô tương ứng chưa được đánh dấu, 1 nếu đánh dấu bằng cờ, và 2 nếu đánh dấu bằng dấu "?"

Ta cần một mảng Checked (Rows x Cols), kiểu dữ liệu Boolean, để cho biết một ô đã lật hay chưa Một phần tử của mảng Checked sẽ mang giá trị True nếu ô tương ứng đã được lật, và mang giá trị False nếu chưa được lật

Thủ tục thực hiện

Bạn tạo một dự án (project) mới thuộc loại Standard exe Bạn chỉ cần thêm vào Form một

PictureBox tên là picField để làm vùng chơi Mọi hoạt động của trò chơi như hiển thị các ô, cờ, mìn hay nhận các sự kiện nhấn chuột khi chơi đều ở trên PicturexBox này Sau đây là phần mã (code) chương trình

1 Khai báo

Option Explicit

Const Rows = 10 'Số hàng

Const Cols = 10 'Số cột

Const Mines = 20 'Số mìn

Const CellWidth=30 'Chiều rộng của một ô tính theo Pixel Thuộc tính ScaleMode của picField

là 3 - Pixel

Trang 2

Dim Field(1 To Rows, 1 To Cols) As Integer

Dim Flag(1 To Rows, 1 To Cols) As Integer

Dim Checked(1 To Rows, 1 To Cols) As Boolean

2 Các thủ tục (Sub)

* Thủ tục vẽ các ô nổi (chưa lật) và ô chìm (đã lật) để người chơi biết ô nào đã được lật rồi

* Thủ tục DrawNumber(Row As Integer, Col As Integer): Khi ô (Row, Col) được lật, nếu ô

này không chứa mìn thì sẽ thông báo cho người chơi số ô xung quanh có chứa mìn Thủ tục DrawNumber làm việc đó bằng cách hiển thị giá trị của Field(Row, Col)

* Thủ tục DrawFlag(Row as Integer, Col as Integer): Khi người chơi nhấn chuột phải trên ô

(Row, Col), ta dùng thủ tục này vẽ ra trên ô đó hình cờ nếu Flag(Row, Col)=1, hay hình "?" nếu Flag(Row, Col)=2, và xóa đi hình "?" nếu Flag(Row, Col)=0

* Thủ tục Mark(Row As Integer, Col As Integer): Thủ tục này dùng xử lý sự kiện người chơi

nhấn chuột phải lên ô (Row, Col) Phần tử Flag(Row, Col) của mảng Flag sẽ cho biết trạng thái của ô (Row, Col) Bạn phải thay đổi giá trị của Flag(Row, Col) mỗi khi người chơi nhấn chuột phải lên ô (Row, Col) Nếu giá trị của Flag(Row, Col) đang là 0 thì sẽ thành 1, đang là 1 sẽ thành

2, đang là 2 sẽ thành 0 Sau đó bạn gọi thủ tục DrawFlag(Row, Col) để vẽ các ký hiệu

* Thủ tục CountMines(Row As Integer, Col As Integer): Thủ tục này gán giá trị cho phần tử

Field(Row, Col) Giá trị này chính là số ô có mìn trong số các ô chung quanh ô (Row, Col)

Ta lần lượt kiểm các ô xung quanh ô (Row, Col), gặp một ô có mìn ta sẽ tăng giá trị Field(Row, Col) lên 1 Lưu ý là một ô bình thường sẽ có 8 ô bao quanh, nhưng các ô ở góc và cạnh sẽ có ít hơn 8 ô bao quanh

* Thủ tục SetMines(): Thủ tục này sẽ được gọi khi người chơi bắt đầu một game mới (chọn

New Game) Nó sẽ thiết lập giá trị mặc định cho các mảng lúc bắt đầu một game mới, sau đó tiến hành đặt mìn ngẫu nhiên và đếm số mìn xung quanh mỗi ô

* Hàm Inside(X As Single, Y As Single, x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer): Hàm này trả về giá trị True nếu X nằm giữa x1 và x2, Y nằm giữa y1 và y2 Nói cách

khác, Inside có giá trị True nếu điểm (X,Y) nằm trong hình chữ nhật có góc trên trái (x1,y1) và góc dưới phải (x2,y2) Nếu điểm (X,Y) nằm ngoài hình chữ nhật này, Inside có giá trị False

* Thủ tục Solve(Row As Integer, Col As Integer): Trong Minesweeper, khi bạn lật một ô, sẽ

có 3 trường hợp xảy ra

- Trường hợp 1: Nếu ô bạn lật có mìn thì game over 9

Trang 3

- Trường hợp 2: Nếu ô bạn lật không có mìn và ít nhất một trong các ô xung quanh có mìn thì

bạn sẽ được thông báo số ô xung quanh có chứa mìn

- Trường hợp 3: Nếu ô bạn lật không có mìn và các ô xung quanh cũng không có mìn thì các ô

đó đều được tự động lật, và chính các ô này khi được lật lại áp dụng trường hợp 2 và trường hợp

3

Thủ tục Solve xử lý các vấn đề khi người chơi lật một ô Trong quá trình xử lý này, thủ tục Solve

có thể lại được dùng để xử lý tiếp tục (lật một ô khác trong trường hợp 3) Như vậy, ta thấy thủ tục Solve gọi chính nó Điều này được gọi là đệ quy Ta sẽ dùng thuật giải đệ quy trong thủ tục Solve

Private Sub Solve(Row As Integer, Col As Integer)

Dim xx(1 To 8) As Integer

Dim yy(1 To 8) As Integer

Dim k As Integer

xx(1) = -1: yy(1) = -1 'Ô trên trái ô (Row, Col)

xx(2) = 0: yy(2) = -1 'Ô ngay trên ô (Row, Col)

xx(3) = 1: yy(3) = -1 'Ô trên phải ô (Row, Col)

xx(4) = -1: yy(4) = 0 'Ô bên trái ô (Row, Col)

xx(5) = 1: yy(5) = 0 'Ô bên phải ô (Row, Col)

xx(6) = -1: yy(6) = 1 'Ô dưới trái ô (Row, Col)

xx(7) = 0: yy(7) = 1 'Ô ngay dưới ô (Row, Col)

xx(8) = 1: yy(8) = 1 'Ô dưới phải ô (Row, Col)

Checked(Row, Col) = True

'Bạn đặt thủ tục vẽ ô lật ở vị trí này để cho biết ô (Row, Col) đã được lật Khi ta gọi thủ tục Solve, có một số ô không có mìn sẽ được thủ tục Solve tự động lật lên (chứ không do người chơi lật), và do đó ta phải để thủ tục vẽ ô lật cũng như dòng Checked(Row, Col) = True ở trong thủ tục Solve để đánh dấu và vẽ ra các ô đã lật này

If Field(Row, Col) = 0 Then

'Vì các ô chung quanh ô (Row, Col) đều không có mìn nên ta lật hết các ô này

Trang 4

For k = 1 To 8 Step 1

If (Row + yy(k) > 0) And (Row + yy(k) <= Rows) And (Col + xx(k) > 0) And (Col + xx(k) <= Cols) Then 'Dòng lệnh if này để loại trừ các ô không tồn tại trong số các ô chung quanh đối với các ô ở góc và ở cạnh

If Checked(Row + yy(k), Col + xx(k)) = False And Flag(Row + yy(k), Col + xx(k)) <> 1 Then

'Nếu ô xung quanh ô (Row, Col) chưa được lật, không có đánh dấu cờ thì lật tiếp ô này bằng chính thủ tục Solve (thuật giải đệ quy)

Solve Row + yy(k), Col + xx(k)

End If

End If

Next k

Else 'Else của dòng lệnh If Field(Row, Col) = 0

DrawNumber Row, Col 'Thông báo số ô có mìn xung quanh ô (Row, Col)

End If

End Sub

* Hàm Finish(): Hàm này cho kết quả True nếu người chơi đã gỡ hết mìn, và False nếu chưa gỡ

hết mìn Người chơi được coi là chiến thắng khi mọi ô không có mìn đều đã được lật

* Thủ tục ShowWin(): Thủ tục này được gọi khi người chơi chiến thắng Xin nhắc lại, người

chơi được coi là chiến thắng khi mọi ô không có mìn đều đã được lật Do vậy, nhiệm vụ của thủ tục ShowWin() là kiểm tra trong số những ô chưa lật (đều là những ô có mìn vì những ô không

có mìn đều đã được lật), ô nào chưa được đánh dấu cờ thì sẽ đánh dấu

* Thủ tục ShowLose(Row As Integer, Col As Integer): Thủ tục này được gọi khi người chơi

"đạp mìn" và "chết", có 2 nhiệm vụ:

- Vẽ ra các quả mìn ở những ô có mìn mà chưa được đánh dấu cờ (mìn nổ) Riêng ô mìn mà người chơi đạp phải sẽ được tô màu đỏ (Row, Col) là tọa độ của ô mìn này

- Xem những ô nào không có mìn nhưng lại được đánh dấu cờ thì vẽ ký hiệu cho biết đánh dấu

đó là sai

* Thủ tục picField_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single):

Trang 5

Thủ tục này xử lý sự kiện (event) người chơi nhấp chuột lên PictureBox picField Tùy theo người chơi nhấp chuột phải hay chuột trái mà ta có cách xử lý tương ứng

Private Sub picField_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim Row As Integer, Col As Integer

Dim i As Integer, j As Integer

'Xác định người chơi nhấn vào ô nào

Row = 0

Col = 0

For i = 1 To Rows

For j = 1 To Cols

If Inside(X, Y, (j - 1) * CellWidth, j * CellWidth, (i - 1) * CellWidth, i * CellWidth) Then Row = i

Col = j

Exit For

End If

Next j

Next i

If Row <> 0 And Col <> 0 Then

If Button = 1 Then 'Nhấn chuột trái

If Checked(Row, Col) = False And Flag(Row, Col) <> 1 Then 'Nếu ô người chơi nhấn chuột để lật chưa được lật (Checked(Row, Col) = False ) và không có đánh dấu cờ (Flag(Row, Col) <> 1) thì ô đó mới được lật

If Field(Row, Col) <> 9 Then 'May quá, lật ô này không có mìn!

Solve Row, Col

Trang 6

Else 'Đạp mìn rồi !!!

ShowLose Row, Col 'Lúc này người chơi đã bị "chết" do đạp mìn, kết thúc trò chơi

Exit Sub

End If

End If

End If

If Button = 2 Then 'Nhấn chuột phải

If Not (Checked(Row, Col)) Then Mark Row, Col

End If

End If

If Finish = True Then ShowWin 'Xét xem sau khi người chơi nhấn chuột thì đã hoàn thành trò chơi chưa, nếu hoàn thành rồi thì kết thúc trò chơi

End Sub

Như vậy là các bạn đã hoàn thành các bước chính để lập trình trò chơi Minesweeper Rất tiếc là

do khuôn khổ bài viết có hạn nên tôi không thể trình bày từng chi tiết được Các bạn có thể tải về chương trình hoàn chỉnh (mã nguồn) từ website Thế Giới Vi Tính - PC World Vietnam Online

Nâng cấp Minesweeper

Bạn có muốn "lên đời" trò chơi Minesweeper của mình, làm cho

nó khác biệt, đẹp hơn và hay hơn phiên bản của Microsoft không?

Tôi xin đưa ra một số gợi ý sau:

- Thêm vào âm thanh và hình ảnh

- Dùng một ảnh làm nền Khi một ô không có mìn được lật sẽ

hiện ra một phần của bức ảnh, khi người chơi thắng sẽ hiện ra

toàn bộ bức ảnh đó Người chơi cũng có thể nhập thêm hình ảnh mới vào

- Lật ô nhanh: Xét ô (Row, Col) đã được lật Nếu số ô

đánh dấu bằng cờ xung quanh ô (Row, Col) bằng số ô có mìn trong số các ô quanh ô này, người chơi có thể cho lật nhanh các ô còn lại bằng cách ấn chuột trái vào ô (Row, Col) đã lật và khi đó, các ô chưa lật quanh nó sẽ được lật

Trang 7

- Đánh dấu nhanh: Tương tự như lật ô nhanh, nếu số ô chưa lật xung quanh ô (Row, Col) bằng

số ô có mìn quanh nó, ta có thể đánh dấu nhanh bằng cách nhấn chuột phải vào ô (Row, Col) đã lật

Hy vọng bài viết này có thể giúp các bạn tự lập trình trò chơi "Dò mìn" với những sáng tạo mới Nếu cần trao đổi, các bạn có thể liên lạc với tác giả qua email

MiNaH2710@yahoo.com.sg

Chúc thành công!

 

Ngày đăng: 22/12/2013, 22:16

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w