单独的GUI类如何与逻辑类通信?

时间:2014-04-27 01:00:32

标签: java user-interface model-view-controller

我正在尝试设计一个有多个课程的tic tac toe游戏。一个类是GUI类,它显示9个按钮来表示tic tac toe board的9个区域。另一个类是我的驱动程序类来设置游戏。其他类是游戏背后的逻辑(棋盘,移动)。但是,我不确定如何让GUI类和逻辑类相互交互。

我不希望GUI类直接访问该板,但我不知道我应该如何来回传递信息。例如,如果我点击一个按钮,按钮的文本应该更新以反映标记(X或O),但我不知道要将文本更改为什么标记而不检查轮到它的那个和那个信息位于Board类中。按下按钮还应该让董事会知道可用的空间以及玩家转弯的情况。

我试图让Board类具有访问器方法,因此GUI可以弄清楚如何正确地更新自己,但我完全不知道如何在GUI类中调用这些方法。

3 个答案:

答案 0 :(得分:2)

我认为你误解了Model-View-Controller背后的概念。在某些时候,组件必须彼此交互,因为它们必须在它们之间传递信息。关键是将交互与结果的实现分离。

换句话说,视图应该有一些标准接口,让模型/控制器通知它需要更新,模型/控制器应该有一些标准接口,视图用来告知用户输入,但是不应该关心对方如何处理这些事件。从理论上讲,一个完美的MVC实现可以让你切换出任何一个组件,只要它停留在同一个接口上就可以完全不同的实现了。

在你的情况下,我会设计一些游戏引擎类,其中包含如下方法:

int makeMove(row, column)

其中rowcolumn是棋盘上的坐标,返回的int代表玩家(X = 0,O = 1或类似。你甚至可以使用{{ 1}}更明确``)轮到它,以便GUI可以用该玩家的图标更新相应的方格。

游戏引擎会希望视图至少包含以下两种方法:

enum

告诉GUI它应该更新显示的显示(与上面void setPlayerTurn(int player) 相同)

player

告诉GUI玩家获胜,并且它应该更新用void setPlayerWon(int player, rows, columns) rows标识的三个方格作为让玩家获胜的方格,columns是与上面相同的玩家编号,以便它可以显示相应的状态消息。

游戏逻辑,包括跟踪棋盘的状态以及轮到它的所有内容都可以自包含在游戏类中,并且所有GUI正在做的是将信息从用户传递到游戏,以及从游戏中传递信息给用户。从理论上讲,你可以将这两个组件换成一个完全不同的实现,这些实现遵循这些接口,并且仍然可以按预期玩游戏。

因此,GUI(视图)最终会引用游戏逻辑(模型),反之亦然。但它们只是通过一个非常狭窄和通用的界面相互作用。它们都不知道或关心对方通过该接口传递的信息。

请注意,在这个简化的示例中,我将控制器与视图结合起来,这在您设计单用途GUI时非常常见。从本质上讲,GUI的设计使它只能用作Tic Tac Toe板,但它希望您提供自己的一套规则(模型)。

话虽如此,您可以看到如何通过使GUI简单地公开允许您在网格上设置任意方块的状态(文本和图标)的方法来进一步解耦这些内容,以及如何进行更多操作,以及显示状态消息。期望给出一个控制器,该控制器提供一种方法来通知用户与之交互的网格上的哪个方格。然后,控制器将提供胶水,以便在通用的“网格与状态消息”视图和游戏逻辑模型之间进行接口,该模型需要我上面描述的接口。

在这种情况下,GUI(视图)获取对Controller的引用,反之亦然,然后Controller获取对游戏逻辑(模型)的引用,反之亦然。

答案 1 :(得分:0)

您可以导入逻辑类,然后在GUI中创建该类的实例,然后您就可以访问该类中的所有方法。

代码看起来像这样

import Logicclassname
public guiclass{
Logicclassname logic=new logicclassname();
}

public void updatefield(){
logic.functiontoexecute();
/* rest of code*/
}

答案 2 :(得分:0)

你可以使它们成为静态字段并通过ClassType.getVariable()

访问它们

例如:

public class Board
{
    private static char currentPlayer = 'X';

    public static char getCurrentPlayer()
    {
        return currentPlayer;
    }
}

在GUI类中使用Board.getCurrentPlayer();