本页目录

Irmingard 纸牌接龙(Backbone Marionette 网页卡牌游戏)

irmingard-backbone · gamebytes/irmingard-backbone

基于 Backbone Marionette 与 CoffeeScript 实现的单人纸牌接龙游戏。使用两副牌共 104 张(四花色,A 到 K,无大小王),开局按 1、2、3、4、5、4、3、2、1 张铺成列,目标是把全部牌按花色与点数升序移到 8 个弃牌堆。支持拖拽叠牌、双...

益智解谜 卡牌 休闲 无明确引擎 C 游戏状态管理 动画系统 UI 系统 中级
★ Stars 7 Forks 5 License 未明确 更新 2025-04-14

国内开发环境适配

Windows
未知
Linux
未知
macOS
未知
引擎 / 框架:无明确引擎 暂无中文教程标记 未标记站长实测
项目基于 Rails 3.2.8 与 Ruby 旧版本生态,国内搭建需注意 gem 源与旧依赖的可获取性;README 未给出具体安装步骤,待核验。

中文项目介绍

Irmingard 是一款以「清空牌桌」为目标的单人纸牌接龙(patience)游戏,使用 Backbone Marionette 与 CoffeeScript 构建,运行在浏览器中。作者在 README 中坦言,目前只支持单人模式,但他希望能和姐姐同时游玩——这也成为后续「协作模式」设想的起点。

与常见的 52 张纸牌接龙不同,Irmingard 使用两副牌共 104 张:四种花色(♠、♣、♦、♥),点数从 A、2、3 一直到 Q、K,不含大小王。游戏的核心目标是把所有牌按花色与点数升序(A 在前)送入弃牌堆。

项目最初是作者在 2012 年 11 月 CologneJS 演讲《Solitaire mit Backbone》的配套演示,因此它既是一个可玩的卡牌游戏,也是一份围绕 Backbone 生态组织前端代码的实践样本。

玩法指南

README 给出了简明的规则说明:

  • 开局时牌桌由 9 列组成,从左到右分别铺 1、2、3、4、5、4、3、2、1 张牌;每列只有最下方一张是明牌且可移动,其余均为背面朝上、被压住的牌。
  • 叠牌规则:点数较小的牌可以放到点数大 1 且颜色不同的牌下方。例如红桃 7 可以放到黑桃 8 或梅花 8 之下。
  • 拖拽操作:悬停时,可拖动的牌会以绿色标记;拖动过程中,可放置的目标会以黄色标记。
  • 双击一张牌,可将其直接送入弃牌堆。
  • 点击右上角的「Hit me」按钮,可以从牌堆补入新的明牌,直到清空牌桌或用尽可行动作。
  • 弃牌堆共有 8 个(每种花色 2 个),因此游戏中共有 8 张 A,每张各有一个重复副本;每个弃牌堆的第一张必须是 A。
  • 当牌桌上的某一列被清空时,只有 K 可以放入该空列。
  • 弃牌堆顶部的牌可以被拖回牌桌——README 特别提醒,这在游戏后期非常实用。

技术架构分析

技术要点

README 的 Technologies 一节列出了完整的技术栈:

  • HTML5 拖放 API(作者参考了 HTML5 Rocks 的拖放基础教程)
  • Backbone.js 与 Backbone Marionette(视图与组合式 UI 组织)
  • Backbone Relational(处理牌与列之间的关联关系)
  • CoffeeScript 作为主要开发语言
  • HAML Coffee Templates 作为模板方案
  • Gon gem 向 JavaScript 传递数据
  • Rails 3.2.8 作为后端与资源管线
  • jQuery Pinkify
  • 测试计划使用 Jasmine + Jasminerice + Guard Jasmine(PhantomJS)

README 的「Problems」一节记录了一个具体的回调时序问题:卡牌的 render 方法中无法直接设置可拖拽状态,因为渲染时 Backbone Relational 尚未更新该牌所属的 Column。作者观察到,Cards Collection 的 add 回调触发时,牌的 column 仍是旧值 4;直到 Column Model 的 handleAdd 回调执行,column 才更新为 0。作者提出的改进思路是:不在渲染时决定可拖拽性,而是在 Column.handleAdd 中更新,并让 CardView 绑定可拖拽性的变化来设置对应 HTML 属性,从而避免重复渲染。

补充说明

代码结构与对象模型

README 用「Objects」一节拆解了游戏中的四类核心对象,这也是理解代码组织的入口:

  • Stack(牌堆):洗牌后扣在手中的牌,只能看到牌背。当前实现中牌堆本身并未在界面上显示。
  • Pile(弃牌堆):所有牌最终按 A、2、3……Q、K 的顺序落入的位置,共 8 个,每种花色 2 个。
  • Column(列):牌桌上的 9 列,开局按 1、2、3、4、5、4、3、2、1 张填充,只有每列最后一张是明牌且可移动。
  • Card(牌):共 104 张,由 2 副牌组成,每副包含 4 种花色,点数取 1(A)到 13(K)。

测试与开发

README 给出了 Jasmine 规格的运行方式:

  • 浏览器内:执行 rails s,然后打开 localhost:3000/jasmine。
  • 无头模式:执行 guard-jasmine spec。

需要注意,README 在技术栈中写的是「tests are in the making」,即测试当时仍在编写中,因此不能把测试覆盖视为已完成的能力。

计划中的功能

README 的 Planned features 一节列出了作者当时尚未实现的方向:

  • 增加结束动画或图片
  • 编写 Jasmine 规格
  • 改进 UI
  • 保存游戏状态
  • 协作模式:由服务端校验走子,并通过 WebSocket 实时同步,作者倾向于使用 FAYE

这些均属于计划,而非现有功能。

学习建议

这个项目适合作为「用 Backbone 生态组织一个完整前端小游戏」的阅读材料:可以重点看 Card、Column、Pile 三类对象如何通过 Backbone Relational 建立关联,以及拖放事件如何与视图状态联动。阅读时建议结合 README 中记录的 Callback Flow 问题,理解渲染时序与模型关联更新之间的先后关系;同时留意测试部分仍处于编写中的状态,不要预设已有完整测试覆盖。

开源许可证与版权说明

许可证标识:未明确。源码、资源与依赖许可可能不同,请以官方仓库为准。本站仅做索引,不托管源码。

相似项目