ÁP DỤNG THUẬT TOÁN HEURISTIC TRONG GAME LỰA ĐẬU
Trang 1TRƯỜNG ĐẠI HỌC NGOẠI NGỮ - TIN HỌC TPHCM
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN TRÍ TUỆ NHÂN TẠO
ÁP DỤNG THUẬT TOÁN
HEURISTIC TRONG GAME LỰA ĐẬU
(Mô phỏng game Line)
DANH SÁCH THÀNH VIÊN TRONG NHÓM:
NGUYỄN THANH NGỌC LINH 08DH11286
NGUYỄN LÊ NGỌC BẢO KHUYÊN 08DH11353
Trang 2MỤC LỤC
TỔNG QUAN 3
1 TÓM TẮT NỘI DUNG ĐỒ ÁN 3
2 CÔNG VIỆC 3
3 NGUỒN GỐC SOURCE CODE CỦA ĐỒ ÁN 3
4 ĐÁNH GIÁ ĐỒ ÁN 4
BÁO CÁO CHI TIẾT 5
1 Giới thiệu về đồ án/game 5
2 Phương pháp/thuật toán TTNT áp dụng vào đồ án (lý thuyết) 5
3 Cài đặt phương pháp/thuật toán TTNT vào đồ án 5
Trang 3TỔNG QUAN
Game Lựa Đậu
- Mô phỏng lại một game thông dụng : Line theo giải thuật Heuristic
- Cách chơi giống game Line , người chơi sẽ phải sắp tối thiểu 5 hạt đậu giống nhau thành một hàng (ngang hoặc dọc hoặc chéo) để ghi điểm.
Khuyên: mô phỏng game , xây dựng đồ thị
Source code :
http://virusvn.com/forum/showthread.php?2275-Source-Game-line
Trong source code này,nhóm đã thay đổi phần giao diện (thay thế hình ảnh,bố trí lại form,thay thế background)
Trang 44.1 Đánh giá đồ án
- Mức độ phức tạp của đồ án:
Thấp Hơi thấp x Trung bình Khá
Rất phức tạp Ý kiến khác
- Giao diện/đồ họa của đồ án có bắt mắt người chơi hay người dùng không: không có giao diện xấu hơi xấu tàm tạm
x Dễ nhìn Đẹp Rất đẹp
Ý Kiến Khác
- Khả năng cuốn hút người dùng hay người chơi:
Nhàm chán x Tàm tạm Hấp dẫn Ly kỳ Chơi là ghiền
Ý kiến khác
- Mức độ phong phú của đồ án:
x Đơn giản Nhiều cấp độ Nhiều tình huống
Nhiều lựa chọn Ý kiến khác
- Mức độ học hỏi của nhóm thông qua đồ án:
Không học được gì Học được ít ít x Học được nhiều
Học rất nhiều Ý kiến
khác
- Đánh giá khác:
Đánh giá của nhóm bạn về môn học này (nếu có)
Trang 5BÁO CÁO CHI TIẾT
5.1 Giới thiệu
Line là một game mini cổ điển được nhiều người chơi ưa thích với cách chơi cực kỳ đơn giản được Microsoft tích hợp trong các hệ điều hành cũ bắt đầu từ Windows 98,Windows XP.
Game Lựa Đậu được xây dựng trên cơ sở của game Line, tuy nhiên hình ảnh và giao diện của game sẽ mang đến cho người chơi một cảm giác mới lạ dựa trên nền một câu chuyện cổ tích rất quen thuộc “Tấm Cám ”
Lựa Đậu thời @
Như thường lệ, hàng năm triều đình có một ngày hội game để các game thủ có dịp trổ tài và để chọn ra một đội tuyển để đi thi đấu với các vương quốc khác Ngày hội đã sắp tới rồi mà Tấm thì lại rất muốn tham gia nhưng sợ dì ghẻ bắt phải lựa đậu mới cho đi như năm ngoái.Tấm gục mặt xuống bàn phím khóc nức nở Không ngờ,tay Tấm đụng trúng phím tắt và Bụt Google hiện lên Như bắt được vàng,Tấm liền hỏi Bụt Google cách để vượt qua thử thách lựa đậu do Dì Ghẻ đặt ra.Bụt liền đưa cho Tấm game Lựa Đậu và dặn: “Để có thể lựa đậu nhanh, hằng ngày con phải bỏ ra một ít thời gian để luyện game này,nhiệm vụ của con là phải sắp ít nhất 5 hạt đậu giống nhau thành một hàng ngang hoặc hàng dọc, hoặc chéo thì những hạt đậu đó sẽ tự động biến mất và
tự chui vào những hộp đựng riêng biệt.Con cố luyện tập nhé! Chúc con thành công!” Bụt vừa dứt lời thì Dì Ghẻ phát hiện Tấm lên mạng nên đã ngắt kết nối internet nhưng may mắn cho Tấm game Lựa Đậu là game offline Và kể từ hôm đó, ngày nào Tấm cũng dành một ít thời gian để luyện game với hi vọng vượt qua được thử thách của Dì Ghẻ để đi dự hội.
Trang 66.1 Phương pháp/thuật toán
Để làm trò chơi Lựa Đậu, đầu tiên phải xác định được đường đi của hạt đậu (khi chọn một hạt đậu và chọn vào một ô trống nào đó trên bảng) Có thể
có nhiều cách để xác định đường đi này Đồ án này sẽ trình bày cách sử dụng thuật toán Heuristic để tìm đường đi của hạt đậu trên bảng
1.1 Xây dựng đồ thị
Đưa ma trận cho trước về danh sách các điểm kề theo hình
Sau đó thiết lập danh sách kề bằng cách:
- Lặp xét hết từng điểm trên ma trận
- Tại mỗi điểm chỉ xét có tạo cạnh liên
thông với 2 điểm lân cận tiến
Vì thuật toán này có tính lặp nên chỉ xét 2điểm các điểm lân cận trên cũng sẽ được xét và tạo cạnh với điểm đang được xét
Trang 71.2 Thuật toán Heuristic :
1.2.i Ý tưởng:
Duyệt dần các điểm trên đồ thị này bằng cách sau khi đi tới 1 điểm, đánh dấu điểm đó đã đi và tiếp tục duyệt các điểm lân cận của điểm đó Để duyệt những điểm kề của một điểm chúng ta tiến hành lặp để tìm kiếm có điểm hiện tại trong dach sách kề hay không Heuristic là dựa vào các chỉ số tọa độ hiện tại của điểm hiện tại với điểm đích với mong muốn với bước đi như thế nào đó
sẽ là đúng và trùng với bước đi ngắn nhất.
Tuy nhiên không phải mọi trường hợp heuristic cũng sử dụng số bước tính toán là ít nhất, thậm chí đôi lúc đường đi mà thuật heuristic tìm ra còn dài hơn các thuật toán vét cạn khác
1.2.ii Mô phỏng thuật toán
Thực hiện tìm kiếm heuristic trên danh sách
{Điểm s là điểm bắt đầu, điểm f là điểm kết thúc}
<Khởi tạo stack rỗng>
push s
pathVisited(s) := 1
isFound := false
while (<Nếu stack chưa rỗng>)
{
pop x
if (x == f)
isFound := true
<Hàm heristic chọn các điểm ưu tiên, cho một biến đại diện chung là r>
<push r>
r := pathVisited(x)+1
}
Thực hiện tìm đường trên đồ thị
if (isFound=True)
{
tim := pathVisited(f)
curPos = f
trace(tim) := curPos
while (pathVisited(curPos)) > 1
{
Trang 8Lặp tìm điểm x lân cận của curPos thỏa bằng tim-1
if (pathVisited(x) = tim-1)
{
trace(tim-1) := x
curPos := x
tim := tim-1
}
}
}
Kết quả trả về :
Độ dài đường đi : tim
Đường đi : Mảng trace
1.2.iii Demo
Trang 9Kết quả :
Minh họa một trường hợp có chướng ngại vật :
2. Cài đặt
Trang 10Các hàm xử lý Stack cơ bản
Dim stack(99) AsLong
Dim curPosStack AsLong
PrivateSub initStack()
curPosStack = -1
EndSub
PrivateFunction isEmptyStack() AsBoolean
If curPosStack = -1 Then
ReturnTrue
EndIf
ReturnFalse
EndFunction
PrivateSub pushStack(ByVal lVal AsLong)
curPosStack = curPosStack + 1
stack(curPosStack) = lVal
EndSub
PrivateFunction popStack() AsLong
If isEmptyStack() = FalseThen
Dim lRes AsLong
lRes = stack(curPosStack)
curPosStack = curPosStack - 1
Return lRes
Else
Return -1
EndIf
EndFunction
Tìm đường đi ngắn nhất dựa vào bảng ma trận kết quả duyệt bằng Heuristic
PrivateSub findPath(ByVal pFrom As Point, ByVal pTo As Point)
'Tìm kiếm sử dụng heuristic
Dim pNext As Point
Dim iCount AsInteger
'Khởi tạo thêm các giá trị điểm kề của điểm bắt đầu
For iCount = 0 To 3
pNext.x = pFrom.x + unitStep(iCount).x
pNext.y = pFrom.y + unitStep(iCount).y
If (pNext.x >= 0) And (pNext.x <= 9) And (pNext.y >= 0) And (pNext.y <= 9)Then
If (iPixel(pNext.x, pNext.y) < 0) Then
With wWalk
lstGraph1.Items.Add(pos2index(pFrom))
lstGraph2.Items.Add(pos2index(pNext))
EndWith
EndIf
EndIf
Next iCount
'Bắt đầu tìm kiếm từ iFrom
Dim iFrom AsInteger
'Điểm đích iTo
Trang 11Dim iTo AsInteger
iTo = pos2index(pTo)
Dim tim AsLong
tim = 1
Dim pathVisited(99) AsInteger
Dim i AsInteger
For i = 0 To 99
pathVisited(i) = 0
Next
iFrom = pos2index(pFrom)
Dim isFounded AsBoolean
isFounded = False
Dim iNext AsInteger
'Khởi tạo stack
initStack()
'Điểm thêm điểm khởi đầu vào stack
pushStack(iFrom)
Dim curIndex AsInteger
Dim curPos As Point
'Mảng lưu ưu tiên hệ số
Dim arrUnit(4) AsInteger
pathVisited(iFrom) = 1
DoWhile isEmptyStack() = False
curIndex = popStack()
If curIndex = iTo Then
isFounded = True
ExitDo
EndIf
' -Hàm
curPos = index2pos(curIndex)
'Tính toán vị trí pTo nằm trong phần gốc nào so với curPos
' |
' -O -> X
' | 1 | 2
'
' | 4 | 3
' |
' Y
If (curPos.x >= pTo.x) And (curPos.y >= pTo.y) Then 'Góc 1
If (curPos.x - pTo.x) >= (curPos.y - pTo.y) Then ' |x |2
' |1 x 4
' | |3
Trang 12arrUnit(4) = 1
arrUnit(3) = 0
arrUnit(2) = 2
arrUnit(1) = 3
Else
' | x|1
' |2 x 3
' | |4
arrUnit(4) = 0
arrUnit(3) = 1
arrUnit(2) = 3
arrUnit(1) = 2
EndIf
ElseIf (curPos.x < pTo.x) And (curPos.y > pTo.y) Then 'Góc 2
If (pTo.x - curPos.x) >= (curPos.y - pTo.y) Then ' | |2 x
' |4 x 1
' | |3
arrUnit(4) = 3
arrUnit(3) = 0
arrUnit(2) = 2
arrUnit(1) = 1
Else
' | |1x
' |3 x 2
' | |4
arrUnit(4) = 0
arrUnit(3) = 3
arrUnit(2) = 1
arrUnit(1) = 2
EndIf
ElseIf (curPos.x <= pTo.x) And (curPos.y <= pTo.y) Then 'Góc 3
If (pTo.x - curPos.x) >= (pTo.y - curPos.y)
Then
' | |3
' |4 x 1
' | |2 x
arrUnit(4) = 3
arrUnit(3) = 2
arrUnit(2) = 0
arrUnit(1) = 1
Else
' | |4
' |3 x 2
' | |1x
arrUnit(4) = 2
arrUnit(3) = 3
arrUnit(2) = 1
arrUnit(1) = 0
EndIf
ElseIf (curPos.x > pTo.x) And (curPos.y < pTo.y) Then 'Góc 4
If (curPos.x - pTo.x) >= (pTo.y - curPos.y) Then
Trang 13' | |3
' |1 x 4
' |x |2
arrUnit(4) = 1
arrUnit(3) = 2
arrUnit(2) = 0
arrUnit(1) = 3
Else
' | |4
' |2 x 3
' | x|1
arrUnit(4) = 2
arrUnit(3) = 1
arrUnit(2) = 3
arrUnit(1) = 0
EndIf
EndIf
For iCount = 4 To 1 Step -1
pNext.x = curPos.x + unitStep(arrUnit(iCount)).x
pNext.y = curPos.y + unitStep(arrUnit(iCount)).y
If isHaveCanh(curIndex, pos2index(pNext)) = TrueThen
If pathVisited(pos2index(pNext)) = 0 Then
pushStack(pos2index(pNext))
pathVisited(pos2index(pNext))= pathVisited(pos2index(curPos)) + 1 EndIf
EndIf
Next
' -Hết hàm
Loop
tim = pathVisited(pos2index(pTo))
If isFounded = TrueThen
'Nếu tìm được đường đi
trace.iLen = tim
ReDim trace.pos(trace.iLen)
curIndex = iTo
DoWhile pathVisited(curIndex) > 1
For iCount = 0 To lstGraph1.Items.Count - 1
If (lstGraph1.Items(iCount) = curIndex) Or
(lstGraph2.Items(iCount) =curIndex) Then
'Tìm điểm kề điểm hiện tại
If lstGraph1.Items(iCount) = curIndex Then
iNext = Val(lstGraph2.Items(iCount))
Else
iNext = Val(lstGraph1.Items(iCount))
EndIf
If pathVisited(iNext) = tim - 1 Then
trace.pos(tim - 1) = index2pos(iNext)
curIndex = iNext
tim = tim - 1
ExitFor
EndIf
Trang 14EndIf
Next iCount
Loop
'Tiến hành vẽ cờ di chuyển
Dim iIndex AsInteger
For iCount = 1 To trace.iLen - 1
iIndex = pos2index(trace.pos(iCount))
pPixel(iIndex).Image = imgGo.Images.Item(0)
Next
Else
trace.iLen = 0
Dim iX AsInteger
Dim iTmp AsInteger
'Xóa cạnh trong list
iTmp = pos2index(pFrom)
For iX = lstGraph1.Items.Count - 1 To 0 Step -1
If (lstGraph1.Items(iX) = iTmp) Or (lstGraph2.Items(iX) = iTmp) Then lstGraph1.Items.RemoveAt(iX)
lstGraph2.Items.RemoveAt(iX)
EndIf
Next
EndIf
EndSub