`
DigitalSonic
  • 浏览: 216125 次
社区版块
存档分类
最新评论

八数码游戏的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
  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
end

Num = EightNums.new
Num.run()

分享到:
评论

相关推荐

    飞机大战ruby实现

    【标题】"飞机大战ruby实现" 是一个使用Ruby编程语言开发的飞行射击游戏,它基于RPG Maker XP 1.03引擎构建。这个项目展示了如何利用Ruby的灵活性和RPG Maker XP的功能来创建一款简单但有趣的游戏。 【描述】中的...

    基于Ruby实现的管理游戏信息,以及游戏映射信息的系统

    综上所述,这个基于Ruby实现的系统利用了Ruby语言的特性,构建了一个集游戏信息管理与游戏映射信息处理于一体的平台,展示了Ruby在游戏开发领域的强大潜力和灵活性。无论是对于初学者还是经验丰富的开发者,这样的...

    Ruby-TensorStream用Ruby重新实现TensorFlow

    **Ruby-TensorStream:用Ruby重现实现TensorFlow** Ruby-TensorStream是一个开源项目,旨在为Ruby开发者提供一个类似于Google TensorFlow的深度学习框架。它的核心目标是让Ruby程序员能够利用TensorFlow的强大功能...

    游戏脚本语言(ruby初步)

    游戏脚本语言(ruby初步) 游戏脚本语言是游戏开发中不可或缺的一部分,而 ruby 是一种广泛应用于游戏脚本编程的语言。了解游戏脚本编程的基础是游戏开发者的必备技能,而 ruby 的语法和基本用法是游戏脚本编程的...

    ruby-使用ruby实现的排序算法-sorting.zip

    本资源"ruby-使用ruby实现的排序算法-sorting.zip"聚焦于如何使用Ruby实现不同的排序算法,这对于Ruby开发者来说是一项重要的技能。下面将详细讨论Ruby中的排序算法及其原理。 1. 内置排序方法 `sort` Ruby提供了...

    使用Python Lua和Ruby语言进行游戏编程

    此外,Python还可以与C++或Unity等更底层的游戏引擎交互,实现更高效的游戏性能。 其次,Lua是一种轻量级的脚本语言,特别适合嵌入到大型游戏项目中作为配置语言使用。它的设计目标就是简单、快速、小巧,这使得Lua...

    Ruby-twittercldrrbICU的Ruby实现

    这个库为Ruby开发者提供了一套强大的工具,用于在应用程序中实现多语言支持和文化敏感的文本处理。 首先,我们来了解一下ICU。ICU是一个广泛使用的开源库,它提供了全面的Unicode支持和跨平台的本地化功能。它包含...

    ruby-snmp, SNMP ( 简单网络管理协议)的ruby 实现.zip

    ruby-snmp, SNMP ( 简单网络管理协议)的ruby 实现 用于 ruby的 SNMP库摘要这里库实现 SNMP ( 简单网络管理协议) 。 它在纯 ruby 中实现,因此不依赖于的外部库( 如 ) 。 你可以在 ruby 可以运行的任何地方运行这里库...

    resume 用Ruby技术实现的search 分页的例子

    在Ruby on Rails(ROR)框架中,实现搜索和分页功能是常见的需求,尤其是在构建数据密集型Web应用时。本示例将深入探讨如何利用Ruby技术和Rails的强大特性来完成这一任务。 首先,我们需要理解搜索功能的基础:查询...

    Ruby-rubyinstall安装RubyJRubyRubiniusMagLevorMRuby

    在Ruby的世界里,管理不同的Ruby实现(如MRI、JRuby、Rubinius、MagLev和MRuby)是非常重要的,这有助于开发者根据项目需求选择最适合的运行时环境。`ruby-install`就是这样一个工具,它允许用户方便地安装和管理...

    Ruby-Http2HTTP2协议的纯Ruby实现

    Ruby-Http2是HTTP/2协议的一个纯Ruby实现,它为Ruby开发者提供了一种高效、安全的方式来处理HTTP通信。HTTP/2是HTTP协议的最新版本,相比于早期的HTTP/1.1,它引入了许多改进,旨在提高网络性能,降低延迟,并优化...

    Ruby-Scrum扑克游戏

    在Ruby中开发Scrum扑克游戏,首先需要理解游戏的基本规则。团队成员各自选择一张代表他们对任务工作量估计的卡片,然后公开展示。这种方式鼓励开放讨论,以便团队达成共识,而不是简单地平均各个成员的估计值。...

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby-Whois一个智能纯Ruby实现的WHOIS客户端与解析器

    Ruby-Whois是一个高效、灵活且完全用Ruby语言编写的WHOIS客户端和解析库。它设计用于查询域名、IP地址和其他WHOIS相关的记录,并能够处理各种服务器响应格式。这个库的强大之处在于它不仅可以发送WHOIS请求,还可以...

    Ruby自动化脚本实现网络拓扑映射

    标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于模拟鼠标移动和键盘输入,...

    Ruby游戏脚本(RGSS).zip

    Ruby游戏脚本(RGSS)是用于开发角色扮演游戏(RPG)的一种编程工具,它基于Ruby语言,并由日本公司Enterbrain为他们的RPG Maker系列软件所设计。RGSS(Ruby Game Scripting System)允许开发者通过编写Ruby代码来...

    用Python,Lua和Ruby语言设计游戏

    标题提到的"用Python, Lua 和 Ruby语言设计游戏",这三种动态语言各自拥有独特的优点,适用于不同的游戏开发场景。接下来,我们将深入探讨每种语言在游戏开发中的应用、特点以及它们如何协同工作。 **Lua** Lua 是...

    ruby-使用ruby实现的算法之冒泡排序.zip

    本资料包“ruby-使用ruby实现的算法之冒泡排序.zip”专注于讲解如何使用Ruby来实现经典的冒泡排序算法,这对于理解排序算法以及提升Ruby编程技能非常有帮助。 冒泡排序是一种基础且直观的排序算法,它通过重复遍历...

Global site tag (gtag.js) - Google Analytics