zoukankan      html  css  js  c++  java
  • 正在编写推箱子游戏的自动求解程序

    网上搜索了一下,有好多人现成的产品,不少国产的。编写这个程序只是为了回忆一下算法。不能丢了。
    自动求解有俩种方案:一个是求最小行走步骤,一个是求最小推箱子数目。
    第一种算法简单些,只要将小人推动的四个方向进行广度优先搜索,通过各种砍掉各种不对的情况来减少搜索数量,但搜索的数量仍然非常巨大。
    以下情况可砍掉:
    1、前方是墙;
    2、前方是箱子,但箱子的前方是墙或者箱子;
    3、行动方向和上一步骤的方向是反方向,且上一步没有推箱子;
    4、如果小人移动造成推动箱子,那么检查移动后形成的棋盘:
        4.1 、以 被推动的棋子 为中心,有没有出现以下死棋。
    ■■□   □■■    □□□   □□□
    □   □■    ■□   □
    □□□   □□□    ■■□   □■■

    ■ 表示这个位置可能是墙或者箱子;
    表示“被推动的棋子”在推动后所在的位置;
    □ 仅为方便理解图片,无任何其他意义。 

                  如果出现上面的情况,就是死棋。
         4.2、比较移动后的步骤和之前的步骤是否出项相同的棋局。

    注:这里所指“前方”是指行走方向的前方。

    第二种方案是求最小推箱数,这个算法上复杂一些,
    以小人为起点,做“油漆桶”处理,什么叫“油漆桶”处理呢,看看画笔软件中使用“油漆桶”功能,他可以渗透所有空白的地方。通过此功能,找到所有可以“接触”到的箱子,对所有这些箱子推动,广度优先算法形成搜索树。然后和第一种方案基本相似的方式砍掉多余的树枝。

    这个方案我还没有实施,所以还没有想的很具体,先实现第一个在说。
    希望有兴趣的朋友可以给意见,告诉我还有那些死棋可以判断。
  • 相关阅读:
    关于MOTO E2
    Visual Studio 2008 SDK 1.1 Beta 发布
    开始了新的工作
    C# 2.0 的"语法多义性"
    最近画的框架草图
    SQL数据库向ORACLE迁移注意事项
    C#中很多新的特性,提供了更好的“即兴编程”的能力。
    看了点lua相关的东西,有点想法不知能否实现?先记下来慢慢思考。
    读《企业应用架框模式》
    porting cinvoke1.0 to E2 (armlinux)
  • 原文地址:https://www.cnblogs.com/tansm/p/166490.html
Copyright © 2011-2022 走看看