八数码游戏的Ruby实现
2005-09-29 22:31
190 查看
八数码游戏就是通过移动空格把数字从给定的状态移动到目标状态,例如:
初始状态为 目标状态为
2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5 程序中用0表示空格,提供了两套状态。EightNums.rbclass 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: #{min}",' '
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
end
end
end
#移动
moveZero(direction)
lastmove = direction
printStat(@@Stat)
puts "Current value: #{getValue(@@Stat)}"
if !flag
min = getValue(@@Stat)
end
steps += 1
break if getValue(@@Stat) == 0
end
end
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
end
end
end
return 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
end
when 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
end
when 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
end
when 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
end
end
return 0
end
#打印状态
def printStat(status)
3.times {|i| print status[i][0], ' ', status[i][1], ' ', status[i][2], "/n"}
end
#尝试移动,移动不成功则返回-1
def tryMoving(direction)
success = moveZero(direction)
if success == 0
value = getValue(@@Stat)
moveZero(-direction)
return value
else
return -1
end
end
endNum = EightNums.new
Num.run()
初始状态为 目标状态为
2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5 程序中用0表示空格,提供了两套状态。EightNums.rbclass 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: #{min}",' '
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
end
end
end
#移动
moveZero(direction)
lastmove = direction
printStat(@@Stat)
puts "Current value: #{getValue(@@Stat)}"
if !flag
min = getValue(@@Stat)
end
steps += 1
break if getValue(@@Stat) == 0
end
end
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
end
end
end
return 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
end
when 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
end
when 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
end
when 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
end
end
return 0
end
#打印状态
def printStat(status)
3.times {|i| print status[i][0], ' ', status[i][1], ' ', status[i][2], "/n"}
end
#尝试移动,移动不成功则返回-1
def tryMoving(direction)
success = moveZero(direction)
if success == 0
value = getValue(@@Stat)
moveZero(-direction)
return value
else
return -1
end
end
endNum = EightNums.new
Num.run()
相关文章推荐
- 游戏中汉字显示的实现与技巧
- 在Unity3D的网络游戏中实现资源动态加载
- 探cocos2dx对游戏精灵(sprite_nodes)的实现。(源码版本2.2.3)
- 实现PHP,.NET, C#, JAVA, Python, Ruby,C(++) 与websocket 实时通信
- [转]用C++实现跨平台游戏开发之Irrlicht引擎
- java基于swing实现的五子棋游戏代码
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 【Visual C++】游戏开发笔记之十 基础动画显示(三) 透明动画的实现
- swift实现的Dont Tap the Red Button游戏iOS源码
- 关于在 java 或其他游戏设计中实现屏幕震动
- 游戏中雷达图实现
- 游戏引擎介绍,架构,设计及实现
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 数独游戏的设计与实现
- <实训|第五天>通过搭建NFS,FTP实现共享文件附Vim脚本游戏
- 游戏地图实现方式
- Handler实现的打地鼠游戏
- 游戏引擎/GUI的设计与实现-主题
- 使用非html5实现js板连连看游戏