1. Trang chủ
  2. » Luận Văn - Báo Cáo

ÁP DỤNG THUẬT TOÁN HEURISTIC TRONG GAME LỰA ĐẬU

14 1,1K 5
Tài liệu đã được kiểm tra trùng lặp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 8,85 MB

Nội dung

ÁP DỤNG THUẬT TOÁN HEURISTIC TRONG GAME LỰA ĐẬU

Trang 1

TRƯỜ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 2

MỤ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 3

TỔ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 4

4.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 5

BÁ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 6

6.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 7

1.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 8

Lặ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 9

Kết quả :

Minh họa một trường hợp có chướng ngại vật :

2. Cài đặt

Trang 10

Cá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 11

Dim 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 12

arrUnit(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 14

EndIf

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

Ngày đăng: 27/04/2013, 11:20

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w