【问题标题】:Self-Project: Creating a Chess Game with GUI [closed]自我项目:使用 GUI 创建国际象棋游戏 [关闭]
【发布时间】:2012-08-02 22:36:23
【问题描述】:

我是一名经验有限的新程序员,希望在此基础上进行扩展。这是我将在校外尝试的第一个项目,所以我的资源波动很大,因为我根本不知道我需要知道什么。但是,我对使用 Java 的基本 GUI 有一些小的基础。

我想创建一个国际象棋游戏,然后实现一个 AI。然而,目前我只是在构建游戏本身。现在,我想要一个简单的 GUI 框架,它不必看起来漂亮或复杂。只需显示棋盘,棋子在哪里,点击一个棋子,它会突出显示你可以去的地方,然后点击方块,瞧,移动完成。

这是我在 GUI 界面设计中的主要问题。它是否与逻辑部分分开?换句话说,如果我创建了一个 Piece,我是否需要一个 .jpg 或其他东西,或者我是否可以有一个单独的类,如果这个正方形中有一个棋子,则在这些坐标中显示一个棋子图片。构建 GUI 我需要知道什么?我主要使用 Google 来环顾四周,但如果有一个起点,我将不胜感激,同时了解是否可以继续在棋盘上工作,同时以不同的速度处理 GUI 部分。

在此先感谢,如果我提出的任何问题都是现成的信息,我很抱歉。可能我已经接触过它,但没有认识到它对我想做的事情的重要性。

再次感谢:)


我会为任何感兴趣的人更新此内容。我对我将要做的事情有了更好的形式,并且在我的脑海中有这个结构并在纸上翻译。现在,为了简单起见,一切都将使用 Java。

不管怎样,很抱歉发了这么长的帖子。没有人必须阅读此内容。 :)

我会尝试使用 MVC 格式,尽管它可能会让我有些困惑。

模型-我将创建一个拼板[8][8]。 Piece 将是一个抽象类,由坐标和我现在调用的抽象方法 canMove(x,y) 组成。我最初也有 move(x,y) 但我意识到这些碎片不会移动。因此,我坚持使用 canMove 方法,让控制器查看 Piece 是否确实可以执行该操作。

控制器-在这里我将创建板并设置所有部分。我认为这将是最大的课程,因为它将几乎规范一切。

View- 这基本上是 GUI。

这就是我认为控制器/视图协调应该如何工作的方式。

  1. 控制器中会有一个变量叫做hand。当我第一次点击一块时,它会检查它是否是黑色/白色,这是一块本身的参数。如果它是正确的颜色,它被分配到手。然后它将检查双精度数组中的每个正方形。如果 canMove() 为真,则在视图中突出显示该方块。然后第二次单击将检查 canMove()。如果为真,检查它是否被相同颜色的一块占据,如果不是,则移动到那里。如果是假的,什么都没有。如果你点击手,手就会变成空的。对我来说,问题在于视图如何与控制器交互。以后会想办法的。

  2. 在每一步结束时,检查每一个棋子的 canMove() 看国王是否在里面。如果是这样,请检查。对于将死,我想我会有一个完整的方法来标记国王周围的方块,看看它们是否都被标记了,包括他所在的那个。

所以我有几件事我也意识到我没有考虑到我必须弄清楚的事情。典当捕获和典当移动将非常具体。铸造。应用 canMove 时,必须没有任何障碍物,以防出现某些碎片。

构建视图会很痛苦,因为我的课程都没有教给我任何关于它的知识。我想,我会坚持到最后。我不知道我会如何在没有视图的情况下进行测试,但可能不会持久。

【问题讨论】:

  • 查看 Oracle 的 Swing 教程。

标签: java user-interface chess


【解决方案1】:

这是我在 GUI 界面设计中的主要问题。它是独立于逻辑部分完成的吗?

当然,是的。

国际象棋引擎和用户界面实际上是两个完全不同的程序,在不同的进程中运行是很常见的。

国际象棋引擎通常针对速度进行了优化,并且通常使用 C 或 C++ 编写(但如果您愿意,也可以使用 Java)。 GUI 通常是用 Java 编写的。引擎和 GUI 通常由具有不同技能的完全不同的程序员团队编写。

有用于通信的标准协议,例如Universal Chess Interface,也称为 UCI。如果您采用此标准,您可以编写自己的 GUI 并将其与现有引擎一起使用。然后,如果您稍后编写自己的引擎来实现 UCI 协议,您只需更改 GUI 中的设置即可使用您的引擎。

正如在实施 UCI 标准的 cmets 中提到的,对于您的第一个项目来说可能有点多。不过,我希望了解它在现实世界中是如何完成的,可以为您选择的任何设计提供一些灵感。

【讨论】:

  • 对不起,如果我不赞成,你是完全正确的,但由于这是他的第一个项目,我只会给他一些基本的建议,让他按照自己的意愿创作游戏。作为第一个项目,我认为实现 UCI 协议并使用特定语言来完成这项任务并不是很有趣。
  • 这确实说明了一个重要的观点,即业务逻辑和视图应该如此分离,以至于它们甚至不需要在同一个流程中,或者就这一点而言,它们不需要使用相同的语言。投赞成票。
  • @tronbabylove:谢谢。 :) 还要感谢 Dalmas 的富有洞察力的评论 - 我已经稍微更新了我的答案,但我同意这个答案可能只会在他完成项目 v1 并开始 v2 或 v3 之后对 OP 有用(如果他曾经得到这么远)。
  • 我想我有点理解UCI是什么。它是一种已经存在的 AI 程序,而我所写的只是访问 UCI 的 GUI 吗?截至目前,我只是在编写游戏并使其工作。但在那之后,如果我继续喜欢这个项目,我会调查它。除了为课堂制作树木和其他东西外,我几乎没有经验,但我的主要兴趣是人工智能,所以我会在以后添加书签。谢谢:)
  • @Soulzityr:UCI 是一种几乎所有现代国际象棋引擎都支持的协议(即通信系统)。它是一个基于文本的界面。您可以在this document 的末尾看到发送和接收的文本示例。使用 UCI 意味着您无需调用类上的方法,而是向进程发送文本消息。这样做的好处是,如果您只想编写一个引擎,而不是自己实现整个 GUI,您可以实现 UCI 协议,然后现有的 GUI 将能够使用您的引擎。
【解决方案2】:

这是一个模糊的“问题”,但这里有几个初步的指针:

  • 阅读Model-view-controller pattern(是的,业务逻辑将在模型中,GUI 将是视图。)

  • 尝试使用GridLayout

  • 在您的单元格中使用JLabels 或JButtons

    • 它们可以轻松显示图像
    • 您可以将它们的背景设置为黑色或白色,并且
    • 您可以轻松地监听它们的点击。

【讨论】:

  • 感谢您的建议。抱歉,是的,我知道这很模糊,因为我仍在计划一切,只是编写一些随机的东西来感受我想做的事情。我在这里问这个是因为在计划时我意识到我根本不知道我打算如何做 GUI。但我现在要阅读所有这些东西。非常感谢:)
【解决方案3】:

总之,是的。业务逻辑和表示应该是分开的。阅读MVC。祝你好运。

编辑:阅读MVP 可能也是一个好主意。不过要带走的要点是您的应用程序逻辑应该与显示分离。对于刚接触编程的人来说,这听起来像是一个雄心勃勃的项目 - 希望这对您来说是一次很棒的学习体验。

【讨论】:

  • 谢谢 :) 我希望能学到很多东西,并在我从这个项目中学到更多之后,对一个更有意义的项目产生想法。我刚刚打开了这些链接,很快就会阅读它们。感谢您的快速反应。 :)
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多