【问题标题】:Pure Java text interface for a roguelike gameroguelike 游戏的纯 Java 文本界面
【发布时间】:2026-01-19 04:05:03
【问题描述】:

好的,这听起来像是一个疯狂的想法 - 但我有兴趣在纯 Java 中模拟 1980 年代风格的 roguelike game 文本界面,即使用 Swing 或类似的。

这大概是它需要做的事情:

  • 提供固定大小字符的固定大小网格作为“屏幕”(例如 100*75)
  • 使用适当的等宽字体,最好有很多有趣的符号
  • 允许单独为每个字符位置设置前景色和背景色
  • 允许在屏幕的任何位置打印字符串或单个字符(这应覆盖这些位置的屏幕缓冲区中已有的内容)

有人知道可以实现这一点的现有解决方案吗?还是我坚持从头开始一起破解?

附言我想要纯 Java 的原因是它可以在沙盒小程序中运行。所以像jcurses这样的JNI解决方案很遗憾被排除在外了.....

【问题讨论】:

  • 我记得我第一次玩 Angband 的时候,那是很久以前,人们甚至都没有看着我,好像我疯了一样。 :)

标签: java swing roguelike


【解决方案1】:

提供固定大小的固定网格 大小字符作为“屏幕”(例如 100*75)

string[] screen = new string[75],然后每一个都填上 100 个空格 :)。

使用适当的等宽字体, 理想情况下有很多有趣的 符号

请参阅此链接以获取一些好的链接:http://cg.scs.carleton.ca/~luc/mono.html

允许设置前景和 每个背景字符颜色 单独的字符位置

您可以使用允许呈现 HTML 的控件(如 JEditorPane)来获得这些文本效果。这样您就可以将特殊关键字定义为“特殊关键字”。 (好吧,这有点过时,但应该适合您的情况。如果您将“游戏状态”存储为普通字符串(数组),但在输出之前呈现 html,这将是最简单的。

允许打印字符串或 任何地方的单个字符 屏幕(应该覆盖 任何已经在屏幕上的东西 在这些位置缓冲)

如果您在上一个问题中遵循我的建议,而不是将游戏状态作为普通字符串数组,那么您只需找到您的行的字符串,找到 use string.substring(length) + "A" + string.substring( startindex: 长度 + 2, string.length - (length + 2));来构建你的新游戏状态。

【讨论】:

    【解决方案2】:

    我最终实现了一个简单的 Swing 控制台,灵感来自这里的许多答案(谢谢大家!)

    有兴趣的可以看这里:

    Swing based Java text console

    【讨论】:

    【解决方案3】:

    一点也不疯狂,这是我在 Legerdemain 中实现的方法:http://roguelikefiction.com

    我使用了一个二维字符数组 (char[][]) 和对应的 java.awt.Color[][] 对象数组来跟踪颜色。您可以将这些数组推入一个继承自 JPanel(它又是 JFrame 的一部分)的类中,并在面板的 paintComponent() 回调中完成所有绘图。

    Curses/JNI 方法也没有什么问题,尽管如果你走 Swing 路线,你会得到各种很棒的 Unicode 字形。 Legerdemain 使用了五六百个。

    【讨论】:

    【解决方案4】:

    既然您正在谈论基于流氓和角色的界面,以便完成对过去的旅行,那么您为什么不使用 Google 搜索 Curses C 实现并使用 JNI 进行查看。您的模型和控制器是普通的 Java。几乎每个平台都有一个Curses 实现。

    【讨论】:

    • 是的,这是我的第一个想法,但我希望它能够在非特权沙箱中运行它......因此 JNI 将无法工作:-(
    【解决方案5】:

    对于此类项目,我发现严格分离游戏模型和视图至关重要。这个简单的example 暗示了整体架构,而这个更复杂的game 扩展了这个概念。好处是视图可以独立于游戏本身演变,而不关心收听视图的样子。

    对于符号,Unicode 字形可能是一个吸引人的选项,正如example 中所建议的那样。

    【讨论】:

      【解决方案6】:

      我曾经(几年前)开始编写类似这样的代码(Swing 中的终端实现)。 我已经到了可以显示带有 ANSI 转义序列的文本以用于光标移动和颜色的地步,但没有实现任何输入。如果你有兴趣,我会挖掘出来。

      【讨论】:

      • 两个赞成票(谢谢),但没有评论说我应该挖掘?好的,所以这将留在我的硬盘深处...