八数码游戏的Ruby实现

八数码(广搜+剪枝) 所谓八数码,就是类似上图的这种游戏。规则是给定你起始状态和终止状态,问最少要几步能从起始状态变换到终止状态。对于这道题,算法思想不难想,就是广搜,把一个棋局看成一个状态,每次移动产生新的状态,一个个遍历直至找到目标状态。如果直接这样做会出现Memory limited exceeded 这样就遇到了第一个问题——剪枝,对于空格(也就是我们可移动的地方)可以有四个方向移动(上下左右),但是当我们把空格移到某个地方之后,那么在这个新的地方又有一种选择是再移回原来的地方,这样就会多出许多不必要的步骤。所以我们需. 阅读详情

        八数码游戏就是通过移动空格把数字从给定的状态移动到目标状态,例如:

初始状态为        目标状态为
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()

python初学总结八数码小游戏 pycharm 编译的八数码小游戏 基本游戏功能 基本游戏功能利用python的基础知识或者C语言的基础知识能够把八数码中的九个数放进一个列表里面,然后实现移动以及生成随机数和随机移动的功能。但本人能力有限,试过多种方法也无法在不创建GUI的情况下实现键盘响应的移动。 GUI界面的布局 因为tkinter无法实现grid()和pack()的一起使用,综合考虑美观等因素,我选择利用grid()的布局... 阅读详情

相关推荐

Java实现的八数码游戏及其A*算法解法项目实战

八数码游戏,又称滑动拼图,是一种经典的智力游戏,包含一个3x3的方格,其中一个格子为空,其余八个格子分别填写1到8的数字。玩家通过滑动数字,目的是从初始状态达到目标状态,通常是以数字顺序排列的形式。Java集合框架为处理对象集合提供了一套丰富的接口和类。包括List、Set、Queue等接口,以及ArrayList、HashSet、LinkedList等实现类。这些集合可以用来存储和操作游戏中的不同数据,例如,使用List来记录游戏的历史状态,使用Set来存储已经访问过的状态等等。A。

weixin_35414260的博客 521

C语言版,八数码小游戏实现,简单好玩

C语言版,八数码小游戏实现,保证看懂,没有bug

AABond的博客 2358

EightDigit:八数码小游戏,跟拼图的原理一样。支持自动寻找结果

EightDigit Android game,which I wrote several days ago ,as a practice of Artificial Intelligence course. However , this is the first edition. I just publish it for a prectice of using GitHub Desktop For Windows. It is very cool!! 说人话: 《人工智能》这门课讲了启发式搜索,就根据书上的内容做了一个app游戏。 操作说明: 按音量键上,可以打乱布局 按菜单键,可以自动寻找结果 按音量键下,可以按照已找到的结果走一步 注意,如果自动寻找结果,在自动排好布局前,如果有干扰,则需重新寻找结果。否则,将会无视干扰,仍然按照寻找的路线走。 最终的结果会是: 1 2 3 8

启发式算法A实例——八数码游戏

启发式算法A实例——八数码游戏 令评价函数f(n)=d(n)+w(n), 其中 d(n):节点n在搜索图中的节点深度,对g(n)的度量; w(n):代表启发式函数h(n), 其值是节点n与目标状态节点ng相比较的代价,错位的棋牌个数(不考虑空格); 实现算法A搜索初始状态到目标状态的解路径。针对八数码游戏,采用任意一种编程语言实现算法A,本文选择的是相对较快的C++

weixin_53968839的博客 816

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1096

CTF全能工具箱ProV2:集成AI与94GB离线资源库,打造无网环境下的智能解题流水线

CTF全能工具箱ProV2是一款专为线下CTF比赛设计的All-in-One离线解决方案。它集成了94GB的庞大离线资源库,涵盖Web、逆向、Pwn等全方向工具链与知识库,并创新性地内置了本地AI大模型,可在断网环境下提供智能解题辅助,实现从信息收集到漏洞利用的智能流水线作业,极大提升比赛效率。

weixin_29240343的博客 422

八数码(A*算法)+单词接龙(DFS)

在一个 3×3 的网格中,1∼8 这 8 个数字和一个x恰好不重不漏地分布在这 3×3 的网格中。在游戏过程中,可以把x与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):把x与上下左右方向数字交换的行动记录为udlr。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。

2302_79372568的博客 975

中微8S6990外设开发实战:从GPIO配置到低功耗休眠的完整指南

本文提供了中微8S6990增强型8051单片机从GPIO配置到低功耗休眠的完整实战指南。详细讲解了开发环境搭建、GPIO灵活配置、定时器中断、ADC采样优化、PWM电机控制等核心外设的编程要点与避坑技巧,并重点阐述了实现超低功耗休眠的系统性外设管理策略,帮助开发者快速上手并优化产品续航。

weixin_29162439的博客 533

如何跑EgoSchema长视频问答评测?VideoChat2_HD_stage4_Mistral_7B_hf评测代码逐行精讲

VideoChat2_HD_stage4_Mistral_7B_hf 是开源的长视频理解模型(video-text-to-text 管线,Mistral-7B 底座),其官方仓库自带 EgoSchema 长视频问答评测代码。本文带你跑通 EgoSchema 评测全流程,并逐行精讲评测代码的每一步,帮你在单卡上复现长视频问答基准结果。 ## 🎯 评测任务与模型速览 **EgoSchema**

gitblog_00706的博客 426

Ansys Zemax | 利用OpticStudio实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证

本文详细介绍了如何利用Ansys Zemax的OpticStudio软件实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证。通过混合建模策略、相位面等效建模法、POP与FDTD联合验证等多种方法,帮助工程师快速解决跨尺度仿真难题,提升设计效率与精度。文章还分享了实战案例与高级技巧,适用于AR、医疗内窥镜等应用场景。

weixin_29268331的博客 499

武汉理工大学 python实验三

请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算笼中各有多少只鸡和兔(假设鸡和兔都正常,无残疾),如无解则输出`“Data Error!题目为:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?年前,《孙子算经》中记载一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有。编写一个宝塔上的琉璃灯的小程序,计算并输出每层各有多少盏琉璃灯。,如果有多个解,则分行输出,每行一个解;

2401_83472225的博客 5949

从华容道到A*算法:游戏AI中的路径搜索实战指南

本文以华容道等经典游戏为例,深入探讨了游戏AI中路径搜索算法的实战应用。文章系统性地介绍了从状态空间建模、盲目搜索(BFS、DFS、UCS)到启发式搜索(A*算法)的核心原理与代码实现,并提供了在现代游戏开发中处理动态障碍与群体移动的优化技巧和集成方案,为开发者构建智能寻路系统提供了完整指南。

resnet7explorer的博客 205

MicroPython ubluetooth 库详细介绍

MicroPython的ubluetooth库为蓝牙通信提供了强大的支持,使得开发者能够在MicroPython环境下轻松实现蓝牙设备之间的通信。其中ubluetooth库为MicroPython提供了强大的蓝牙通信功能,使得开发者能够轻松地在各种支持MicroPython的硬件平台上实现蓝牙设备之间的通信。它提供了一系列的函数和类,用于实现蓝牙设备的扫描、连接、数据传输等功能。- 上述代码中,首先创建了一个蓝牙服务和一个特征,然后可以通过read和write函数读取和写入特征值。# 处理连接成功事件。

m0_46311182的博客 1761

八数码问题

如下图所示,在节点1完成展开后,open表弹出最后一个节点4,节点4展开形成节点5、6,并将其加入到open表的尾部,接下来将会弹出最后一个节点6,节点6的子节点又会加入到open表的尾部,接下来继续弹出最后一个节点,这个节点则是节点6的子节点。我在代码中做了许多鲁棒性的操作,本来的想法是,将八数码问题很容易的扩展到十五数码问题,但是后来才想到,代码处理节点的方式是将其拉成一条字符串,这样以来,10以上的数字就没有办法表示了,因为他们占了两位字符,只能放弃了这个想法。但把代码中的鲁棒性操作都保留了下来。

qq_63708623的博客 5036

Linux 内核参数:meminfo

内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。本文要分析的节点meminfo是Linux 操作系统中查看系统内存最准确(meminfo 中有内存黑洞)的方法,它包含当前时刻系统的所有物理页面的信息。

私房菜 2413

【python数据处理】python实现vlookup字符串模糊匹配及在实战中的应用(FuzzyWuzzy库)

利用FuzzyWuzzy库匹配字符串1. 背景前言2. FuzzyWuzzy库介绍2.1 安装2.1 fuzz模块2.1.1 简单匹配(Ratio)2.1.2 非完全匹配(Partial Ratio)2.1.3 忽略顺序匹配(Token Sort Ratio)2.1.4 去重子集匹配(Token Set Ratio)2.2 process模块2.2.1 extract提取多条数据2.2.2 extractOne提取一条数据3. pandas实战应用3.1 公司名称字段模糊匹配3.1.1 参数讲解:3.1.2

lys_828的博客 8322

八数码(bfs做法)非常详细,适合新手服用

那么就需要用上面我们说的状态转换,先把一个字符串转换成3*3的矩阵,利用枚举当前x能移动的上下左右四个点,就可以做出变换,然后再变回字符串。此图来源于acwing题解中的一位大佬所画,由于每个边的权值是1(也就是距离),所以我们可以利用宽搜天生就带有性质,求出最短的路径。,哈希表去存储当前字符串下的距离值是多少,然后通过最终我们想要的字符串和变换中的字符串进行比较,最后输出距离。现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。在一个 3×3 的网格中,1∼8这 8 个数字和一个。

m0_67717626的博客 852

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++解决八数码问题

语言C++环境:Visual Studio 2019八数码问题是指这样一种游戏:将分别标有数字 1,2,3,…,8 的八块正方形数码牌任意地放在一块 3 * 3 的数码盘上。放牌时要求不能重叠。于是,在 3*3 的数码盘上出现了一个空格。现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则,将任意摆放的数码盘逐步摆成某种特殊的排列。八数码问题包括一个初始状态和目标状态,所谓解八数码问题就是在两个状态间寻找一系列可过渡状态。从一个状态出发,找到空位后有最多四种变换方式,一层一层创建树形结构。这个状态可以有

毕业作品网站 8614

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【人工智能】搜索技术(八数码 + 一字棋游戏)

一、八数码难题 1. 需求分析 2. 数据结构、功能模块设计与说明 2.1 算法设计思路 2.2 数据结构 3. 核心代码与测试结果说明 3.1 核心代码 3.2 测试结果 4. 心得体会 二、一字棋游戏 1. 需求分析 2. 数据结构、功能模块设计与说明 2.1 算法设计思路 2.2 数据结构 2.3 流程图 3. 核心代码与测试结果说明 3.1 核心代码 3.2 测试结果说明 4. 存在的问题与体会

布丁椰奶冻的博客 1818

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

八数码游戏(启发式搜索A*算法)

八数码难题 3×3九宫棋盘,放置数码为1 - 8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局。 求解的问题——给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布局到达目标布局 解答路径——就是一个合法的走步序列 用宽度优先搜索方法解决该问题: 为问题状态的表示建立数据结构:3×3的一个矩阵, * 矩阵元素S ij∈{0,1,…,8};

qq_33449790的博客 3777

吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏(8 puzzle)

如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将原图通过空格转换为前面八格为1--8,而最后一格为空。 以上的截图来自如下的一款android游戏(当然,由于版本的原因,样式换成了一种木板式的,更贴近于我们在现实...

weixin_30576859的博客 532

A*算法解决八数码问题

1 问题描述 1.1什么是八数码问题 八数码游戏包括一个33的棋盘,棋盘上摆放着8个数字的棋子,留下一个空位。与空位相邻的棋子可以滑动到空位中。游戏的目的是要达到一个特定的目标状态。标注的形式化如下:   1 2 3 4 5 6 7 8 1.2问题的搜索形式描述

我的新博客 7万+

八数码游戏分析+源码——启发式搜索(一)

八数码问题: 我想大家小时候一定玩过八数码的游戏,如下图:在一个九宫格里面放入8个数字,数字只能上下左右移动,并且只能移动到空白处。通过若干此移动后,能把数字移动成图1.1右方所示图案。     图1.1(左边为开始格局,右边为移动后最终格局)   下图是图1.1下一

深海蓝的技术随笔 3万+

一言不合敲代码(2)——八数码问题游戏

一言不合敲代码第二期~ 在工作室暑期集训结束,回家的路上。 长春到北京的动车,将近七个小时,忘记拷电影了。。。手机里也没有游戏。。。 无聊至极了,就自己写了个游戏。。。 用HTML+SASS+JS实现八数码问题的小游戏~ 直接贴上代码: (文件目录) HTML: <!DOCTYPE html> <html> <head> &lt...

weixin_30687051的博客 522

八数码算法研究(转载)

1.4课程设计实验环境 Microsoft Visual C++ 6.0 2问题描述及讨论 程序设计中,需要解决很多问题,除了编写程序过程中的问题,更重要的是算法设计过程中的问题。 2.1问题描述 在3x3的九宫格棋盘上,摆有8 个将牌,每个将牌都刻有1—8中的某个数码。棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改编将牌的布局。这种游戏求解的问题是:

huahuahua12的专栏 1110
上一篇: [BlackBox项目]Moodle用户分析
下一篇: 八数码游戏的Ruby实现
dingx
博客等级 码龄24年 67粉丝 112原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值