Cubiq
engineering.md實作

實作

Cubiq 內部

每次轉動魔方,背後都有一套自行實作的系統:數學模型、3D 引擎,以及考慮課程目標的求解器。Android 應用程式使用 Kotlin 和 Jetpack Compose 編寫。

專案快照

原始檔與文字資源行
740 244
應用程式模組
39
測試目錄之外的 Kotlin 實體行
136 019
語言變體
42
測試宣告test* / androidTest* · @Test
1 624

stack.kt

現代 Android 技術堆疊

專案快照
Kotlin2.4.21
Compose BOM2026.09.00
Material 31.5.0-beta01
Adaptive1.3.0
Navigation 31.2.0
AGP9.4.1
KSP2.3.12
Gradle9.7.0
  • Kotlin
  • Jetpack Compose
  • Material 3
  • Adaptive
  • Navigation 3

Jetpack Compose 和 Material 3 定義介面元件與主題。Adaptive 根據視窗大小安排版面,Navigation 3 負責導覽與畫面還原。狀態透過 Coroutines 和 Flow 傳遞,Hilt 連接應用程式模組。

architecture.kt

獨立的應用程式層

app01Hilt / DI
feature07Compose / ViewModel
  • onboarding
  • learning
  • lesson
  • practice
  • progress
  • settings
  • events
domain07contracts / use cases
  • learning
  • lesson
  • practice
  • portability
  • progress
  • settings
  • events
data09repositories / storage
  • content
  • storage
  • learning
  • lesson
  • practice
  • portability
  • progress
  • settings
  • events
core14UI kit / cube / solver
  • common
  • model
  • designsystem
  • uikit
  • navigation
  • analytics
  • crashlytics
  • ads
  • billing
  • push
  • hardware
  • cube
  • scrambleimage
  • solver
baselineprofile01startup / frame timing

feature → domain ← data

modulesΣ 39
  • app1
  • baselineprofile1
  • core14
  • data9
  • domain7
  • feature7
Kotlin · physical LOCΣ 136 019
feature
82 86360.9%
core
21 16715.6%
data
14 34110.5%
app
9 5147.0%
domain
6 7595.0%
buildSrc
9610.7%
baselineprofile
4140.3%

介面、領域契約和資料分屬不同模組,Hilt 連接各項實作。Compose 接收不可變狀態和明確事件。Room 儲存歷史與學習進度,DataStore 儲存設定,Navigation 3 還原各部分的導覽堆疊。

  • Coroutines / Flow
  • Hilt
  • Room
  • DataStore

android-ux.md

參考 Android 建議的 UX

Cubiq 實作了 Google 在 Apps Experience Program 中強調的做法:Compose、自適應版面和 edge-to-edge。

根據視窗大小配置
寬螢幕上,理論與練習並排顯示。緊湊螢幕上,內容和導覽配合可用空間;版面由視窗大小決定。
原生導覽
Edge-to-edge 考慮系統列和鍵盤。Navigation 3 保留各部分的導覽堆疊,並支援 Predictive Back,預覽返回時的轉場。
可讀性與無障礙使用
淺色與深色主題、文字縮放及導覽中的語意標籤,有助於使用 TalkBack 和鍵盤操作應用程式。字型較大時,各部分的名稱仍可供螢幕閱讀器讀取。
Google 建議 · Apps Experience Program
OpenGL ES 3.0

engine.glsl

遵循數學模型的幾何結構

moving cubies
26
facelets
54
meshes
8
triangles
2 964

GLSL 著色器計算 PBR 材質、粗糙度和環境光照。模型與動畫保持同步:返回上一步時套用反向轉動,攝影機則考慮面板之間的可用空間。

  • OpenGL ES 3.0
  • GLSL
  • PBR
  • Instancing

魔方狀態 / 公式播放

有型別的記法轉換為轉動與一致的魔方狀態。算繪器佇列為層轉動產生動畫,並保留塊與面片的身分。公式按實際轉動序列播放,支援播放、暫停和速度調整。

  1. Notation
  2. Cube state
  3. Move queue
  4. OpenGL ES 3.0

前進一步為新轉動產生動畫,後退一步套用反向轉動。跳轉還原基礎場景和目標序列。取消會停止發出後續轉動,已經開始的轉動仍會完成。EGL 生命週期處理 pause/release;GL 無法使用時,仍保留無需 3D 的學習路徑。

solver.kt

依照課程目標求解

  • BFS
  • Beam search
  • F2L

自行實作的求解器利用目前課程的公式與輔助轉動建立解法。SolverRequest 包含魔方狀態、目標塊、鎖定目標、允許的公式、情況和方向。規劃器遵守學習目標順序,並保護已還原的塊。

分階段規劃使用有界 BFS、束搜尋和 F2L 情況辨識。驗證檢查塊的組成、翻轉、扭轉和置換奇偶性。搜尋策略限制深度和束寬。切換課程會取消搜尋,阻止過期結果生效。

結果是 PracticePlan,包含步驟、公式參照、顯示時間軸和執行時間軸。說明保留教學方向,引擎接收完整執行序列。結果類型為 plan / solved / invalid input / no constrained path。

  1. 魔方狀態
  2. 模型驗證
  3. 學習計畫
  4. 3D 練習

content.md

內容經過建置檢查

理論儲存在 756 份 Markdown 文件中,練習由 336 個在地化情境定義。Gradle 驗證翻譯結構及對 316 幅原創插圖的參照。圖形使用 Blender/Cycles 製作;Android 引擎另用程序化幾何結構。

workflow.md

文件即程式碼 / 代理工作流程

AGENTS.md
48
README.md
16

儲存庫依代理開發需求組織:AGENTS.md 層級規定歸屬、架構限制和驗證關卡;README.md 描述模組契約,KDoc 描述 API 和不變量。

架構、設計和在地化契約與程式碼一同進行版本管理。PLAN.md 記錄範圍和交接;契約變更同步更新負責該契約的文件。檢查與產生作業透過 Gradle 執行,CI 建置兩個應用程式商店版本。

physical text linesΣ 740 244
Resources / localization
399 56854.0%
Kotlin · non-test
136 01918.4%
Lesson Markdown
132 64217.9%
Kotlin · JVM tests
46 6456.3%
Kotlin · Android tests
13 6361.8%
Build tooling / web
8 9851.2%
Documentation
2 7490.4%
品質與統計方法

測試涵蓋不可能的魔方狀態、已還原層的保持、學習計畫、過期請求取消、工作階段還原和資料匯入。CI 建置兩個應用程式商店版本;發布檢查包括 R8、APK/AAB、檢查碼,以及原生程式庫針對 16 KB 頁面大小的對齊。

Kotlin 規模按實體行統計,包含註解、空行、buildSrc 和效能基準測試程式碼,排除測試目錄。測試數量指 1 343 項 JVM 宣告和 281 項 Android 宣告,而非執行次數。文件包含備援文字;存在情境並不代表每節課都有練習。

baselineprofile · @Test
3

總文字量按受追蹤 UTF-8 檔案的實體行統計,涵蓋原始檔、測試、XML/JSON 資源、Markdown 內容、在地化、文件、建置工具和 Web 原始碼。包含註解、空行和各語言副本;排除媒體、產生的檔案與建置輸出、供應商程式碼、服務設定和臨時 PLAN.md。這是專案文字輸入的規模,並非可執行 LOC。

認識 Cubiq