Mục tiêu sinh viên cần đạt được:
Hiểu và sử dụng được hệ điều hành Win9x ở mức độ cơ bản.
Sử dụng tốt tiện ích Windows Explorer trong các thao tác quản lý hệ thống file (thư mục - folder & file).
Quy ước ký hiệu và thuật ngữ trong tài liệu:
Khi nói về menu, ký hiệu a.b.c nghĩa là chọn menu a, rồi chọn option b, rồi chọn option c trong danh sách dropdown của submenu b.
Dùng dấu '/' miêu tả sự tùy chọn phần tử bên trái hay bên phải (a/b nghĩa là a hoặc b).
Dùng dấu + để thể hiện việc bấm giữ đồng thời nhiều phím. VD: Ctrl + C nghĩa là ấn giữ phím Ctrl rồi ấn thả phím C rồi thả phím Ctrl.
Về cách sử dụng chuột: click nghĩa là bấm-thả phím chuột trái, right click nghĩa là bấm-thả phím chuột phải, double-click nghĩa là click nhanh 2 lần liên tiếp (nhanh hơn thông số qui định về Mouse trong Control Panel của Windows.
143 trang |
Chia sẻ: NamTDH | Lượt xem: 1229 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Thực hành tin học, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ý sự kiện chọn menu View.StatusBar
Private Sub mnuViewStatusBar_Click()
mnuViewStatusBar.Checked = Not mnuViewStatusBar.Checked
sbStatusBar.Visible = mnuViewStatusBar.Checked
End Sub
' Thủ tục xử lý sự kiện chọn menu View.ToolBar
Private Sub mnuViewToolbar_Click()
mnuViewToolbar.Checked = Not mnuViewToolbar.Checked
tbToolBar.Visible = mnuViewToolbar.Checked
End Sub
' Thủ tục xử lý sự kiện chọn menu File.Exit
Private Sub mnuFileExit_Click()
'unload the form
Unload Me
End Sub
BÀI THỰC HÀNH THÊM Ở NHÀ
(Số 3)
Mục tiêu sinh viên cần đạt được:
Thiết kế trực quan được các phần tử giao diện của chương trình dạng SDI.
Tạo được các thủ tục xử lý biến cố và viết code cho các thủ tục này.
Dùng được các hàm vẽ ảnh, thay đổi kích thước đối tượng giao diện.
Dùng được các thủ tục xử lý sự kiện cơ bản như MouseDown, ...
Chương trình thực hành : trò chơi Caro giữa người và máy :
Chi tiết các menu như sau :
Qui trình thực hiện :
1. Chạy VB bằng 1 trong các cách đã biết.
2. Khi cửa sổ New Project hiển thị, chọn icon "VB Application Wizard" như hình trên và ấn button Open.
3. Bạn có thể chọn file "profile" chứa các thông tin cấu hình cần dùng (đã thiết lập sẵn cho các Project trước) rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
4. Bạn chọn checkbox SDI, nhập tên Project "Caro" rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
5. Bạn có thể xây dựng trực quan menu (trong thí dụ này bạn không cần làm gì ở bước này) rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
6. Bạn có thể xây dựng trực quan toolbar (trong thí dụ này bạn không cần làm gì ở bước này) rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
7. Bạn có thể giữ nguyên thiết lập của cửa sổ này rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
8. Bạn có thể giữ nguyên thiết lập của cửa sổ này (vì không cần truy xuất Internet) rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
9. Bạn chọn checkbox About Box để VB tự động tạo form AboutBox dùm bạn rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
10. Bạn có thể tạo 1 hay nhiều data form truy xuất database (nhưng ứng dụng này không cần) rồi ấn button Next để thực hiện bước tiếp theo của qui trình Wizard.
11. Bạn có thể chọn file profile và cất các thông số vừa thiết lập lên đó (để dùng lại cho các ứng dụng khác) rồi ấn button Finish để kết thúc qui trình Wizard.
12. Cửa sổ ban đầu của Project vừa tạo ra có dạng của hình trên. Trước hết hãy ấn kép vào tên frmAbout trong cửa sổ Project để hiển thị form AboutBox của chương trình rồi hiệu chỉnh lại theo ý muốn, thí dụ theo dạng sau :
13. Ấn kép chuột vào tên frmMain trong cửa sổ Project để hiển thị cửa sổ chính của chương trình. Chọn menu Tool.Menu Editor để hiệu chỉnh lại menu của chương trình theo đặc tả đề nghị ở phần mục đích. Sau đó, xóa Toolbar, comboBox trên frmMain (chỉ giữ lại đối tượng ImageList). Cuối cùng cửa sổ chính có dạng sau :
14. Dùng trình soạn thảo đồ họa (như Paint, Corel Draw!,...) + trình screen capture để vẽ/copy 5 bitmap miêu tả trạng thái các ô cờ (trắng, ô X, ô O, ô X nhấp nháy, ô O nhấp nháy) rồi cất từng ảnh icon lên file bitmap tương ứng (nên cất vào cùng thư mục của Project), thí dụ ta vẽ 5 ảnh bitmap 15*15 như sau :
: blanc.gif : X.gif : O.gif
: FlashX.gif : FlashO.gif
15. Ấn phải chuột vào đối tượng ImageList, chọn mục Properties để hiển thị cửa sổ thuộc tính của nó hầu hiệu chỉnh lại theo mong muốn. Sau khi chọn tab Images trên cửa sổ thuộc tính, cửa sổ Properties có dạng như sau :
16. Ta chọn từng images rồi ấn button "Remove Picture" để xóa nó đến khi không còn images nào trong danh sách, lúc này cửa sổ thuộc tính có dạng sau :
17. Ấn button "Insert Picture" đế thêm từng images vào danh sách, cửa sổ sau được hiển thị để ta duyệt file và chọn file image cần thêm vào danh sách :
18. Chọn file blanc.gif miêu tả ô cờ trống rồi chọn button Open để thêm nó vào danh sách, cửa sổ thuộc tính sẽ có dạng sau :
19. Nhập danh hiệu nhận dạng image vào textbox "Key", mỗi lần code chương trình cần truy xuất 1 icon trong ImageList, ta có thể dùng chỉ số (Index) hay danh hiệu Key của nó để gợi nhớ hơn. Tiếp tục thêm từng image khác và đặt tên cho nó cho đến khi đã thêm đủ 5 images theo yêu cầu. Lúc này cửa sổ thuộc tính có dạng sau :
20. Ấn button OK để hoàn tất việc hiệu chỉnh ImageList và trở về cửa sổ chính của chương trình. Đặt lại tên imageList là ImageList1.
21. Tạo các thủ tục xử lý biến cố cho 2 option Start và Setup... rồi viết code cho chúng như sau :
Option Explicit
'Định nghĩa các hằng gợi nhớ được dùng
Private Const USERID = 1
Private Const COMPID = 2
Private Const BLANC_IMG = 0
Private Const X_IMG = 1
Private Const O_IMG = 2
Private Const FLASHX_IMG = 3
Private Const FLASHO_IMG = 4
'Định nghĩa các biến được dùng trong module
Private blnDangchoi As Boolean ' Trang thai choi/chua choi
Private Board() As Integer ' Ma tran trang thai cac o
Private Score() As Integer ' Ma tran diem trong so cac o
Private intRowsBoard As Integer ' so hang o
Private intColsBoard As Integer ' so cot o
Private blnThang(2) As Boolean ' Trang thai thang cua tung phan tu choi
Private picImage(0 To 4) As Object ' day cac image can dung
Private intMaxscore(2) As Integer ' day diem trong so cua phan tu choi
Private win_row As Integer, win_rinc As Integer
Private win_col As Integer, win_cinc As Integer
Private intBaseX As Integer, intBaseY As Integer ' tọa độ trên trái của bàn cờ
Private intPicXWidth As Integer, intPicXHeight As Integer ' kích thước từng ô
Private intUserD As Integer, intUserC As Integer
Private intCompD As Integer, intCompC As Integer
Private mdong As Integer
Private mcot As Integer
'------------------------------------------------------------------
' Các thủ tục xử lý sự kiện của form Caro
'------------------------------------------------------------------
' Thủ tục xử lý sự kiện Load form
Private Sub Form_Load()
intRowsBoard = 20
intColsBoard = 20
intPicXWidth = 15
intPicXHeight = 15
intBaseX = 4
intBaseY = 4
Call InitBoard
End Sub
' Thủ tục xử lý sự kiện ấn chuột form
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim row As Integer, col As Integer
If Not blnDangchoi Then Exit Sub
' Kiểm tra vị trí ấn chuột nằm trong bàn cờ không ?
If intBaseX > x Or x > intBaseX + intColsBoard * intPicXWidth Or _
intBaseY > y Or y > intBaseY + intRowsBoard * intPicXHeight Then Exit Sub
' Tính vị trí ô cờ được ấn
col = (x - intBaseX) \ intPicXWidth
row = (y - intBaseY) \ intPicXHeight
' Nếu vị trí ô cờ được ấn đã dùng rồi thì thôi
If Board(row, col) 0 Then Exit Sub
' Ghi nhận vị trí ô cờ được ấn cho người dùng
Board(row, col) = USERID
' Hiển thị vị trí ô cờ có dấu X
DisplayElem row, col, X_IMG
' Kiểm tra xem user thắng chưa ?
If KiemtraThang(row, col, USERID) Then
blnDangchoi = False
FlashDisplay (USERID)
MsgBox ("Hoan ho! Ban da thang toi.")
Exit Sub
End If
' Tìm nước đi kế tiếp cho máy
Call Timnuocke
Board(mdong, mcot) = COMPID
DisplayElem mdong, mcot, O_IMG
' Kiểm tra xem máy thắng chưa ?
If KiemtraThang(row, col, COMPID) Then
blnDangchoi = False
FlashDisplay (COMPID)
MsgBox ("Rat tiec! Ban da thua toi.")
Exit Sub
End If
End Sub
' Thủ tục xử lý sự kiện vẽ lại form
Private Sub Form_Paint()
Dim row As Integer, col As Integer
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
DisplayElem row, col, Board(row, col)
Next col, row
End Sub
' Thủ tục xử lý sự kiện chọn Options.Setup
Private Sub mnuOptionsSetup_Click()
CaroSetup.txtRowsBoard = CStr(intRowsBoard)
CaroSetup.txtColsBoard = CStr(intColsBoard)
CaroSetup.Show vbModal
intRowsBoard = Val(CaroSetup.txtRowsBoard)
intColsBoard = Val(CaroSetup.txtColsBoard)
Call InitBoard
End Sub
' Thủ tục xử lý sự kiện chọn Options.Start
Private Sub mnuOptionsStart_Click()
Call InitBoard
Call Form_Paint
End Sub
' Thủ tục xử lý sự kiện chọn Help.About
Private Sub mnuHelpAbout_Click()
frmAbout.Show vbModal, Me
End Sub
' Thủ tục xử lý sự kiện chọn Options.Exit
Private Sub mnuFileExit_Click()
Unload Me
End Sub
'-----------------------------------------------------------------------------------------
' Cac thu tuc dich vu cap 1 : duoc goi khi ban an chuot vao form
' Ta dùng tam vuc Public de phan biet voi cac thu tuc dich vu cap 2
'-----------------------------------------------------------------------------------------
'Ham khoi dong trang thai tro choi moi lan choi
Public Sub InitBoard()
Dim row As Integer, col As Integer
ReDim Board(intRowsBoard - 1, intColsBoard - 1)
ReDim Score(intRowsBoard - 1, intColsBoard - 1)
'blnInit = False
blnDangchoi = True
blnThang(USERID) = False
blnThang(COMPID) = False
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
Board(row, col) = 0
Score(row, col) = 0
Next col, row
Me.ScaleMode = vbPixels
Me.Width = Me.ScaleX(intColsBoard * intPicXWidth + intBaseX * 4, vbPixels, vbTwips)
Me.Height = Me.ScaleY(intRowsBoard * intPicXHeight + intBaseY * 2 + 45, vbPixels, vbTwips)
'Me.Width = (intColsBoard * intPicXWidth + intBaseX * 2)
'Me.Height = (intRowsBoard * intPicXHeight + intBaseY + 20 + intBaseX) * 16
End Sub
'Ham kiem tra phan tu choi id thang chua
Public Function KiemtraThang(h As Integer, c As Integer, ByVal id As Integer) As Boolean
If id = COMPID Then
KiemtraThang = blnThang(COMPID)
Exit Function
End If
intMaxscore(USERID) = EvaluatePosition_5(USERID)
intUserD = mdong
intUserC = mcot
KiemtraThang = blnThang(USERID)
End Function
'Ham tim nuoc di ke cho may
Public Sub Timnuocke()
intMaxscore(COMPID) = EvaluatePosition_5(COMPID)
intCompD = mdong
intCompC = mcot
If intMaxscore(USERID) = 0 And intMaxscore(COMPID) = 0 Then
blnDangchoi = False
MsgBox ("Hue!")
Exit Sub
End If
' tim vi tri di cua may
If (intMaxscore(USERID) <= intMaxscore(COMPID)) Then
mdong = intCompD
mcot = intCompC
ElseIf priority(intMaxscore(USERID), intMaxscore(COMPID)) Then
mdong = intUserD
mcot = intUserC
Else
mdong = intCompD
mcot = intCompC
End If
End Sub
'Ham hien thi 5 o thang (chi moi to dam)
Public Sub FlashDisplay(ByVal id As Integer)
Dim i As Integer
For i = 0 To 4
If id = USERID Then
DisplayElem win_row + win_rinc * i, win_col + win_cinc * i, FLASHX_IMG
Else
DisplayElem win_row + win_rinc * i, win_col + win_cinc * i, FLASHO_IMG
End If
Next i
End Sub
'-----------------------------------------------------------------------------------------------------
' Cac thu tuc dich vu cap 2 :
' chi duoc dung boi cac thu tuc dich vu cap 1
' Ta dùng tam vuc Private de phan biet voi cac thu tuc dich vu cap 1
'-----------------------------------------------------------------------------------------------------
Private Function priority(ByVal m1 As Integer, ByVal m2 As Integer) As Boolean
Dim tam As Integer, n1 As Integer, n2 As Integer
Dim diem As Integer
diem = 100
n1 = m1 \ diem
n2 = m2 \ diem
If n1 0 Or n2 0 Then
priority = n1 > n2
Exit Function
End If
diem = diem \ 10
n1 = m1 \ diem
n2 = m2 \ diem
If n1 0 Or n2 0 Then
priority = n1 > n2
Exit Function
End If
diem = diem \ 10
n1 = m1 \ diem
n2 = m2 \ diem
If n1 0 Or n2 0 Then
priority = n1 > n2
Exit Function
End If
priority = True
End Function
'------------------------------------------------
'Xoa ma tran tinh diem Score
Private Sub ZeroScores()
Dim row As Integer, col As Integer
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
Score(row, col) = 0
Next col
Next row
End Sub
'------------------------------------------------
' Tim diem lon nhat
Private Function FindMaxScore()
Dim MaxScore As Integer
Dim row As Integer, col As Integer
MaxScore = -1
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
If Score(row, col) > MaxScore Then
mdong = row
mcot = col
MaxScore = Score(row, col)
End If
Next col
Next row
FindMaxScore = MaxScore
End Function
'----------------------------------------------------
Private Function SixInLine(ByVal row As Integer, ByVal col As Integer, ByVal rinc As Integer, ByVal cinc As Integer, ByVal player As Integer) As Boolean
Dim d_row As Integer, d_col As Integer, c_row As Integer, c_col As Integer
d_row = row - rinc
d_col = col - cinc
c_row = row + 5 * rinc
c_col = col + 5 * cinc
SixInLine = False
If d_row = intRowsBoard Or d_col >= intColsBoard Then
If c_row >= intRowsBoard Or c_col >= intColsBoard Or c_row < 0 Or c_col < 0 Then
Exit Function
End If
If Board(c_row, c_col) = player Then SixInLine = True
Exit Function
End If
If c_row >= intRowsBoard Or c_col >= intColsBoard Or c_row < 0 Or c_col < 0 Then
If Board(d_row, d_col) = player Then SixInLine = True
Exit Function
End If
If Board(d_row, d_col) = player Or Board(c_row, c_col) = player Then
SixInLine = 1
Else
SixInLine = 0
End If
End Function
'------------------------------------------------
'ham evaluateline cho luat choi "5 an"
'Tính so diem cua nguoi va may trong hang
Private Function EvaluateLine_5(ByVal row As Integer, ByVal rinc As Integer, ByVal col As Integer, cinc As Integer, player As Integer) As Integer
Dim tot1 As Integer
Dim tot2 As Integer
Dim select1 As Integer
Dim intScore As Integer
Dim i As Integer
tot1 = 0
tot2 = 0
EvaluateLine_5 = 0
For i = 0 To 4
Select Case Board(row, col)
Case 1
tot1 = tot1 + 1
Case 2
tot2 = tot2 + 1
End Select
row = row + rinc
col = col + cinc
Next i
'If the line has markers from both players then it has score 0
If tot1 > 0 And tot2 > 0 Then Exit Function
'Score according to how many markers player 1 or player 2 has in the line
intScore = 0
If (player = 1) Then
select1 = tot1
Else
select1 = tot2
End If
Select Case select1
Case 1
intScore = 1
Case 2
intScore = 10
Case 3
intScore = 100
Case 4
If Not SixInLine(row - 5 * rinc, col - 5 * cinc, rinc, cinc, player) Then
If player = COMPID Then
If Not blnThang(COMPID) Then
blnThang(COMPID) = True
win_row = row - 5 * rinc
win_rinc = rinc
win_col = col - 5 * cinc
win_cinc = cinc
EvaluateLine_5 = 2000
Exit Function
End If
Else
intScore = 1000
End If
Else
intScore = -100
End If
Case 5
If Not SixInLine(row - 5 * rinc, col - 5 * cinc, rinc, cinc, player) Then
blnThang(player) = True
win_row = row - 5 * rinc
win_rinc = rinc
win_col = col - 5 * cinc
win_cinc = cinc
End If
End Select
EvaluateLine_5 = intScore
End Function
'------------------------------------------------
'ham AddToLine_5 cho luat choi "5 an"
'Them diem vao moi o trong trong day.
Private Sub AddToLine_5(ByVal sinc As Integer, ByVal row As Integer, ByVal rinc As Integer, ByVal col As Integer, ByVal cinc As Integer)
Dim i As Integer
For i = 0 To 4
If Board(row, col) = 0 Then Score(row, col) = Score(row, col) + sinc
row = row + rinc
col = col + cinc
Next i
End Sub
'----------------------------------------------------------
'ham EvaluatePosition_5 cho luat choi "5 an"
'Khao sat vi tri bang cach tim day 5 o duoc danh lien tiep
Private Function EvaluatePosition_5(ByVal player As Integer) As Integer
Dim row As Integer, col As Integer
Dim rinc As Integer, cinc As Integer
Dim intScore As Integer
Dim intDir As Integer
Call ZeroScores
' Khao sat tung o tren board
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
'For each square look at the three five-in-a-rows that start from it
'One along the row, one along the column, and along the diagonal
'Whoops -- along BOTH diagonals!
For intDir = 0 To 3
'check for the cases where we are too close to the board edges
'intDir==0 checks the five in a row along this row
If intDir = 0 And col > intColsBoard - 5 Then GoTo Continue
'intDir==0 checks the five in a row along this column
If intDir = 1 And row > intRowsBoard - 5 Then GoTo Continue
'intDir==2 checks the five in a row along the right diagonal
If intDir = 2 And (col > intColsBoard - 5 Or row > intRowsBoard - 5) Then GoTo Continue
'intDir==3 checks the five in a row along the left diagonal
If intDir = 3 And (col intRowsBoard - 5) Then GoTo Continue
Select Case intDir
Case 0
rinc = 0
cinc = 1
Case 1
rinc = 1
cinc = 0
Case 2
rinc = 1
cinc = 1
Case 3
rinc = 1
cinc = -1
End Select
intScore = EvaluateLine_5(row, rinc, col, cinc, player)
AddToLine_5 intScore, row, rinc, col, cinc
Continue:
Next intDir
Next col
Next row
EvaluatePosition_5 = FindMaxScore()
End Function
'Hien thi o co imgCode o vi tri (row,col)
Private Sub DisplayElem(row As Integer, col As Integer, imgCode As Integer)
Dim x As Integer, y As Integer
Dim curPic As Object
ScaleMode = vbPixels
x = intBaseX + col * intPicXWidth
y = intBaseY + row * intPicXHeight
PaintPicture ImageList1.ListImages.Item(imgCode + 1).Picture, x, y, intPicXWidth, intPicXHeight, 0, 0, , , vbSrcCopy
End Sub
BÀI THỰC HÀNH THÊM Ở NHÀ
(Số 4)
Mục tiêu sinh viên cần đạt được:
Thiết kế trực quan được các phần tử giao diện của chương trình dạng SDI.
Tạo được các thủ tục xử lý biến cố và viết code cho các thủ tục này.
Dùng được các hàm vẽ ảnh, thay đổi kích thước đối tượng giao diện.
Dùng được các thủ tục xử lý sự kiện cơ bản như MouseDown, ...
Chương trình thực hành : trò chơi dò mìn có dạng sau :
Chi tiết các menu như sau :
Qui trình thực hiện :
1-20. Thực hiện các bước từ 1-20 giống y như bài Caro với 1 vài khác biệt :
Các image được dùng trong trò chơi dò mìn là :
: BlancInit.jpg : MineInactive.jpg : MineActive.jpg
: BlancFin.jpg : One.jpg : Two.jpg
: Three.jpg : Four.jpg : Five.jpg
: Six.jpg : Seven.jpg : eight.jpg
Như vậy cửa sổ tạo ImageList như sau :
Cửa sổ thiết lập các thông số có 3 textbox nhận 3 giá trị : số hàng, số cột của bãi mìn và số mìn trong bãi mìn.
21. Tạo các thủ tục xử lý biến cố cho 2 option Start và Setup... rồi viết code cho chúng như sau :
Option Explicit
' Lưu ý các image trong ImageList phải có đúng chỉ số được qui định ở đây
Private Const BLANCINIT_IMG = 1
Private Const MINEINACTIVE_IMG = 2
Private Const MINEACTIVE_IMG = 3
Private Const BLANCFIN_IMG = 4
'Private Const ONE_IMG = 5
'Private Const TWO_IMG = 6
'Private Const THREE_IMG = 7
'Private Const FOUR_IMG = 8
'Private Const FIVE_IMG = 9
'Private Const SIX_IMG = 10
'Private Const SEVEN_IMG = 11
'Private Const EIGHT_IMG = 12
Private blnDangchoi As Boolean ' Trạng thái chơi/ chưa chơi
Private intRowsBoard As Integer ' số hàng của bãi mìn
Private intColsBoard As Integer ' số cột của bãi mìn
Private intMineCount As Integer ' số mìn trong bãi mìn
Private intPicXWidth As Integer, intPicXHeight As Integer ' kích thước từng ô
Private intBaseX As Integer, intBaseY As Integer ' tọa độ trên trái của bãi mìn
Private intOdado As Integer ' số ô đã đạp được
Private DataBoard() As Integer ' ma trận dữ liệu mìn
Private StatusBoard() As Boolean ' ma trận trạng thái đạp mìn
'------------------------------------------------------------------
' Các thủ tục xử lý sự kiện của form MyMine
'------------------------------------------------------------------
Private Sub Form_Load()
' Thiết lập các thông số ban đầu của trò chơi
intRowsBoard = 8
intColsBoard = 8
intMineCount = 10
intPicXWidth = 17
intPicXHeight = 17
intBaseX = 4
intBaseY = 4
Call InitBoard
End Sub
' Thủ tục xử lý sự kiện ấn chuột form
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim row As Integer, col As Integer
If Not blnDangchoi Then Exit Sub
' Kiểm tra vị trí ấn chuột nằm trong bàn cờ không ?
If intBaseX > x Or x > intBaseX + intColsBoard * intPicXWidth Or _
intBaseY > y Or y > intBaseY + intRowsBoard * intPicXHeight Then Exit Sub
' Tính vị trí ô cờ được ấn
col = (x - intBaseX) \ intPicXWidth
row = (y - intBaseY) \ intPicXHeight
' Đạp mìn ở vị trí (row,col)
Call Domin(row, col)
End Sub
' Thủ tục xử lý sự kiện vẽ lại form
Private Sub Form_Paint()
Dim row As Integer, col As Integer
Dim cnt As Integer
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
If Not StatusBoard(row, col) Then
Call DisplayElem(row, col, BLANCINIT_IMG)
ElseIf DataBoard(row, col) = 1 Then
Call DisplayElem(row, col, MINEINACTIVE_IMG)
Else
cnt = MineCount(row, col)
Call DisplayElem(row, col, cnt + 4)
End If
Next col, row
End Sub
' Thủ tục xử lý sự kiện chọn menu Help.About MyMine
Private Sub mnuHelpAbout_Click()
frmAbout.Show vbModal, Me
End Sub
' Thủ tục xử lý sự kiện chọn menu Options.Exit
Private Sub mnuOptionsExit_Click()
'unload the form
Unload Me
End Sub
' Thủ tục xử lý sự kiện chọn menu Options.Setup...
Private Sub mnuOptionsSetup_Click()
MyMineSetup.txtRowsBoard = CStr(intRowsBoard)
MyMineSetup.txtColsBoard = CStr(intColsBoard)
MyMineSetup.txtMineCount = CStr(intMineCount)
MyMineSetup.Show vbModal
intRowsBoard = Val(MyMineSetup.txtRowsBoard)
intColsBoard = Val(MyMineSetup.txtColsBoard)
intMineCount = Val(MyMineSetup.txtMineCount)
If intRowsBoard < 8 Then intRowsBoard = 8
If intColsBoard < 8 Then intColsBoard = 8
If intMineCount = intRowsBoard * intColsBoard Then intMineCount = 10
Call InitBoard
End Sub
' Thủ tục xử lý sự kiện chọn menu Options.Start
Private Sub mnuOptionsStart_Click()
Call InitBoard
Call Form_Paint
End Sub
'-----------------------------------------------------------------------------------------
' Các thủ tục dịch vụ cấp 1 : được gọi khi bạn ấn chuột vào form
' Ta dùng tầm vực Public để phân biệt với các thủ tục dịch vụ cấp 2
'-----------------------------------------------------------------------------------------
'Thủ tục khởi động các thông số ban đầu của trò chơi
Public Sub InitBoard()
Dim row As Integer, col As Integer
Dim i As Integer
ReDim DataBoard(intRowsBoard - 1, intColsBoard - 1)
ReDim StatusBoard(intRowsBoard - 1, intColsBoard - 1)
'blnInit = False
blnDangchoi = True
intOdado = 0
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
DataBoard(row, col) = 0
StatusBoard(row, col) = False
Next col, row
Me.ScaleMode = vbPixels
' Chỉnh lại kích thước form để hiển thị vừa đủ bãi mìn
Me.Width = Me.ScaleX(intColsBoard * intPicXWidth + intBaseX * 4, vbPixels, vbTwips)
Me.Height = Me.ScaleY(intRowsBoard * intPicXHeight + intBaseY * 2 + 64, vbPixels, vbTwips)
' Xếp ngẫu nhiên intMineCount trái mìn vào bãi mìn
i = 0
Call Randomize
While i < intMineCount
row = (intRowsBoard - 1) * Rnd
col = (intColsBoard - 1) * Rnd
If DataBoard(row, col) = 0 Then
DataBoard(row, col) = 1
i = i + 1
End If
Wend
End Sub
' Đạp mìn ở vị trí (h,c)
Public Sub Domin(ByVal h As Integer, ByVal c As Integer)
Dim cnt As Integer
Dim row As Integer, col As Integer
If StatusBoard(h, c) Then Exit Sub
If DataBoard(h, c) = 1 Then 'Dap trung min
' hien thi cac vi tri min
For row = 0 To intRowsBoard - 1
For col = 0 To intColsBoard - 1
If DataBoard(row, col) = 1 Then Call DisplayElem(row, col, MINEINACTIVE_IMG)
Next col, row
Call DisplayElem(h, c, MINEACTIVE_IMG)
MsgBox ("Ban da thua vi dap trung min roi!")
blnDangchoi = False
Else 'do trung cho khong co min
cnt = MineCount(h, c)
StatusBoard(h, c) = True
If cnt = 0 Then
Call DisplayElem(h, c, BLANCFIN_IMG)
Call Doquanh(h, c)
Else
Call DisplayElem(h, c, cnt + 4)
End If
intOdado = intOdado + 1
End If
If intOdado = intRowsBoard * intColsBoard - intMineCount Then
MsgBox ("Hoan ho, Ban da thang!")
blnDangchoi = False
End If
End Sub
'-----------------------------------------------------------------------------------------------------
' Các thủ tục dịch vụ cấp 2 : chỉ được gọi bởi các thủ tục dịch vụ cấp 1
' Ta dùng tầm vực Private để phân biệt với các thủ tục dịch vụ cấp 1
'-----------------------------------------------------------------------------------------------------
'Hiển thị ô mìn ở vị trí (row,col) có mã ảnh imgCode
Private Sub DisplayElem(ByVal row As Integer, ByVal col As Integer, ByVal imgCode As Integer)
Dim x As Integer, y As Integer
Dim curPic As Object
ScaleMode = vbPixels
x = intBaseX + col * intPicXWidth
y = intBaseY + row * intPicXHeight
PaintPicture ImageList1.ListImages.Item(imgCode).Picture, x, y, intPicXWidth, intPicXHeight, 0, 0, , , vbSrcCopy
End Sub
' Tính số mìn xung quanh vị trí (h,c)
Private Function MineCount(ByVal h As Integer, ByVal c As Integer) As Integer
Dim cnt As Integer
If h - 1 >= 0 And c - 1 >= 0 Then
If DataBoard(h - 1, c - 1) = 1 Then cnt = cnt + 1
End If
If h - 1 >= 0 Then
If DataBoard(h - 1, c) = 1 Then cnt = cnt + 1
End If
If h - 1 >= 0 And c + 1 < intColsBoard Then
If DataBoar
Các file đính kèm theo tài liệu này:
- baithuchanh_7261.doc