八數碼遊戲的Ruby實現

2021-04-01 20:28:03 字數 3373 閱讀 4133

八數碼遊戲就是通過移動空格把數字從給定的狀態移動到目標狀態,例如:

初始狀態為        目標狀態為

2 8 3                   1 2 3

1 6 4                   8    4

7    5                   7 6 5

程式中用0表示空格,提供了兩套狀態。

eightnums.rb

class eightnums

#常量定義

up    = 1

down  = -1

left  = 2

right = -2

row   = 0

col   = 1

#初始化

@@initstat   = [[2,8,3], [1,6,4], [7,0,5]]  #初始狀態

@@targetstat = [[1,2,3], [8,0,4], [7,6,5]]  #目標狀態

@@stat       = [[2,8,3], [1,6,4], [7,0,5]]  #初始狀態

@@zeropos    = [2, 1]                       #0的位置

# @@initstat   = [[2,0,3], [1,4,5], [6,7,8]]  #初始狀態

# @@targetstat = [[1,2,3], [4,0,5], [6,7,8]]  #目標狀態

# @@stat       = [[2,0,3], [1,4,5], [6,7,8]]  #初始狀態

# @@zeropos    = [0, 1]                       #0的位置

def run()

puts "initial status:"

printstat(@@initstat)

min = getvalue(@@stat)

puts "target status:"

printstat(@@targetstat)  

puts "initial value: #",' '

steps = 0

lastmove = -1       #記錄上次移動方向,避免反覆

while steps < 10 do

flag = false      #是否找到比min小的值

#尋找最小值,確定移動方向

direction = up

[up, down, left, right].each do

|i|val = trymoving(i)

if val != -1

if val < min && i != -lastmove then

min = val

flag = true

direction = i

endend

end#移動

movezero(direction)

lastmove = direction

printstat(@@stat)

puts "current value: #"

if !flag

min = getvalue(@@stat)

endsteps += 1

break if getvalue(@@stat) == 0

endend

private

def getvalue(status)

value = 0

for row in 0..2 do

for col in 0..2 do

if status[row][col] != @@targetstat[row][col]

value += 1

endend

endreturn value

end#移動0

def movezero(direction)

case direction

when up   #上移

if @@zeropos[row] != 0

@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row] - 1][@@zeropos[col]]

@@stat[@@zeropos[row] - 1][@@zeropos[col]] = 0

@@zeropos[row] -= 1

else

return -1

endwhen down #下移

if @@zeropos[row] != 2

@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row] + 1][@@zeropos[col]]

@@stat[@@zeropos[row] + 1][@@zeropos[col]] = 0

@@zeropos[row] += 1

else

return -1

endwhen left #左移

if @@zeropos[col] != 0

@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row]][@@zeropos[col] - 1]

@@stat[@@zeropos[row]][@@zeropos[col] - 1] = 0

@@zeropos[col] -= 1

else

return -1

endwhen right  #右移

if @@zeropos[col] != 2

@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row]][@@zeropos[col] + 1]

@@stat[@@zeropos[row]][@@zeropos[col] + 1] = 0

@@zeropos[col] += 1

else

return -1

endend

return 0

end#列印狀態

def printstat(status)

3.times

end#嘗試移動,移動不成功則返回-1

def trymoving(direction)

success = movezero(direction)

if success == 0

value = getvalue(@@stat)

movezero(-direction)

return value

else

return -1

endend

endnum = eightnums.new

num.run()

八數碼遊戲的Ruby實現

八數碼遊戲就是通過移動空格把數字從給定的狀態移動到目標狀態,例如 初始狀態為 目標狀態為 2 8 3 1 2 3 1 6 4 8 4 7 5 7 6 5 程式中用0表示空格,提供了兩套狀態。eightnums.rb class eightnums 常量定義 up 1 down 1 left 2 ri...

簡單的八數碼問題(BFS)

時間限制 1 sec 記憶體限制 256 mb 提交 9 解決 7 提交 狀態 討論版 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有一個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始佈局 初始狀態 和目標佈局 為了使題目簡單,設目標狀態...

八數碼問題的A 演算法求解

a 演算法是啟發式搜素演算法中較為出名和高效的演算法之一,其關鍵是對於啟發式函式的實際,啟發式函式h x 需要儘可能的接近實際的h x h x 下面是人工智慧八數碼問題使用a 演算法求解的原始碼放在部落格上記錄一下。程式使用放錯位置的棋子的個數作為啟發式函式。include include incl...

八數碼問題的幾種解法

1.用雙向bfs解決八數碼問題 2.用迭代加深搜的a 演算法解決八數碼問題 注 本實驗我採用的都是從283104765到123804765的最短步數 首先,雙向bfs指的是從初始狀態和目標狀態同時開始搜尋,廣度優先搜尋是每次先搜尋周圍,然後再向外擴充套件,這裡我們把矩陣轉化為數字序列,更方便 我將用...

八數碼遊戲分析 原始碼 啟發式搜尋(一)

八數碼問題 圖1.1 左邊為開始格局,右邊為移動後最終格局 圖1.2 如果按正常的思維,採用盲目搜尋的話,不僅搜尋的次數多,而且往往容易陷入死迴圈中,所以面對此問題需要一種策略 啟發式搜尋 啟發式搜尋 啟發式搜尋就是在狀態空間中的搜尋對每一個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直...