一个单独的GUI类将如何与逻辑类通信



我正在尝试设计一个有多个类的井字游戏。一个类是GUI类,它显示了9个按钮来表示井字板的9个区域。另一个类是我的驾驶员类,用于设置游戏。其他类是游戏背后的逻辑(棋盘、移动)。但是,我不知道如何让GUI类和逻辑类相互交互。

我不希望GUI类直接访问板,但我不知道我应该如何来回传递信息。例如,如果我点击了一个按钮,按钮的文本应该更新以反映标记(X或O),但如果不检查轮到谁以及信息位于Board类中,我不知道该将文本更改为什么标记。按下按钮还应该让董事会知道有哪些可用空间,以及玩家已经进行了回合。

我正试图让Board类具有访问器方法,这样GUI就可以找到如何正确更新自己,但我完全不知道如何在GUI类中调用这些方法。

我认为您误解了模型视图控制器背后的概念。在某个时刻,组件将不得不相互交互,因为它们必须在它们之间传递信息。重点是将交互与结果的实现解耦

换言之,视图应该有一些标准接口,让模型/控制器通知它需要更新,而模型/控制器应该有一些视图用来通知它用户输入的标准接口,但两者都不应该关心对方如何处理这些事件。理论上,一个完美的MVC实现可以让你为一个完全不同的实现切换任何一个组件,只要它坚持在同一个接口上,一切都会完全按照预期工作。

在你的情况下,我会设计一个游戏引擎类,它有一个这样的方法:

int makeMove(row, column)

其中,rowcolumn是棋盘上的坐标,返回的int代表玩家(X=0,O=1或类似。你甚至可以使用enum来更明确地"),这样GUI就可以用该玩家的图标更新相应的正方形。

游戏引擎会期望视图至少有以下两种方法:

void setPlayerTurn(int player)

哪个告诉GUI它应该更新它所在的显示器(与上面的player相同)

void setPlayerWon(int player, rows, columns)

哪个告诉GUI玩家获胜,并且它应该更新用rowscolumns标识的三个方块作为使玩家获胜的方块,并且player是与上面相同的玩家编号,以便它可以显示适当的状态消息。

游戏逻辑,包括跟踪棋盘的状态和轮到谁,可以全部包含在游戏类中,GUI所做的一切都是将信息从用户传递到游戏,以及从游戏传递到用户。理论上,您可以用一个完全不同的实现来交换任何一个组件,该实现遵循这些接口,并且仍然可以按预期进行游戏。

因此,GUI(视图)最终引用了Game Logic(模型),反之亦然。但它们只是通过一个非常狭窄和普遍的界面相互作用。双方都不知道也不关心对方如何处理通过该接口传递的信息。

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

话虽如此,你可以看到,通过让GUI简单地公开方法,让你设置网格上任意正方形的状态(文本和图标),并显示状态消息,就不需要更多的时间来进一步解耦这些。它将期望得到一个控制器,该控制器提供了一种方法来通知用户与网格上的哪个正方形进行交互。然后,控制器将在通用的"带状态消息的网格"视图和游戏逻辑模型之间提供粘合接口,游戏逻辑模型期望有我上面描述的接口。

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

您可以使它们成为静态字段,并通过ClassType.getVariable()访问它们

例如:

public class Board
{
    private static char currentPlayer = 'X';
    public static char getCurrentPlayer()
    {
        return currentPlayer;
    }
}

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

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

代码看起来像这个

import Logicclassname
public guiclass{
Logicclassname logic=new logicclassname();
}
public void updatefield(){
logic.functiontoexecute();
/* rest of code*/
}

相关内容

  • 没有找到相关文章

最新更新