华容道程序求解

华容道 游戏介绍:百度百科

github: lzhlyle/klotski

项目分期计划:

  1. 实现对横刀立马布局的求解,导出步骤快照
  2. 实现对标准华容道滑块(卒、五虎上将、曹操)任意布局的求解
  3. 实现对任意自定义滑块、自定义棋盘的求解

技术路线:Spring Boot,JUnit


关键类与扩展思路

拆解问题域

阅读建议:新页面打开关键类图,比对下列问题域

  • 滑块域 block:解决滑块形状问题

    • 抽象滑块 Block(Abstract) ,所有滑块父类。
    • 具体滑块:2x2大方块 Square(曹操),1x2水平条形块 Horizontal、2x1垂直条形块 Vertical(五虎上将),1x1小方块 Cube(卒)。
    • 扩展:任意形状滑块都可在此域扩展。如3x3, 2x3 等长方形块可直接扩展,如L字形、T字形等特殊块也可在Block下扩展(第三期支持)。3D立体的滑块也可从此扩展,穿透型滑块也可以,隔离出滑块域就为了独立关注滑块问题。
  • 棋盘域 board:解决棋盘形状问题
    • 棋盘 Board,定义棋盘格数,棋盘形状,默认4x5方形,不包括开局摆放——这是攻略域中快照的任务——毕竟没有"游戏","摆放"将毫无意义。
    • 格子 Cell,定义每个格子,都占1个单位,尤其关注是否被占用着——空着的格子附近的滑块才可移动,尽快找到可移动的滑块,可使用原型模式创建。
    • 位置坐标 Position,定义格子所在坐标,(x, y) 表示,棋盘左下角为(0, 0)——都位于第一象限,最大(4, 5),可使用原型模式创建。
    • 扩展:棋盘形状可更大(当然滑块也可更多),甚至十字形、大环形等特殊形状扩展(第三期支持)。双层棋盘、立方体棋盘、某边(或立方体的某面)有引力的棋盘、棋盘还可动态增加或减少格子等棋盘域自己的变化与能力,都可就此扩展。
  • 移动域 move:解决行动力问题
    • 接口 IMovable 表示一种能力,抽象滑块都有此能力,故 Block implements IMovable
    • 移动方向 MoveDirection,只有上下左右四个方向。看到github上不少华容道项目的方向还有 左上、右下等拐弯方向定义——我想是因为华容道算步数的时候,1x1的卒一次性移动拐弯方向的两个格子时,算作一步的原因——但这其实是计步器中关于移动的规则(涉及计步域、规则域),假设卒移动一个格子就算一步,或者棋盘扩展后支持三个空格可移动时,就会有左上右等两个拐点的移动方式时,增加枚举就不灵活了,故本质上还是计步器与移动规则的职责。
    • 扩展:行动力可以有条件(某些滑块挨在一起则增加/减少行动力),立体棋盘可向纵轴z方向移动等等。
  • 游戏域 game: // TODO
  • 规则域 regulation:
  • 计步域 pedometer:
  • 攻略域 quide:
  • 解题域 slover:

关键类图

持续更新中...

原文地址:https://www.cnblogs.com/lzhlyle/p/klotski.html

时间: 2024-11-05 14:37:42

华容道程序求解的相关文章

编写程序求解: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?打印出来?

#include<stdio.h> int main() { int i,j,k; int count=0; for(i=1;i<5;i++) { for(j=1;j<5;j++) { for(k=1;k<5;k++) { if(i!=j&&j!=k&&i!=k) { printf("%d%d%d ",i,j,k); count++; if(count%5==0) { printf("\n"); } }

C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来

#include <stdio.h> int main() {  int i=1;  int j=1;  int k=1;  int count=0;  for(i=1;i<=4;i++)  {    for(j=1;j<=4;j++)    {     for(k=1;k<=4;k++)     {      if((i!=j)&&(i!=k)&&(j!=k))       printf("%d%d%d\n",i,j,k)

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

算法荐书(程序员练功+大众科普)

图灵小编[好久没有在博客中活动了~小编积攒了好多好的书讯迫不及待的要向大家推荐,现在就从算法图书开始吧~其实图灵的算法书不多,但是各有特色,深受读者欢迎,今天就说8本,加1本外卖~] 入门第一书,你一定能看懂 没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法.你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜 游戏,在轻松愉悦中便掌握算法精髓,感受算法之美. 本书中涉及的数据结构有栈.队列.链表.树.并查集.堆和图等:涉及的算法有排序.枚举. 深度

[转]100个经典C语言程序(益智类问题)

目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事犯 13.该存多少钱 14.怎样存钱利最大 15.捕鱼和分鱼 16.出售金鱼 1.7 分数四则运算 17.平分七筐鱼 18.有限5位数 19. 8 除不尽的数 21.4位反序数 22.求车速 23.阿姆斯特朗数 24.完全数 26.亲密数 27.自守数 28.回文数 29.求具有abcd=(ab+c

[转]100个经典C语言程序

本文转载自:http://blog.sina.com.cn/s/articlelist_1615065844_0_1.html 1.绘制余弦曲线 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线*问题分析与算法设计如果在程序中使用数组,这个问题十分简单.但若规定不能使用数组,问题就变得不容易了. 关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行. 为了获得本文要求的图形就必须在一行

小游戏 Lights Out (关灯) 的求解 —— 异或方程组

Author : Evensgn  Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/JoeFan/p/4338003.html   游戏介绍 Lights Out (关灯)是一款据说在20世纪90年代就已经被设计出的小游戏,游戏的玩法十分简单. 首先,给定一个 n 行 m 列的矩形方格阵,每个格子上都有一盏灯. 初始时,有些灯是开着的,有些灯是关着的. 玩家每次进行一次操作,选中一盏

《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)

曾攀老师的<有限元分析基础教程>第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解.但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如已经知道了杆单元的起点和终点坐标,仍然需要另外给出单元局部坐标与整体坐标的夹角,这完全没必要.于是我就用Python重构了这段程序,当然并不是把书中的MATLAB代码翻译成python(事实上完全可以这么干,而且很快!).比如我使用了面向对象的思想,把杆单元写成了一个类,这样思路比较清晰. #! /usr/b

100个经典C语言程序(益智类)

100个经典C语言程序(益智类) [1.绘制余弦曲线] 在屏幕上用"*"显示0~360度的余弦函数cos(x)曲线 [问题分析与算法设计] 利用cos(x)的左右对称性,将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就 应为62-m.程序中利用反余弦函数acos计算坐标(x,y)的对应关系. #include<st