八數碼遊戲的Ruby實現

2021-08-29 03:30:12 字數 3373 閱讀 9850

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

初始狀態為        目標狀態為

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

C 實現八數碼的IDEA 迭代加深A 演算法

八數碼是乙個經典的人工智慧難題,因為好的演算法在八數碼問題中將搜尋的幾種經典方法體現的淋漓盡致,經過幾種演算法的比較,我發現用迭帶加深的啟發示演算法的效率最好,而且求得解為最優解.開始實現時老是在查詢cloesd表時耗費時間,因此好多case都要算很長時間,最長竟達30分鐘,後來將cloesd儲存在...

A A 演算法解決八數碼問題(C 實現)

1.狀態圖搜尋 1.1搜尋樹 搜尋過程中經過的節點和邊按原圖的連線關係構成乙個樹型的有向圖,稱為搜尋樹。1.2搜尋方式 樹式搜尋 記錄搜尋過程中所經過的所有節點和邊 1.3路徑的獲得 樹式搜尋 反向求解 2.搜尋演算法 2.1 closed表和open表 closed表對樹式搜尋來說儲存的是正在成長...