華容道程式求解

来源:https://www.cnblogs.com/lzhlyle/archive/2019/08/23/klotski.html
-Advertisement-
Play Games

中國經典棋盤游戲 華容道,求解最小步數。利用面向對象的分析方法,拆解問題域使其各自可獨立擴展。項目分期計劃:一、實現對橫刀立馬佈局的求解,導出步驟快照。二、實現對標準華容道滑塊(卒、五虎上將、曹操)任意佈局的求解。三、實現對任意自定義滑塊、自定義棋盤的求解。 ...


華容道 游戲介紹:百度百科

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個單位,尤其關註是否被占用著——空著的格子附近的滑塊才可移動,儘快找到可移動的滑塊,可使用原型模式創建。
    • 滑塊位置 BlockPlace,定義滑塊與格子此刻的關係。
    • 擴展:棋盤形狀可更大(當然滑塊也可更多),甚至十字形、大環形等特殊形狀擴展(第三期支持)。雙層棋盤、立方體棋盤、某邊(或立方體的某面)有引力的棋盤、棋盤還可動態增加或減少格子等棋盤域自己的變化與能力,都可就此擴展。
  • 移動域 move:解決行動力問題
    • 介面 IMovable 表示一種能力,抽象滑塊都有此能力,故 Block implements IMovable
    • 移動方向 MoveDirection,只有上下左右四個方向。看到github上不少華容道項目的方向還有 左上、右下等拐彎方向定義——我想是因為華容道算步數的時候,1x1的卒一次性移動拐彎方向的兩個格子時,算作一步的原因——但這其實是計步器中關於移動的規則(涉及計步域、規則域),假設卒移動一個格子就算一步,或者棋盤擴展後支持三個空格可移動時,就會有左上右等兩個拐點的移動方式時,增加枚舉就不靈活了,故本質上還是計步器與移動規則的職責。
    • 擴展:行動力可以有條件(某些滑塊挨在一起則增加/減少行動力),立體棋盤可向縱軸z方向移動等等。
  • 開局域 opening:// TODO
  • 游戲域 game:
  • 規則域 regulation:
  • 計步域 pedometer:
  • 攻略域 quide:
  • 解題域 slover:
  • ValueObject:
    • 位置坐標 Position,定義格子所在坐標,(x, y) 表示,棋盤左下角為(0, 0)——都位於第一象限,最大(4, 5),可使用原型模式創建。
    • 快照 Snapshot,
    • 歷時 Duration,

關鍵類圖

持續更新中...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文將介紹微服務架構和相關的組件,介紹他們是什麼以及為什麼要使用微服務架構和這些組件。本文側重於簡明地表達微服務架構的全局圖景,因此不會涉及具體如何使用組件等細節。 為了防止不提供原網址的轉載,特在這裡加上原文鏈接: "https://www.cnblogs.com/skabyy/p/1139657 ...
  • 代碼參考:https://github.com/HCJ shadow/Zuul Gateway Cluster Nginx Zuul的路由轉發功能 前期準備 搭建Eureka服務註冊中心 服務提供者msc provider 5001【提供一個hello請求做測試】 創建gateway 7001 p ...
  • 一、複習 1.標識符(自己定義的,下劃線、美元符號) 2.駝峰命名(變數名,方法名首字母小寫) 3.關鍵字(就是固定的那幾個) 4.字面值(數據、有類型、八種基本類型從小到大,byte\char=short\int\long\float\double\boolean 5.成員變數(初始化在方法外且不 ...
  • 23:59 2019/8/23 成員變數: 對象的成員變數,或者普通成員變數; 類的成員變數,或者靜態成員變數 下麵是source code和.class->.java(反編譯後)的source code ...
  • 功能需求:在前端頁面中,for迴圈id會構不成連續的順序號,所以要找到一種偽列的方式來根據數據量定義序號 因此就用到了在前端頁面中的一個欄位 forloop.counter,完美解決 ...
  • 集合系列(一):集合框架概述 Java 集合是 Java API 用得最頻繁的一類,掌握 Java 集合的原理以及繼承結構非常有必要。總的來說,Java 容器可以劃分為 4 個部分: List 集合 Set 集合 Queue 集合 Map 集合 除了上面 4 種集合之外,還有一個專門的工具類: 工具 ...
  • 正則表達式: 它是字元串的一種匹配模式,用來處理字元串,可以極大地減輕處理一些複雜字元串的代碼量 字元組:它是在同一位置可能出現的各種字元組成了一個字元組,用[]表示,但是它的結果只能是一個數字或者一個大寫字母或小寫字母等 下麵測試以該網站為例http://tool.chinaz.com/regex ...
  • linearList.h linearList.c index.c ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...